这次的demo以高德为例做的地图聚合。相信你们只要懂了原理,其他的地图三方都可以做到。
聚合大概意思就是当地图缩小到里面的marker差不多快重叠的时候,让2个marker变成1个marker。口说无凭,下面看效果图就明白是何意思。
首先我们理清思路:
1、我们需要一个装有所有数据的集合,和一个只有当前界面才能看到的数据集合。当然我们肯定只会显示当前界面看到的所以marker。所以这里我们需要监听地图改变时的监听,但我们不可能在改变的过程当中来进行筛选和刷新这样就太浪费资源,所以当地图改变完之后的监听进行这样的操作;
2、我们需要一个自定义的marker来遍历当前界面所看到的所有marker集合。来进行一个聚合。每个marker只能合并一次。所以说假如地图上有3个点,一个点和另一个点聚合了之后就不能在与第三个点聚合了。
3、通过上面的操作我们就可以拿到可见范围内的所有marker集合。那现在就是要把所有marker定在地图上面,通过坐标点。聚合点的位置就是所有聚合marker的位置的中心点。
4、地图上的聚合功能不能有旋转功能,所以我把3d地图的旋转给禁了。
好,下面我们开始贴代码,代码里面的注释很详细。如有疑问可以留言。
首先是调用mapview的主类
package com.wyw.amap;
import java.util.ArrayList;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.OnCameraChangeListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.Projection;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import android.app.Activity;
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity implements OnCameraChangeListener,
OnMarkerClickListener, AMapLocationListener {
/**
* 地图view
*/
private MapView mapView;
/**
* 高德amap
*/
private AMap aMap;
/**
* 定位
*/
private LocationManagerProxy aMapLocManager = null;
/**
* 所有的marker
*/
private ArrayList<MarkerOptions> markerOptionsListall = new ArrayList<MarkerOptions>();
/**
* 视野内的marker
*/
private ArrayList<MarkerOptions> markerOptionsListInView = new ArrayList<MarkerOptions>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.map);
//因为现在屏幕比较大单手不方便操作,高德我没找到能把 定位自己的按钮放在右下角的方法,所以就模拟一个
findViewById(R.id.nearby_linear_img_location_bottom_right).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 先销毁定位
if (aMapLocManager != null) {
aMapLocManager.removeUpdates(MainActivity.this);
aMapLocManager.destory();
}
aMapLocManager = null;
//再重启定位
if (aMapLocManager == null) {
aMapLocM