Android版本百度地图开发(五)——覆盖物

来源:互联网 发布:2016淘宝彩票是真的吗 编辑:程序博客网 时间:2024/05/18 02:10

还是觉得每章单独建立目录方便,从这章开始吧。


1 覆盖物

覆盖物是指叠加或覆盖到地图上的内容,覆盖物有自己的地理坐标,将根据地图的移动而移动。


百度地图支持多种类型的覆盖物:

  • 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标);
  • Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;
  • 路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上(起、终点图标用户可自定义);
  • 公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上(起、终点图标用户可自定义);
  • 自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标(支持动态更新Item位置、图标);
  • 弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口;
  • 几何图形绘制图层(GraphicsOverlay):用于绘制点、线、圆、矩形、多边形等几何图形的图层;
  • 文字绘制图层(TextOverlay):用于绘制文字的图层。
  • 图片图层(GroundOverlay):用于展示用户传入图片的图层。

其中PoiOverlay、RouteOverlay等我们在之前已经接触过,下面详细描述。

MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh() 使更新生效。


1.1 我的位置图层

将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针。具体代码如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. MyLocationOverlay myLocationOverlay = new MyLocationOverlay(  
  2.         mMapView);  
  3. LocationData locData = new LocationData();  
  4.   
  5. // 此处模拟位置,可用实际位置替代  
  6. locData.latitude = 31.209294;  
  7. locData.longitude = 121.472471;  
  8. locData.direction = 300.0f;  
  9. myLocationOverlay.setData(locData);  
  10. mMapView.getOverlays().add(myLocationOverlay);  
  11. mMapView.refresh();  
  12. mMapView.getController().animateTo(  
  13.         new GeoPoint((int) (locData.latitude * 1e6),  
  14.                 (int) (locData.longitude * 1e6)));  


1.2 Poi搜索图层(PoiOverlay)

Poi搜索图层的使用可以参照之前的文章:地图检索。


1.3 路线图层(RouteOverlay)

路线图层的使用可以参照之前的文章:路线规划。


1.4 公交换乘图层(TransitOverlay)

请参照路线规划中的公交搜索部分。


1.5 自定义图层(ItemizedOverlay)

2.0.0以前的SDK中是可以直接继承Overlay来实现自定义图层的,但新版的SDK中我们只能通过集成ItemizedOverlay来实现自定义图层功能了。

下面的代码演示了添加自定义图层的功能,百度的这个例子非常好。不过在我的测试手机上很奇怪没能显示title和snippet。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 准备要添加的Overlay  
  2.                 double mLat1 = 39.90923;  
  3.                 double mLon1 = 116.397428;  
  4.                 double mLat2 = 39.9022;  
  5.                 double mLon2 = 116.3922;  
  6.                 double mLat3 = 39.917723;  
  7.                 double mLon3 = 116.3722;  
  8.                 // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)  
  9.                 GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  
  10.                 GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));  
  11.                 GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));  
  12.                 // 准备overlay图像数据,根据实情情况修复  
  13.                 Drawable mark= getResources().getDrawable(R.drawable.loc);  
  14.                 mark.setBounds(00, mark.getIntrinsicWidth(), mark.getIntrinsicHeight());  
  15.                 // OverlayItem(GeoPoint point, java.lang.String title, java.lang.String snippet)   
  16.                 OverlayItem item1 = new OverlayItem(p1,"title1","snippet1");  
  17.                 //使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置  
  18.                 OverlayItem item2 = new OverlayItem(p2,"item2","item2");  
  19.                 item2.setMarker(mark);  
  20.                   
  21.                 OverlayItem item3 = new OverlayItem(p3,"item3","item3");  
  22.                    
  23.                 //创建ItemizedOverlay  
  24.                 CustomOverlay itemOverlay = new CustomOverlay(mark, mMapView);  
  25.                 //将IteminizedOverlay添加到MapView中  
  26.                 mMapView.getOverlays().clear();  
  27.                 mMapView.getOverlays().add(itemOverlay);  
  28.                    
  29.                 //现在所有准备工作已准备好,使用以下方法管理overlay.  
  30.                 //添加overlay, 当批量添加Overlay时使用addItem(List<OverlayItem>)效率更高  
  31.                 itemOverlay.addItem(item1);  
  32.                 itemOverlay.addItem(item2);  
  33.                 itemOverlay.addItem(item3);  
  34.                 mMapView.refresh();  


