您现在的位置是:首页 > 数码 > 

百度地图开发(二)之添加覆盖物 地理编码和反地理编码

2025-07-17 12:26:13
百度地图开发(二)之添加覆盖物 地理编码和反地理编码 转载请注明出处:  之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示。 详见: Android百度地图开发(一)之初体验 下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码。 添加覆盖物 在地图上添加覆盖物

百度地图开发(二)之添加覆盖物 地理编码和反地理编码

转载请注明出处: 

之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示。

详见: Android百度地图开发(一)之初体验

下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码。

添加覆盖物

在地图上添加覆盖物,一般需要以下几个步骤:

1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物)。

2. 构造OverlayOpti(地图覆盖物选型基类)。

. 在地图上添加覆盖物。

4. 添加相应的监听事件。

在API中可以看到,BaiDuMap类中有一个方法:

这个方法就是用来在地图上添加覆盖物的。此方法需要一个OverlayOpti参数。

进而查看这个类。从API中可以看到这是个抽象类,实例化它就必须用它的子类。api中已经把它的所有子类列出来了,分别是:ArcOpti(弧线形覆盖物选型类)、CircleOpti(圆形覆盖物选型类)、DotOpti(圆点覆盖物选型类)、GroundOverlayOpti(地形图图层选型类)、MarkerOpti(标注覆盖物选型类)、PolygonOpti(多边形选型类)、PolylineOpti(折线选型类)、TextOpti(文本选型类)。

MarkerOpti--标注覆盖物。

查看一下API,只需关注返回值是MarkerOpti的方法即可。

此时很简单就可以构造出一个MarkerOpti对象了。此时需要注意的是: 必须添加图标 ,不然会报错!

添加图标的话,就可以使用icon(BitmapDescriptor icon)这个方法:

BitmapDescriptor是一个bitmap描述信息类。但是在api中没有看到任何关于构造这个类的方法,只有一个回收对象的方法recycle()。其实在android中,提到bitmap,一般都会跟一个 “xxxFactory” 工厂类联系到一起。所以才想百度api中也会有一个关于构造BitmapDescriptor的工厂类。果不其然,看到了一个 BitmapDescriptorFactory 这个类。     

这个类中包括了很多构造bitmap描述信息类的静态方法:

OK,有了这一步,就可以构造出一个BitmapDescriptor对象了,进而对marker添加一个图片。

// 定义marker坐标点LatLng point = new LatLng(latitude, longitude);// 构建markerOption,用于在地图上添加markerOverlayOpti opti = new MarkerOpti()//.position(point)// 设置marker的位置.icon(bitmap)// 设置marker的图标.zIndex(9)// 設置marker的所在層級.draggable(true);// 设置手势拖拽// 在地图上添加marker,并显示marker1 = (Marker) bdMap.addOverlay(opti);

接下来对marker添加监听事件。一开始我猜想,应该是MarkerOpti这个类中有一个 “setOnxxx” 这种形式的方法来绑定事件,但是没有到。最后还是在BaiDuMap这个类下面到了两个静态的接口。

先看一下点击事件。onMarkerClickListener接口中只有一个函数:

此时就需要你添加overlay的返回值(marker)了。实际上BaiDuMap的添加覆盖物的方法addOverlay(OverlayOpti opti)的返回值是Overlay。而Overlay恰好是一个好抽象类。

它的子类分别是Arc、Circle、Dot、GroundOverlay、Marker、Polygon、Polyline、Text。

正好与verlayOption的子类一一对应。

下面是点击事件的代码:

bdMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublicboolean onMapPoiClick(MapPoi arg0) {
returnfalse;
}@Overridepublicvoid onMapClick(LatLng latLng) {
displayInfoWindow(latLng);
}
});

此时有一个问题,我得到了LatLng地理坐标这个对象了,怎么得到正常的地理信息呢(xx省xx市)?不要着急,慢慢往后看, 反地理编码 会解决这个问题的!

