Android:百度地图 点聚合功能

有段时间没有更新了,还是那句话,忙是其一,懒是主因(自嘲一下。。)

最近因项目需要,在app中添加了地图的点聚合功能,用的是百度地图,查过文档,看过源码,功能实现了,记录一下。

效果图:

这里写图片描述

下面来介绍一下实现:

额,对。。。第一步,需要先到百度地图下载SDK,这个就不介绍了。

下面步入正题:

百度的点聚合是对外开放源码的。我们需要在百度提供的demo中把clusterutil整个目录拷贝到自己的工程里面。

其中,接口Cluster,对应的是一个聚合点。接口ClusterItem,对应的是聚合点中的每一项。另,如果地图当前缩放的层级没有达到聚合的要求(当然,这个聚合的逻辑判断,百度已经帮我们写好了),显示在页面上的每一个marker都是一个ClusterItem的实现。

运行demo的时候,我们发现,demo中只是实现了点聚合的功能,各种点击事件都没有。查看代码,发现ClusterManager(顾名思义就是Cluster的管理类)中有设置相应的点击事件。

mClusterManager.setOnClusterClickListener(new OnClusterClickListener<BaiduNearbyActivity.MyItem>(){

            @Override
            public boolean onClusterClick(Cluster<MyItem> cluster){
                // TODO Auto-generated method stub
                return false;
}});
mClusterManager.setOnClusterItemClickListener(new OnClusterItemClickListener<BaiduNearbyActivity.MyItem>(){

            @Override
            public boolean onClusterItemClick(MyItem item){
                // TODO Auto-generated method stub
                return false;
}});

分别对应Cluster和ClusterItem的点击事件。然后把事件的监听交给mClusterManager。

mBaiduMap.setOnMarkerClickListener(mClusterManager);

但是,添加之后还是没有响应。原来百度在ClusterManager和DefaultClusterRenderer中,接口调用的地方没有写,给我留了个TODO。需要我们自己修改

ClusterManager类: 

public void setOnClusterItemClickListener(OnClusterItemClickListener<T> listener) {  
       mOnClusterItemClickListener = listener;  
       mRenderer.setOnClusterItemClickListener(listener);  
}

DefaultClusterRenderer类: 中

public void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener<T> listener) {  
       mItemClickListener = listener;  
 } 

这样在运行,发现点击事件可以正常响应了。

功能实现了,就需要我们根据实际需要改一下样式。记得前边提到的ClusterItem吗?
我们需要自己来实现ClusterItem接口,来定义自己的样式。

    /**
     * 每个Marker点,包含Marker点坐标以及图标
     */
    public class MyItem implements ClusterItem{
        private final LatLng mPosition;
        private String mType;
        private String mName;

        public MyItem(LatLng latLng, HashMap<String, String> map){
            mPosition = latLng;
            mType = map.get("type");
            mName = map.get("name");
        }

        @Override
        public LatLng getPosition(){
            return mPosition;
        }

        @Override
        public BitmapDescriptor getBitmapDescriptor(){
            // 吃
            if ("1".equals(mType)){
                return BitmapDescriptorFactory
                        .fromResource(R.drawable.map_fandian);
                // 喝
            }else if ("2".equals(mType)){
                return BitmapDescriptorFactory
                        .fromResource(R.drawable.map_kafei);
                // 玩
            }else if ("3".equals(mType)){
                return BitmapDescriptorFactory
                        .fromResource(R.drawable.map_huadian);
                // 乐
            }else if ("4".equals(mType)){
                return BitmapDescriptorFactory.fromResource(R.drawable.map_le);
            }else{
                return BitmapDescriptorFactory
                        .fromResource(R.drawable.icon_gcoding_own_loc);
            }
        }
    }

到此,就可以实现上面效果图的样式了。

在加一个功能点,点击后弹出个视图。显示详细信息。
先上图:

这里写图片描述 这里写图片描述

百度提供了覆盖物的功能,可以实现上面效果,但是貌似自定义view做起来不太好实现。(当然,本人才疏学浅,有人有好的解决方案,欢迎留言交流)

额。。最近总捣鼓一句话:招都是人想出来的,那没办法,想办法实现吧。
我的实现方式是在地图上层中间偏上的位置加一个隐藏的view,就是上面的样式。(至于显示一条两条的方法,我就不往出贴了,免得献丑)然后,当点击上面的点时,把当前点移动到地图view的中间,百度对这个实现提供了动画效果,还不错,不用自己写了。然后,当聚合点的点数过多的话,只增大地图的缩放等级,不显示隐藏的视图,至于几个才显示,就自己控制了。下面贴代码.

// 将地图移到到当前点击经纬度位置 并增加缩放等级
mBaiduMap.animateMapStatus(MapStatusUpdateFactory
    .newMapStatus(new MapStatus.Builder()
    .zoom(mBaiduMap.getMapStatus().zoom + 1)
    .target(cluster.getPosition())
    .build()));
  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
要在Vue中实现百度地图聚合,可以按照以下步骤进行操作: 1. 首先,在Vue项目中安装百度地图的JavaScript API。可以通过在`index.html`文件中添加以下代码来引入百度地图的API: ```html <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=YOUR_API_KEY"></script> ``` 确保替换`YOUR_API_KEY`为你自己的百度地图API密钥。 2. 在Vue组件中创建地图容器,并初始化地图。可以在`mounted`钩子函数中添加以下代码: ```javascript mounted() { const map = new BMap.Map("map-container"); // 创建地图实例 const point = new BMap.Point(经度, 纬度); // 设置地图中心坐标 map.centerAndZoom(point, 15); // 初始化地图,设置地图缩放级别 this.map = map; // 将地图实例保存到组件数据中 } ``` 确保替换`经度`和`纬度`为你希望地图显示的中心坐标。 3. 获取需要聚合的标记数据,并使用百度地图的`MarkerClusterer`类进行聚合。可以在`mounted`钩子函数中添加以下代码: ```javascript mounted() { // ... const markers = []; // 存储标记的数组 // 添加标记到地图和markers数组中 yourData.forEach((item) => { const point = new BMap.Point(item.lng, item.lat); const marker = new BMap.Marker(point); map.addOverlay(marker); markers.push(marker); }); // 创建聚合器并设置参数 const markerClusterer = new BMapLib.MarkerClusterer(map, { markers: markers, }); // ... } ``` 确保替换`yourData`为你的标记数据数组,每个标记的经度和纬度分别存储在`item.lng`和`item.lat`中。 4. 在Vue组件中添加地图容器的HTML代码。可以在组件模板中添加以下代码: ```html <template> <div id="map-container" style="width: 100%; height: 400px;"></div> </template> ``` 确保根据需要设置地图容器的宽度和高度。 通过以上步骤,你就可以在Vue项目中实现百度地图聚合效果了。记得在百度地图开放平台申请并获取到API密钥,并替换代码中的`YOUR_API_KEY`。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值