CustomOverlay.java代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class CustomOverlay extends ItemizedOverlay<OverlayItem> {  
  2.   
  3.     public CustomOverlay(Drawable mark,MapView mapView) {  
  4.         super(mark, mapView);  
  5.     }  
  6.   
  7.     @Override  
  8.     public boolean onTap(GeoPoint p, MapView mapView) {  
  9.         return super.onTap(p, mapView);  
  10.     }  
  11.   
  12.     /** 
  13.      * 覆盖这个方法去处理一个item上的点击事件。 这可能是对屏幕上item的触摸点击,或者对位于中心且已选定的item的跟踪球点击。默认情况下,什么都不做,返回false 
  14.      * 如果点击事件被处理,返回true;如果想要把这个事件传递给其它overlay,返回false 
  15.      */  
  16.     @Override  
  17.     protected boolean onTap(int index) {  
  18.         System.out.println("第" + index + "个点被点击");  
  19.         return super.onTap(index);  
  20.     }  
  21. }  


1.6 弹出窗口图层(PopupOverlay)

弹出窗口图层将在地图上显示一个三张图片组成的弹窗,点击三张图片将调用不同的事件处理方法。这里的例子比较简单,准备好图片资源和地理位置后,直接创建一个PopupOverlay对象后调用其showPopup方法即可。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 创建pop对象,注册点击事件监听接口  
  2.                 PopupOverlay pop = new PopupOverlay(mMapView,  
  3.                         new PopupClickListener() {  
  4.                             @Override  
  5.                             public void onClickedPopup(int index) {  
  6.                                 // 在此处理pop点击事件,index为点击区域索引,点击区域最多可有三个  
  7.                                 Toast.makeText(getApplicationContext(), "这是第" + (index + 1) + "个区域", Toast.LENGTH_SHORT).show();  
  8.                             }  
  9.                         });  
  10.                 /** 
  11.                  * 准备pop弹窗资源,根据实际情况更改 弹出包含三张图片的窗口,可以传入三张图片、两张图片、一张图片。 
  12.                  * 弹出的窗口,会根据图片的传入顺序,组合成一张图片显示. 点击到不同的图片上时,回调函数会返回当前点击到的图片索引index 
  13.                  */  
  14.                 Bitmap[] bmps = new Bitmap[3];  
  15.                 try {  
  16.                     bmps[0] = BitmapFactory.decodeStream(getAssets().open(  
  17.                             "01.png"));  
  18.                     bmps[1] = BitmapFactory.decodeStream(getAssets().open(  
  19.                             "02.png"));  
  20.                     bmps[2] = BitmapFactory.decodeStream(getAssets().open(  
  21.                             "03.jpg"));  
  22.                 } catch (IOException e) {  
  23.                     e.printStackTrace();  
  24.                 }  
  25.                 // 弹窗弹出位置  
  26.                 GeoPoint ptTAM = new GeoPoint((int) (39.915 * 1E6),  
  27.                         (int) (116.404 * 1E6));  
  28.                 // 弹出pop,隐藏pop  
  29.                 pop.showPopup(bmps, ptTAM, 32);  
  30.                 // 隐藏弹窗  
  31.                 // pop.hidePop();  