下面看一下,  拖拽事件

(onMarkerDragListener):

这三个方法有点类似于onTouch方法(按下,拖动,抬起)。

bdMap.setOnMarkerDragListener(new OnMarkerDragListener() {
@Overridepublicvoid onMarkerDragStart(Marker arg0) {}@Overridepublicvoid onMarkerDragEnd(Marker arg0) {
(
MainActivity.this,
拖拽结束,新位置:  arg0.getPosition().latitude  ,  arg0.getPosition().longitude,
Toast.LEGTH_LOG).show();
reverseGeoCode(arg0.getPosition());
}@Overridepublicvoid onMarkerDrag(Marker arg0) {}
});

此时需要注意:拖拽事件,需要长按才能响应。

PolygonOpti(多边形覆盖)

继续查看API,查看这个类中的返回值是PolygonOpti的方法:

设置多边形覆盖物,当然需要多个地图上的点了。正好有一个points(List<LatLng> points)的方法用于设置多边形坐标点列表。OK,此时构造出一个PolygonOpti就不难了。

LatLng pt1 = new LatLng(latitude  0.02, longitude);
LatLng pt2 = new LatLng(latitude, longitude - 0.0);
LatLng pt = new LatLng(latitude - 0.02, longitude - 0.01);
LatLng pt4 = new LatLng(latitude - 0.02, longitude  0.01);
LatLng pt5 = new LatLng(latitude, longitude  0.0);
List<LatLng> points = new ArrayList<LatLng>();
points.add(pt1);
points.add(pt2);
points.add(pt);
points.add(pt4);
points.add(pt5);
//PolygonOpti polygonOpti = new PolygonOpti();
polygonOpti.points(points);
polygonOpti.fillColor(0xAAFFFF00);
polygonOpti.stroke(new Stroke(2, 0xAA00FF00));
Overlay polygon = bdMap.addOverlay(polygonOpti);
TextOpti(文字覆盖物)

设置文字覆盖物的时候,需要注意文字的颜,字体大小,位置等属性:

LatLng latLng = new LatLng(latitude, longitude);
TextOpti textOpti = new TextOpti();
textOpti.bgColor(0xAAFFFF00)  //設置文字覆蓋物背景顏    	.fontSize(28)  //设置字体大小    	.fontColor(0xFFFF00FF)// 设置字体颜    	.text(我在这里啊!!!!)  //文字内容    	.rotate(-0)  //设置文字的旋转角度    	.position(latLng);// 设置位置bdMap.addOverlay(textOpti);
GroundOverlay(地形图图层覆盖物)

地形图图层可以跟随地图进行平移,伸缩等变换,位于底图和标注图层之家,不会遮挡地图标注的信息。定义这个覆盖物的时候,需要指定宽高。这里百度API提供了两种方法:

1. 指定一个地理坐标(LatLng),在用dimensi方法来指定宽度和高度。

2. 使用positionFromBounds(LagLngBounds bounds)方法。LatLngBounds方法表示一个地理范围,包括一个东北角坐标和一个西南角坐标,这样也能确定一个矩形。 
在LatLng中有一个静态内部类Builder--地理范围构造器。

LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);//西南LatLng northeast = new LatLng(latitude  0.01, longitude  0.012);//东北LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)
.include(northeast).build();//得到一个地理范围对象BitmapDescriptor bitmap2 = BitmapDescriptorFactory
.fromResource(R._blog);
GroundOverlayOpti groundOverlayOpti = new GroundOverlayOpti();
groundOverlayOpti.image(bitmap2);//显示的图片groundOverlayOpti.positionFromBounds(bounds);//显示的位置(0.7f);//显示的透明度bdMap.addOverlay(groundOverlayOpti);
PolylineOpti(折线覆盖物)

添加折线与添加多边形的方法大致相同。这里就不多赘述了。 

