Android百度地圖點聚合功能
在百度地圖的開發說明中有描述到點聚合功能:
點聚合功能
自v3.6.0版本起,新增點聚合功能,可通過縮小地圖層級,將定義範圍內的多個標註點,聚合顯示成一個標註點,並在MarkerClusterDemo中開放原始碼,方便開發者自行修改。
具體原始碼請在MarkerClusterDemo中檢視。
到該功能並不在SDK裡面,需要自己匯入原始碼。
下載最新百度地圖SDK全包:BaiduMap_AndroidSDK_All_V3.7.1,將API Demo裡面的clusterutil整個目錄拷貝到自己的工程裡面:
還有需要用到的res資源也拷貝過去,具體需要拷貝哪些忘了記了, 通過編譯可以發現缺哪些,對應拷貝就是。
整個程式碼的邏輯還沒細看,下面是自己專案中有修改到的內容
1、建立實現ClusterItem 介面的類,該類用於表示地圖上的一個標記的點,後續將這些標記點的物件新增到聚合地圖的管理容器裡面,實現點聚合功能。
public class SwitBdItem implements ClusterItem {
// 可以新增自己的屬性,比較該標記點關聯到一個裝置,可以新增一個裝置的引用,在地圖上點選這個點時可以顯示出裝置名稱 private Context context; private final LatLng mPosition; public SwitBdItem(LatLng latLng) { mPosition = latLng; } <span style="white-space:pre"> </span> // 返回標記點的座標<span style="white-space:pre"> </span> @Override public LatLng getPosition() { return mPosition; } // 返回標記點的標記圖示,可以自定義一個View上面疊加自己的內容 @Override public BitmapDescriptor getBitmapDescriptor() { View view; view = LayoutInflater.from(context).inflate(R.layout.item_blue, null); TextView textView = (TextView) view.findViewById(R.id.icon_title); textView.setText(title + ""); return BitmapDescriptorFactory.fromView(view); } }
2、定義一個聚合功能的管理容器,表示這個點聚合的地圖管理容器上要標註SwitBdItem型別的點
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>
private ClusterManager<SwitBdItem> mClusterManager;
mClusterManager = new ClusterManager<SwitBdItem>(context, mBaiduMap); // mBaiMap是百度地圖結構
3、設定點選圖示時的事件,在我的專案裡面需要實現點選地圖點時,顯示出相關資訊,所以需要設定捕獲點選圖示事件。
要使該偵聽事件生效,需要設定mClusterManager偵聽地圖的setOnMarkerClick事件
mClusterManager.setOnClusterItemClickListener(new SwitOnClusterItemClickListener());
mBaiduMap.setOnMarkerClickListener(mClusterManager);
4、新增座標點
SwitBdItem bdItem = new SwitBdItem(ll);
mClusterManager.addItem(bdItem);
通過以上配置後,發現在點選地圖上的標記點時,並不會觸發SwitOnClusterItemClickLister函式,通過檢視原始碼發現:
mClusterManager.setOnClusterItemClickListener(new SwitOnClusterItemClickListener());
ClusterManager類:
public void setOnClusterItemClickListener(OnClusterItemClickListener<T> listener) {
mOnClusterItemClickListener = listener;
mRenderer.setOnClusterItemClickListener(listener);
}
DefaultClusterRenderer類:
public void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener<T> listener) {
mItemClickListener = listener;
}
點選地圖點時,呼叫的是ClusterManager的onMarkerClick方法,但是該方法在目前實現中是直接返回false,需要修改為:
@Override
public boolean onMarkerClick(Marker marker) {
return mMarkerManager.onMarkerClick(marker);
另外可通過修改DefaultClusterRenderer類裡面的MIN_CLUSTER_SIZE引數來設定當幾個點疊在一起時,要進行聚合,預設是4