1. 程式人生 > >Android百度地圖點聚合功能

Android百度地圖點聚合功能

在百度地圖的開發說明中有描述到點聚合功能:

點聚合功能

自v3.6.0版本起,新增點聚合功能,可通過縮小地圖層級,將定義範圍內的多個標註點,聚合顯示成一個標註點,並在MarkerClusterDemo中開放原始碼,方便開發者自行修改。

 
// 初始化點聚合管理類
ClusterManager mClusterManager = new ClusterManager<>(this, mBaiduMap);
// 向點聚合管理類中新增Marker例項
LatLng llA = new LatLng(39.963175, 116.400244);
List<MyItem> items =
new ArrayList<>(); items.add(new MyItem(llA)); mClusterManager.addItems(items);

具體原始碼請在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