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

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

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

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


百度地图之覆盖物聚合效果_第1张图片
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包到项目中。
百度地图之覆盖物聚合效果_第2张图片
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 mClusterManager = new ClusterManager<>(getAbstractActivity(), baiduMap);

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

    // 设置maker点击时的响应
        baiduMap.setOnMarkerClickListener(mClusterManager);
        mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener() {
            @Override
            public boolean onClusterClick(Cluster 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() {
            @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、如果要修改聚合的样式的话,就要相应的修改源码了。
有一篇文章讲的特别好,可以参考这里恋猫大神的文章写得很完整。

你可能感兴趣的:(百度地图之覆盖物聚合效果)