而SDK的2.3.0版本之后新增了一个直接popup一个view的方法,我们看看这个例子:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 创建pop对象,注册点击事件监听接口  
  2. PopupOverlay pop = new PopupOverlay(mMapView,  
  3.         new PopupClickListener() {  
  4.             @Override  
  5.             public void onClickedPopup(int index) {  
  6.                 Toast.makeText(getApplicationContext(), index, Toast.LENGTH_SHORT).show();  
  7.             }  
  8.         });  
  9.   
  10. // 弹窗弹出位置  
  11. GeoPoint ptTAM = new GeoPoint((int) (39.915 * 1E6),  
  12.         (int) (116.404 * 1E6));  
  13. LayoutInflater inflater = LayoutInflater.from(BaiduMapActivity.this);  
  14. View view = inflater.inflate(R.layout.activity_ui, null);  
  15. // 弹出pop,隐藏pop  
  16. pop.showPopup(view, ptTAM, 32);  
  17. // 隐藏弹窗  
  18. // pop.hidePop();  

这里能够明显看到,PopupClickListener已经完全没有作用,所以在PopupOverlay的构造函数中,PopupClickListener参数可以填null。


1.7 几何图形图层(GraphicsOverlay)

绘制几何图形图层的时候需要使用到下面的几个类:

  • Geometry:这是一个几何图形类,利用此类,可以构建待绘制的各种基本几何元素;简单的说,Geometry定义形状轮廓。
  • Symbol:样式类,如果只构建几何图形类而没有样式的话,该几何图形是无意义的;简单的说,Symbol用于定义画笔、画刷等元素;
  • Graphic:图形类,利用几何图形加上样式,这样就可以构建一个图形类,Graphic就是这样一个类,用于管理所添加的图形;简单的说,这是一个用来绘图的对象。
  • GraphicsOverlay:这是一个用于绘制图形的overlay,和其他的各种overlay用法相同。

例子仍然使用SDK自带的例子,我在这里重新梳理了注释,标识了逻辑顺序。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 移动,缩放地图中心点  
  2.                 mMapView.getController().setZoom(16);  
  3.                 // 中心点坐标  
  4.                 GeoPoint palaceCenter = new GeoPoint((int)(39.924 * 1E6),(int)(116.403 * 1E6));  
  5.                 mMapView.getController().setCenter(palaceCenter);  
  6.                   
  7.                 /** 第一步,创建轮廓对象Geometry */  
  8.                 //故宫左上角  
  9.                 GeoPoint geoPoint1 = new GeoPoint((int)(39.929 * 1E6),(int)(116.397 * 1E6));  
  10.                 //故宫右下角  
  11.                 GeoPoint geoPoint2 = new GeoPoint((int)(39.920 * 1E6),(int)(116.408 * 1E6));  
  12.                 //创建一个轮廓对象  
  13.                 Geometry palaceGeometry = new Geometry();  
  14.                 // 设置轮廓参数是矩形,还有setCircle/setPoint/setPolygon/setPolyline等方法设置轮廓  
  15.                 palaceGeometry.setEnvelope(geoPoint1, geoPoint2);  
  16.                   
  17.                 /** 第二步,创建用于外框及填充的Symbol对象 */  
  18.                 Symbol palaceSymbol = new Symbol();//创建样式  
  19.                 Symbol.Color palaceColor = palaceSymbol.new Color();//创建颜色  
  20.                 palaceColor.red = 0;//设置颜色的红色分量  
  21.                 palaceColor.green = 0;//设置颜色的绿色分量  
  22.                 palaceColor.blue = 255;//设置颜色的蓝色分量  
  23.                 palaceColor.alpha = 126;//设置颜色的alpha值  
  24.                 // 创建一个边框对象  
  25.                 // 参数 - 5: 边框的线宽  
  26.                 // 参数 - polygonSymbol.new Color(0xffff0000):边框的颜色  
  27.                 Stroke stroke = new Stroke(5, palaceSymbol.new Color(0xffff0000));  
  28.                 // public void setSurface(Symbol.Color color, int status, int linewidth, Symbol.Stroke stroke)  
  29.                 // 设置面样式  
  30.                 // color - 颜色  
  31.                 // status - 填充状态,0表示不填充,1表示填充  
  32.                 // linewidth - 线宽,当填充状态为填充时线宽无意义  
  33.                 // stroke - 边框  
  34.                 palaceSymbol.setSurface(palaceColor, 13, stroke);  
  35.                   
  36.                 /** 第三步,创建Graphic对象 */  
  37.                 Graphic palaceGraphic = new Graphic(palaceGeometry, palaceSymbol);  
  38.                   
  39.                 /** 第四步,创建一个GraphicsOverlay来装载故宫的Graphic */  
  40.                 GraphicsOverlay palaceOverlay = new GraphicsOverlay(mMapView);  
  41.                 // palaceId可以在后面用来移除该对象。 palaceOverlay.removeGraphic(long graphicID)  
  42.                 long palaceId = palaceOverlay.setData(palaceGraphic);  
  43.                 // 将overlay添加到mapview中  
  44.                 mMapView.getOverlays().add(palaceOverlay);  
  45.                 // 刷新地图使新添加的overlay生效  
  46.                 mMapView.refresh();  


