百度地图从零学起(四)地图覆盖物

本文详细介绍了百度地图API中的各种覆盖物,包括Overlay抽象基类、MyLocationOverlay(显示当前位置)、ItemizedOverlay(分条目覆盖物)、PoiOverlay(本地搜索)、RouteOverlay(驾车路线)和TransitOverlay(公交换乘路线)。通过覆盖物,可以实现地图上的标注、线路显示和交互功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地图覆盖物概述

所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。

地图API提供了如下几种覆盖物:

  • Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
  • MyLocationOverlay:一个负责显示用户当前位置的Overlay。
  • ItemizedOverlay<Item extends OverlayItem>:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。

  • PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“公园”,通过此图层将公园显示在地图上。

  • RouteOverlay:步行、驾车导航线路图层,将步行、驾车出行方案的路线及关键点显示在地图上。

  • TransitOverlay:公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上。

覆盖物的抽象基类:Overlay

一般来说,在MapView中添加一个Overlay需要经过以下步骤:

自定义类继承Overlay,并Override其draw()方法,如果需要点击、按键、触摸等交互操作,还需Override onTap()等方法。

    public class MyOverlay extends Overlay {
    GeoPoint geoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
    Paint paint = new Paint();
     
    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    //在天安门的位置绘制一个String
    Point point = mMapView.getProjection().toPixels(geoPoint, null);
    canvas.drawText("★这里是天安门", point.x, point.y, paint);
    }
    }

添加到MapView的覆盖物中:

mMapView.getOverlays().add(new MyOverlay());

运行结果如下:app_myoverlay.png

当前位置:MyLocationOverlay

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

初始化Location模块

    // 初始化Location模块
    mLocationManager = mBMapMan.getLocationManager();
    // 通过enableProvider和disableProvider方法,选择定位的Provider
    // mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);
    // mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);
    // 添加定位图层
    MyLocationOverlay mylocTest = new MyLocationOverlay(this, mMapView);
    mylocTest.enableMyLocation(); // 启用定位
    mylocTest.enableCompass(); // 启用指南针
    mMapView.getOverlays().add(mylocTest);

运行结果如下:app_mylocation.png

分条目覆盖物:ItemizedOverlay

某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:

自定义类继承ItemizedOverlay,并Override其draw()方法,如果需要点击、按键、触摸等交互操作,还需Override onTap()等方法。

    class OverItemT extends ItemizedOverlay<OverlayItem> {
    private List<OverlayItem> GeoList = new ArrayList<OverlayItem>();
    private Context mContext;
     
    private double mLat1 = 39.90923;//39.9022; // point1纬度
    private double mLon1 = 116.397428;//116.3822; // point1经度
     
    private double mLat2 = 39.9022;
    private double mLon2 = 116.3922;
     
    private double mLat3 = 39.917723;
    private double mLon3 = 116.3722;
     
    public OverItemT(Drawable marker, Context context) {
    super(boundCenterBottom(marker));
     
    this.mContext = context;
     
    // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
    GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
    GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));
    GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));
     
    GeoList.add(new OverlayItem(p1, "P1", "point1"));
    GeoList.add(new OverlayItem(p2, "P2", "point2"));
    GeoList.add(new OverlayItem(p3, "P3", "point3"));	
    populate(); //createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法
    }
     
    @Override
    protected OverlayItem createItem(int i) {
    return GeoList.get(i);
    }
     
    @Override
    public int size() {
    return GeoList.size();
    }
     
    @Override
    // 处理当点击事件
    protected boolean onTap(int i) {
    Toast.makeText(this.mContext, GeoList.get(i).getSnippet(),
    Toast.LENGTH_SHORT).show();
    return true;
    }
    }

添加到MapView的覆盖物中:

    Drawable marker = getResources().getDrawable(R.drawable.iconmark); //得到需要标在地图上的资源
    mMapView.getOverlays().add(new OverItemT(marker, this)); //添加ItemizedOverlay实例到mMapView

点击其中一个图标,运行结果如下:app_myitemizedoverlay.png

本地搜索覆盖物:PoiOverlay

详见在POI搜索及PoiOverlay。

驾车路线覆盖物:RouteOverlay


公交换乘路线覆盖物:TransitOverlay

详见在公交换乘路线搜索及TransitOverlay。

如何删除覆盖物?

清除指定覆盖物: 参考demo里面的ItemizedOverlayDemo.java,重载protected OverlayItem createItem(int i) 接口,如果要移除覆盖物,就把自己维护的mGeoList列表删除。

清除所有覆盖物:mapView.getOverlays().clear();


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值