CircleOpti circleOpti = new CircleOpti();
(new LatLng(latitude, longitude));//设置圆心坐标circleOpti.fillColor(0XFFfaa755);//圆的填充颜circleOpti.radius(150);//设置半径circleOpti.stroke(new Stroke(5, 0xAA00FF00));//设置边框bdMap.addOverlay(circleOpti);
DotOpti(圆点覆盖物)
DotOpti dotOpti = new DotOpti();
(new LatLng(latitude, longitude));//设置圆心坐标(0XFFfaa755);//颜dotOpti.radius(25);//设置半径bdMap.addOverlay(dotOpti);
CircleOpti(圆形(空心)覆盖物)
CircleOpti circleOpti = new CircleOpti();
(new LatLng(latitude, longitude));//设置圆心坐标circleOpti.fillColor(0XFFfaa755);//圆的填充颜circleOpti.radius(150);//设置半径circleOpti.stroke(new Stroke(5, 0xAA00FF00));//设置边框bdMap.addOverlay(circleOpti);
ArcOpti(弧线覆盖物)
LatLng pt1 = new LatLng(latitude, longitude - 0.01);
LatLng pt2 = new LatLng(latitude - 0.01, longitude - 0.01);
LatLng pt = new LatLng(latitude, longitude  0.01);
ArcOpti arcOpti = new ArcOpti();
arcOpti.points(pt1, pt2, pt);//设置弧线的起点、中点、终点坐标arcOpti.width(5);//线宽(0xFF000000);
bdMap.addOverlay(arcOpti);

弹出窗覆盖物

在百度地图上可以添加一种可以弹出的覆盖物,弹出的窗口布局可以自定义。

API中说的很清楚,第二个构造函数,只能做显示用,没有响应事件。通过第一个构造方法,可以添加点击事件。

/**
 * 显示弹出窗口覆盖物
 */privatevoid displayInfoWindow(final LatLng latLng) {
// 创建infowindow展示的viewButton btn = new Button(getApplicationContext());
btn.setBackgroundResource(R.drawable.popup);
btn.setText(点我点我~);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
.fromView(btn);
// infowindow点击事件OnInfoWindowClickListener infoWindowClickListener = new OnInfoWindowClickListener() {
@Overridepublicvoid onInfoWindowClick() {
reverseGeoCode(latLng);
//隐藏InfoWindowbdMap.hideInfoWindow();
}
};
// 创建infowindowInfoWindow infoWindow = new InfoWindow(bitmapDescriptor, latLng, -47,
infoWindowClickListener);// 显示InfoWindowbdMap.showInfoWindow(infoWindow);
}

地理编码与反地理编码

地理编码指的是将地理信息转化成坐标关系的过程。分为正向的和反向的编码。

正向的就是指将地址信息转成坐标点的过程。比如:北京市天安门--> (12.2111, 12.221)(我瞎写的)。反地理编码就是将地理坐标转换成具体的地址信息,通过百度的坐标定位引擎,插叙出坐标对应的物体所在的行政区划、街道等信息。

所以我们,在地图上点击的时候,或者拖动marker的时候得到的LatLng对象,就可以通过反地理编码得到具体的地址了。

实现起来也比较简单:

// 创建地理编码检索实例GeoCoder geoCoder = ();
//OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
// 反地理编码查询结果回调函数@Overridepublicvoid onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null||  != SearchResult.ERRORO.O_ERROR) {
// 没有检测到结果(MainActivity.this, 抱歉,未能到结果,
Toast.LEGTH_LOG).show();
}
(MainActivity.this,
位置:  result.getAddress(), Toast.LEGTH_LOG)
.show();
}// 地理编码查询结果回调函数@Overridepublicvoid onGetGeoCodeResult(GeoCodeResult result) {
if (result == null||  != SearchResult.ERRORO.O_ERROR) {
// 没有检测到结果}
}
};
// 设置地理编码检索监听者geoCoder.setOnGetGeoCodeResultListener(listener);
//geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
// 释放地理编码检索实例// geoCoder.destroy();

