关闭

Android:百度地图 点聚合功能

标签: android百度地图sdk
7374人阅读 评论(18) 收藏 举报
分类:

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

最近因项目需要,在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()));
6
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android百度地图点聚合功能

在百度地图的开发说明中有描述到点聚合功能: 点聚合功能 自v3.6.0版本起,新增点聚合功能,可通过缩小地图层级,将定义范围内的多个标注点,聚合显示成一个标注点,并在MarkerCluster...
  • aconghui
  • aconghui
  • 2016-03-22 22:22
  • 6943

Android:百度地图,点聚合功能

每周坚持写博客,愿意共同促进。 最近由于工作需要使用到百度地图上的点聚合功能,查找网上的资料写的不是很详细,走过了不少坑,今天特别把完整的过程写下来。 实现百度地图的点聚合功能,第...
  • ningzhimeng
  • ningzhimeng
  • 2017-05-10 13:48
  • 802

android项目中实现百度地图中点聚合功能

最近公司的一个项目上需要在百度地图上实现点位聚合的功能,首先第一想到的就是去百度地图开发的官网上下载官方的Demo 我使用的开发工具是Android Studio,解压安装包后,通过...
  • ynxdb2002
  • ynxdb2002
  • 2016-06-29 21:58
  • 1442

细读百度地图点聚合源码(下)---Renderer类解析

上一篇文章分析了ClusterMananger的整体结构和核心算法 细读百度地图点聚合源码(上),此文是接着上一篇来的。 在本文中,我们将学习如何在UI线程中做大量的操作,并且不会造成界面卡顿。
  • javine
  • javine
  • 2016-05-13 22:09
  • 10361

百度地图开发之点聚合功能

大家不清楚什么是点聚合,请看图。
  • shaoyezhangliwei
  • shaoyezhangliwei
  • 2017-03-13 15:02
  • 2085

使用百度地图的点聚合功能

百度地图的demo中,是在MarkerClusterDemo.java中演示了点聚合功能,不过比较简单,不能满足实际应用的需求。 在其基础功能之上,我做了如下改进: 1,给标记点传递数据; 2,实现聚...
  • lintax
  • lintax
  • 2017-01-15 10:55
  • 2924

百度地图点聚合提高效率

优化百度地图点聚合 参考文献:http://www.cnblogs.com/lightnull/p/6184867.html 百度的点聚合算法 是基于方格和距离的聚合算法,即开始的时候地图上没...
  • ztop_f
  • ztop_f
  • 2017-02-16 14:02
  • 4555

安卓高德地图点聚合功能

  • 2017-08-29 18:23
  • 42.78MB
  • 下载

细读百度地图点聚合源码(上)

之前在项目中需要用到百度地图的点聚合,看了百度提供的demo之后,稍微读了一些源码就能达到需求了,所以并未深入解读源码。 最近有空就把百度实现点聚合的源码从里到外仔细研究了一遍受益良多,在此分享一下。...
  • javine
  • javine
  • 2016-04-20 23:27
  • 12430

百度地图API 重新生成点聚合的功能

百度点聚合用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。 http://api.map.baidu.com/library/MarkerClusterer/1.2/docs/symb...
  • u012463017
  • u012463017
  • 2016-12-07 16:09
  • 4287
    个人资料
    • 访问:171120次
    • 积分:2084
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:8篇
    • 译文:0篇
    • 评论:51条
    写给自己
    在找到你的爱情以前
    我们的感情在流浪
    在找到你的团队以前
    我们的梦想在流浪

    没有人愿意选择奔波
    但是努力更让人踏实
    联系方式
    QQ:491150376

    打个广告,吉林长春,优格实战学院,招生啦,由多年一线工作经验的讲师授课,主打实战。
    培训课程包括Java,Web前端,Android,iOS,UI,产品,测试,欢迎大家咨询!
    博客专栏