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

添加覆盖物

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

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

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

3. 在地图上添加覆盖物。

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

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

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

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

MarkerOptions--标注覆盖物。

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

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

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

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

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

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

  1. // 定义marker坐标点
  2. LatLng point = new LatLng(latitude, longitude);
  3. // 构建markerOption,用于在地图上添加marker
  4. OverlayOptions options = new MarkerOptions()//
  5. .position(point)// 设置marker的位置
  6. .icon(bitmap)// 设置marker的图标
  7. .zIndex(9)// 設置marker的所在層級
  8. .draggable(true);// 设置手势拖拽
  9. // 在地图上添加marker,并显示
  10. marker1 = (Marker) bdMap.addOverlay(options);

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

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

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

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

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

下面是点击事件的代码:

  1. bdMap.setOnMapClickListener(new OnMapClickListener() {
  2. @Override
  3. public boolean onMapPoiClick(MapPoi arg0) {
  4. return false;
  5. }
  6. @Override
  7. public void onMapClick(LatLng latLng) {
  8. displayInfoWindow(latLng);
  9. }
  10. });

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

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

  1. bdMap.setOnMarkerDragListener(new OnMarkerDragListener() {
  2. @Override
  3. public void onMarkerDragStart(Marker arg0) {
  4. }
  5. @Override
  6. public void onMarkerDragEnd(Marker arg0) {
  7. Toast.makeText(
  8. MainActivity.this,
  9. "拖拽结束,新位置:" + arg0.getPosition().latitude + ", "
  10. + arg0.getPosition().longitude,
  11. Toast.LENGTH_LONG).show();
  12. reverseGeoCode(arg0.getPosition());
  13. }
  14. @Override
  15. public void onMarkerDrag(Marker arg0) {
  16. }
  17. });

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

PolygonOptions(多边形覆盖)

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


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

  1. LatLng pt1 = new LatLng(latitude + 0.02, longitude);
  2. LatLng pt2 = new LatLng(latitude, longitude - 0.03);
  3. LatLng pt3 = new LatLng(latitude - 0.02, longitude - 0.01);
  4. LatLng pt4 = new LatLng(latitude - 0.02, longitude + 0.01);
  5. LatLng pt5 = new LatLng(latitude, longitude + 0.03);
  6. List<LatLng> points = new ArrayList<LatLng>();
  7. points.add(pt1);
  8. points.add(pt2);
  9. points.add(pt3);
  10. points.add(pt4);
  11. points.add(pt5);
  12. //
  13. PolygonOptions polygonOptions = new PolygonOptions();
  14. polygonOptions.points(points);
  15. polygonOptions.fillColor(0xAAFFFF00);
  16. polygonOptions.stroke(new Stroke(2, 0xAA00FF00));
  17. Overlay polygon = bdMap.addOverlay(polygonOptions);

TextOptions(文字覆盖物)

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

  1. LatLng latLng = new LatLng(latitude, longitude);
  2. TextOptions textOptions = new TextOptions();
  3. textOptions.bgColor(0xAAFFFF00)  //設置文字覆蓋物背景顏色
  4. .fontSize(28)  //设置字体大小
  5. .fontColor(0xFFFF00FF)// 设置字体颜色
  6. .text("我在这里啊!!!!")  //文字内容
  7. .rotate(-30)  //设置文字的旋转角度
  8. .position(latLng);// 设置位置
  9. bdMap.addOverlay(textOptions);

GroundOverlay(地形图图层覆盖物)

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

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

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

  1. LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);//西南
  2. LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);//东北
  3. LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)
  4. .include(northeast).build();//得到一个地理范围对象
  5. BitmapDescriptor bitmap2 = BitmapDescriptorFactory
  6. .fromResource(R.drawable.csdn_blog);
  7. GroundOverlayOptions groundOverlayOptions = new GroundOverlayOptions();
  8. groundOverlayOptions.image(bitmap2);//显示的图片
  9. groundOverlayOptions.positionFromBounds(bounds);//显示的位置
  10. groundOverlayOptions.transparency(0.7f);//显示的透明度
  11. bdMap.addOverlay(groundOverlayOptions);

PolylineOptions(折线覆盖物)

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

  1. CircleOptions circleOptions = new CircleOptions();
  2. circleOptions.center(new LatLng(latitude, longitude));//设置圆心坐标
  3. circleOptions.fillColor(0XFFfaa755);//圆的填充颜色
  4. circleOptions.radius(150);//设置半径
  5. circleOptions.stroke(new Stroke(5, 0xAA00FF00));//设置边框
  6. bdMap.addOverlay(circleOptions);

DotOptions(圆点覆盖物)

  1. DotOptions dotOptions = new DotOptions();
  2. dotOptions.center(new LatLng(latitude, longitude));//设置圆心坐标
  3. dotOptions.color(0XFFfaa755);//颜色
  4. dotOptions.radius(25);//设置半径
  5. bdMap.addOverlay(dotOptions);

CircleOptions(圆形(空心)覆盖物)

  1. CircleOptions circleOptions = new CircleOptions();
  2. circleOptions.center(new LatLng(latitude, longitude));//设置圆心坐标
  3. circleOptions.fillColor(0XFFfaa755);//圆的填充颜色
  4. circleOptions.radius(150);//设置半径
  5. circleOptions.stroke(new Stroke(5, 0xAA00FF00));//设置边框
  6. bdMap.addOverlay(circleOptions);