demo下载:

地址: 


#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/819959.html

相关标签:无
上传时间: 2024-01-25 09:44:20
留言与评论(共有 17 条评论)
本站网友 时时乐
5分钟前 发表
正好有一个points(List<LatLng> points)的方法用于设置多边形坐标点列表
本站网友 voyage
28分钟前 发表
longitude);// 构建markerOption,用于在地图上添加markerOverlayOpti opti = new MarkerOpti()//.position(point)// 设置marker的位置.icon(bitmap)// 设置marker的图标.zIndex(9)// 設置marker的所在層級.draggable(true);// 设置手势拖拽// 在地图上添加marker,并显示marker1 = (Marker) bdMap.addOverlay(opti); 接下来对marker添加监听事件
本站网友 郑州客运段
26分钟前 发表
      这个类中包括了很多构造bitmap描述信息类的静态方法: OK,有了这一步,就可以构造出一个BitmapDescriptor对象了,进而对marker添加一个图片
本站网友 男性生殖医院
13分钟前 发表
longitude  0.0); List<LatLng> points = new ArrayList<LatLng>(); points.add(pt1); points.add(pt2); points.add(pt); points.add(pt4); points.add(pt5); //PolygonOpti polygonOpti = new PolygonOpti(); polygonOpti.points(points); polygonOpti.fillColor(0xAAFFFF00); polygonOpti.stroke(new Stroke(2
本站网友 dnf稳定外挂
8分钟前 发表
此时需要注意的是: 必须添加图标 ,不然会报错! 添加图标的话,就可以使用icon(BitmapDescriptor icon)这个方法: BitmapDescriptor是一个bitmap描述信息类
本站网友 塞西
20分钟前 发表
longitude); TextOpti textOpti = new TextOpti(); textOpti.bgColor(0xAAFFFF00) //設置文字覆蓋物背景顏 .fontSize(28) //设置字体大小 .fontColor(0xFFFF00FF)// 设置字体颜 .text(我在这里啊!!!!) //文字内容 .rotate(-0) //设置文字的旋转角度 .position(latLng);// 设置位置bdMap.addOverlay(textOpti); GroundOverlay(地形图图层覆盖物) 地形图图层可以跟随地图进行平移,伸缩等变换,位于底图和标注图层之家,不会遮挡地图标注的信息
本站网友 肾亏的表现
0秒前 发表
longitude - 0.012);//西南LatLng northeast = new LatLng(latitude  0.01
本站网友 四会二手房网
3分钟前 发表
Toast.LEGTH_LOG).show(); } (MainActivity.this
本站网友 南京做人流医院
5分钟前 发表
longitude - 0.01); LatLng pt2 = new LatLng(latitude - 0.01
本站网友 最新网上赚钱
22分钟前 发表
抱歉,未能到结果
本站网友 铯137
28分钟前 发表
它的子类分别是Arc
本站网友 楼宇
12分钟前 发表
0xAA00FF00)); Overlay polygon = bdMap.addOverlay(polygonOpti); TextOpti(文字覆盖物) 设置文字覆盖物的时候,需要注意文字的颜,字体大小,位置等属性: LatLng latLng = new LatLng(latitude
本站网友 上海市城市总体规划
11分钟前 发表
longitude  0.01); ArcOpti arcOpti = new ArcOpti(); arcOpti.points(pt1
本站网友 男人壮阳食物
16分钟前 发表
百度地图开发(二)之添加覆盖物 地理编码和反地理编码 转载请注明出处:  之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示
本站网友 mpa是什么
27分钟前 发表
先看一下点击事件
本站网友 美白祛斑面膜怎么做
15分钟前 发表
  CircleOpti circleOpti = new CircleOpti(); (new LatLng(latitude