百度地图之覆盖物聚合效果

地图覆盖物分为两种:一种带聚合效果的,一种是不带聚合效果的。

首先你得有个KEY,在百度地图API上注册为开发者后,你就可以创建一个应用,记得选Android类型,因为默认是服务器类型。
 之后在AndroidManifest上加上下面这些(网络、定位权限的就不需要列出了吧),最后在APPlication中初始化SDKInitializer.initialize(this);,这样你的的MapView就可以跑起来啦!

一、带聚合效果的,先来看图:


Paste_Image.png

实现的方式很简单。
1、到百度地图开放平台上进行注册,下载jar包,导入到项目中去,结合着开发文档和官方Demo。
2、主要涉及到两个重要的类MarkerOptions和Marker。MarkerOptions主要负责配置覆盖物的一些属性信息。Marker指覆盖物,MarkerOptions和Marker结合起来用,就组成了覆盖物。
3、MarkerOptions配置

//覆盖物仅仅是图标
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.map_personal);
//如果覆盖物是需要自定义的话,比如图标和文字是服务器返回的,就可以定义一个View布局
  然后BitmapDescriptorFactory.fromView(View view);
MarkerOptions options = new MarkerOptions();
 options.position(newLatLng(sellers.get(i).getLatitude(),sellers.get(i).getLongitude()))        // 位置
                                .title(sellers.get(i).getName())        // title
                                .icon(icon)            // 图标
                                .anchor(0.5f, 0.5f);//设置 marker 覆盖物的锚点比例,默认(0.5f, 1.0f)水平居中,垂直下对齐
   // 覆盖物动画
options.animateType(MarkerOptions.MarkerAnimateType.grow);

4、Marker配置

Marker mMarker = (Marker) (baiduMap.addOverlay(options));//初始化Marker,并显示Marker。
//这里
 Bundle bundle = new Bundle();
 bundle.putSerializable(IntentConstants.SELL_CONTENT_KEY, sellers.get(i));  
mMarker.setExtraInfo(bundle);

5、把以上代码放到一个循环里面,就得到了多个Marker
6、Marker的点击事件处理:
BaiduMap.OnMarkerClickListener,通常来说,点击Marker,需要弹出一个弹窗信息,来展示覆盖代表的信息。
在第四步初始化完Marker之后,添加一个bundle,然后点击覆盖物的时候使用。

 baiduMap.setOnMarkerClickListener(new   BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(final Marker marker) {
                //marker代表点击的那个覆盖物,
                //从bundle取出marker的信息
             Bundle bundle2 = marker.getExtraInfo();
             final Seller seller = (Seller) bundle2.getSerializable(IntentConstants.SELL_CONTENT_KEY);
                }
                return true;
        });

7、点击出现弹窗信息,弹窗的基本类InfoWindow,初始化的时候,弹窗的布局可以随意进行配置可以随便进行配置。

                    //初始化显示的位置(1.窗口的内容,2位置,3.y轴偏移量)
//                    mInfoWindow = new InfoWindow(markView, marker.getPosition(), -47,listener);
                    mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(markView), marker.getPosition(), -47, listener);
                    //显示当前的infowindow
                    baiduMap.showInfoWindow(mInfoWindow);
                    //点击inforWindow的事件
                    InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
                        public void onInfoWindowClick() {
//                            1。移动到地图的中心
                            moveMapTo(seller.getLatitude(), seller.getLongitude(), true);
                            //2.底部popWindow弹出//
                            showMapStationInfo(seller);
                        }
                    };

二、有的时候,需要打开的地图的时候,覆盖物直接显示所有的信息,而且带有聚合的效果,就要用的一个类ClusterItem,先上图:


Paste_Image.png

聚合后的效果:


Paste_Image.png

1、先从官方Demo中拷贝clusterutil包到项目中。
Paste_Image.png

2、实现聚合效果,两个最主要的类ClusterManager和ClusterItem

/**
     *  每个Marker点,包含Marker点坐标以及图标
     */
    public class MyItem implements ClusterItem {
        private ChargeStation chargeStation;

        public MyItem(ChargeStation chargeStation){
            this.chargeStation = chargeStation;
        }

        @Override
        public LatLng getPosition(){
            return new LatLng(chargeStation.getLatitude(),chargeStation.getLongitude());
        }

        @Override  //随意定义聚合物的样式
        public BitmapDescriptor getBitmapDescriptor(){
            View view = mInflater.inflate(R.layout.map_pile_mark_infowindow, null);
            TextView name = (TextView) view.findViewById(R.id.tv_title);
            name.setText(chargeStation.getName());
            return BitmapDescriptorFactory.fromView(view);
        }
    }

3、初始化点聚合管理类ClusterManager,返回所有聚合点的集合,参数信息应该能看懂。

ClusterManager<MyItem> mClusterManager = new ClusterManager<>(getAbstractActivity(), baiduMap);

4、覆盖物及覆盖物的点击事件

    // 设置maker点击时的响应
        baiduMap.setOnMarkerClickListener(mClusterManager);
        mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
            @Override
            public boolean onClusterClick(Cluster<MyItem> cluster) {
                Toast.makeText(getAbstractActivity(),
                        "有" + cluster.getSize() + "个点", Toast.LENGTH_SHORT).show();
                moveMapTo(cluster.getPosition().latitude,cluster.getPosition().longitude,true,ZOOM_LEVE_POINT+1);
                return false;
            }
        });

        mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
            @Override
            public boolean onClusterItemClick(MyItem item) {
                Toast.makeText(getAbstractActivity(),
                        "点击单个Item", Toast.LENGTH_SHORT).show();
                //1。移动到地图的中心
//                moveMapTo(item.getLongitude(), chargeStation.getLatitude(), true);
                moveMapTo(item.getPosition().latitude,item.getPosition().longitude,true);
                //2.底部popWindow弹出//
                showMapStationInfo(item.chargeStation);
                return false;
            }
        });

三、扩展功能:
1、NonHierarchicalDistanceBasedAlgorithm类里面的
这个类的主MAX_DISTANCE_AT_ZOOM,代表多远的距离可以聚合。
2、如果要修改聚合的样式的话,就要相应的修改源码了。
有一篇文章讲的特别好,可以参考这里恋猫大神的文章写得很完整。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容