1.8 文字绘制图层(TextOverlay)

文字图层基本上和图形差不多,注意文本对象(TextItem)创建时指定了文字大小,所以不会随地图缩放:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 注意Symbol是不可重用的,所以对应每一个Symbol.Color对象都需要创建一个Symbol对象。  
  2.                   
  3.                 // 创建文本颜色  
  4.                 Symbol textSymbol = new Symbol();    
  5.                 Symbol.Color textColor = textSymbol.new Color();    
  6.                 textColor.alpha = 255;    
  7.                 textColor.red = 0;    
  8.                 textColor.blue = 255;    
  9.                 textColor.green = 0;    
  10.                               
  11.                 // 创建背景颜色  
  12.                 Symbol bgSymbol = new Symbol();    
  13.                 Symbol.Color bgColor = bgSymbol.new Color();    
  14.                 bgColor.alpha = 150;    
  15.                 bgColor.red = 80;    
  16.                 bgColor.blue = 80;    
  17.                 bgColor.green = 80;    
  18.   
  19.                 // 创建文本对象  
  20.                 TextItem textItem = new TextItem();  
  21.                 textItem.fontColor = textColor;  
  22.                 textItem.bgColor = bgColor;  
  23.                 textItem.fontSize = 30;  
  24.                 textItem.text = "欢迎使用百度地图SDK!";  
  25.                 textItem.pt = mMapView.getMapCenter();  
  26.                   
  27.                 // 创建文本图层  
  28.                 TextOverlay textOverlay = new TextOverlay(mMapView);    
  29.                 textOverlay.addText(textItem);    
  30.   
  31.                 // 添加图层到地图  
  32.                 mMapView.getOverlays().add(textOverlay);      
  33.                 mMapView.refresh();   


1.9 图片图层(GroundOverlay)

图片图层可以用来在地图上添加一个图片。图片将会随地图的平移、旋转、缩放做相应的操作。图片图层介于底图和底图标注信息(即图片图层不会遮挡地图标注信息),图片图层添加顺序不影响其他图层的相互关系。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 新建Ground对象  
  2. GeoPoint centerPoint = new GeoPoint((int)(39.924 * 1E6),(int)(116.403 * 1E6));  
  3. Drawable d = getResources().getDrawable(R.drawable.liehuo_net_001);  
  4. Bitmap bitmap = ((BitmapDrawable) d).getBitmap();  
  5. Ground mGround = new Ground(bitmap, centerPoint, 50003000);  
  6. // 新建GroundOverlay对象  
  7. GroundOverlay mGroundOverlay = new GroundOverlay(mMapView);  
  8. mGroundOverlay.addGround(mGround);  
  9. // 添加图层  
  10. mMapView.getOverlays().add(mGroundOverlay);    
  11. mMapView.refresh();  


1.10 添加自定义View

MapView继承自ViewGroup,所以可以使用addView添加一个View对象,这部分较为简单,使用也较少,暂不介绍。


1.11 删除图层

删除图层可以调用,remove方法中的参数支持任意图层:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. mMapView.getOverlays().remove(mGroundOverlay);  
  2.                 mMapView.refresh();  

同时清除所有图层使用:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. mMapView.getOverlays().clear();  
  2. mMapView.refresh();  

0 0
原创粉丝点击