ArcOptions(弧线覆盖物)

  1. LatLng pt1 = new LatLng(latitude, longitude - 0.01);
  2. LatLng pt2 = new LatLng(latitude - 0.01, longitude - 0.01);
  3. LatLng pt3 = new LatLng(latitude, longitude + 0.01);
  4. ArcOptions arcOptions = new ArcOptions();
  5. arcOptions.points(pt1, pt2, pt3);//设置弧线的起点、中点、终点坐标
  6. arcOptions.width(5);//线宽
  7. arcOptions.color(0xFF000000);
  8. bdMap.addOverlay(arcOptions);

弹出窗覆盖物

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

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

  1. /**
  2. * 显示弹出窗口覆盖物
  3. */
  4. private void displayInfoWindow(final LatLng latLng) {
  5. // 创建infowindow展示的view
  6. Button btn = new Button(getApplicationContext());
  7. btn.setBackgroundResource(R.drawable.popup);
  8. btn.setText("点我点我~");
  9. BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
  10. .fromView(btn);
  11. // infowindow点击事件
  12. OnInfoWindowClickListener infoWindowClickListener = new OnInfoWindowClickListener() {
  13. @Override
  14. public void onInfoWindowClick() {
  15. reverseGeoCode(latLng);
  16. //隐藏InfoWindow
  17. bdMap.hideInfoWindow();
  18. }
  19. };
  20. // 创建infowindow
  21. InfoWindow infoWindow = new InfoWindow(bitmapDescriptor, latLng, -47,
  22. infoWindowClickListener);
  23. // 显示InfoWindow
  24. bdMap.showInfoWindow(infoWindow);
  25. }

地理编码与反地理编码

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

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

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

实现起来也比较简单:

  1. // 创建地理编码检索实例
  2. GeoCoder geoCoder = GeoCoder.newInstance();
  3. //
  4. OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
  5. // 反地理编码查询结果回调函数
  6. @Override
  7. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
  8. if (result == null
  9. || result.error != SearchResult.ERRORNO.NO_ERROR) {
  10. // 没有检测到结果
  11. Toast.makeText(MainActivity.this, "抱歉,未能找到结果",
  12. Toast.LENGTH_LONG).show();
  13. }
  14. Toast.makeText(MainActivity.this,
  15. "位置:" + result.getAddress(), Toast.LENGTH_LONG)
  16. .show();
  17. }
  18. // 地理编码查询结果回调函数
  19. @Override
  20. public void onGetGeoCodeResult(GeoCodeResult result) {
  21. if (result == null
  22. || result.error != SearchResult.ERRORNO.NO_ERROR) {
  23. // 没有检测到结果
  24. }
  25. }
  26. };
  27. // 设置地理编码检索监听者
  28. geoCoder.setOnGetGeoCodeResultListener(listener);
  29. //
  30. geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
  31. // 释放地理编码检索实例
  32. // geoCoder.destroy();

demo下载:

地址:http://download.csdn.net/detail/crazy1235/8415513

Android百度地图开发02之添加覆盖物 + 地理编码和反地理编码的更多相关文章

  1. Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

      标签: Android百度地图API Key  分类: Android 百度地图开发(2)    最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...

  2. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  3. Android百度地图开发03之地图控制 + 定位

    前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码. 接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能. 百度地图提供的关于地图的操作主要有: ...

  4. Android 百度地图开发之一(Hello BaiDu Map)

    之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...

  5. [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

    一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...

  6. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

        近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...

  7. Android百度地图开发(二)地图覆盖物

    上一篇文章写道如何在一个mapview中简单的显示地图:本次学习一下如何在地图上添加一些覆盖物. 1.设置显示交通地图: // 显示交通地图 mapView.setTraffic(true); 2.设 ...

  8. Android百度地图开发(一)之初体验

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/42614603 做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需 ...

  9. Android百度地图开发01之初体验

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

随机推荐

  1. MVC Controller 链接到 API Controller 以及反向链接

    MVC Controller 链接到 API Controller 以及反向链接 问题 想创建一个从 ASP.NET MVC controller 到 ASP.NET Web API controll ...

  2. 在Mac中如何显示和隐藏文件

    1.显示Mac隐藏文件的命令: 在终端中输入"defaults write com.apple.finder AppleShowAllFiles YES":  鼠标单击窗口左上角 ...

  3. OpenCms 集成外部Solr Server

    OpenCms默认是以内嵌的Solr作为全文搜索服务的,不过我们也可以配置一个独立的Solr搜索服务器 设置外部Solr Server 1. 从Solr 官方站点http://lucene.apach ...

  4. Cash flow

    Today,we learn about the cash flow. Cash flow summary: 1.The cash flow identity:(现金恒等式) cash flow fr ...

  5. jquery如何删除一个元素后面的所有元素

    $("div>span:first").nextAll().remove()

  6. JS 学习笔记--3--数据类型

    1.typeof 操作符 用来获取变量或者字面量的类型,也可以typeof(x);但是typeof并非内置函 数,而是一个操作符变量2.JS 一共6种类型 Undefined/Null/Boolean ...

  7. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  8. 【BZOJ】【1048】【HAOI2007】分割矩阵

    DP/记忆化搜索 暴力枚举分割方案?……大概是指数级的?大约是20!的方案= =? 但是我们看到a.b.n的范围都很小……所以不同的状态数只是$10^5$级别的,可以记忆化搜索求解 比较水的一道题…… ...

  9. 如何优化C语言代码(程序员必读)

    1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...

  10. .NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 (在IIS7.5中的设备办法)

    .NET4.0下网站应用法度用UrlRewriter.dll重写无后缀路径 在IIS中新建网站(端标语8111) 直接运行http://localhost:8111/ 设备办法: 二.添加通配符脚本映 ...