地图覆盖物分为两种:一种带聚合效果的,一种是不带聚合效果的。
首先你得有个KEY,在百度地图API上注册为开发者后,你就可以创建一个应用,记得选Android类型,因为默认是服务器类型。
之后在AndroidManifest上加上下面这些(网络、定位权限的就不需要列出了吧),最后在APPlication中初始化SDKInitializer.initialize(this);,这样你的的MapView就可以跑起来啦!
一、带聚合效果的,先来看图:
实现的方式很简单。
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,先上图:
聚合后的效果:
1、先从官方Demo中拷贝clusterutil包到项目中。
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、如果要修改聚合的样式的话,就要相应的修改源码了。
有一篇文章讲的特别好,可以参考这里恋猫大神的文章写得很完整。