android 高德地图全套,Android 高德地图聚合Markers【原创】

上一篇说了在地图上实现了自定义Markers,但是markers太多在地图上显示的就会密密麻麻,重叠覆盖,这里就介绍一下markers的聚合。先看一下封装好的聚合类。

public class MarkerClusterYellow {

private Activity activity;

private MarkerOptions options;

private ArrayListincludeMarkers;

private LatLngBounds bounds;// 创建区域

/**

*

* @param activity

* @param firstMarkers

* @param projection

* @param gridSize

* 区域大小参数

*/

public MarkerClusterYellow(Activity activity, MarkerOptions firstMarkers,

Projection projection, int gridSize) {

options = new MarkerOptions();

this.activity = activity;

Point point = projection.toScreenLocation(firstMarkers.getPosition());

Point southwestPoint = new Point(point.x - gridSize, point.y + gridSize);

Point northeastPoint = new Point(point.x + gridSize, point.y - gridSize);

bounds = new LatLngBounds(

projection.fromScreenLocation(southwestPoint),

projection.fromScreenLocation(northeastPoint));

options.anchor(0.5f, 0.5f).title(firstMarkers.getTitle())

.position(firstMarkers.getPosition())

.icon(firstMarkers.getIcon())

.snippet(firstMarkers.getSnippet());

includeMarkers = new ArrayList();

includeMarkers.add(firstMarkers);

}

/**

* 添加marker

*/

public void addMarker(MarkerOptions markerOptions) {

includeMarkers.add(markerOptions);// 添加到列表中

}

/**

* 设置聚合点的中心位置以及图标

*/

public void setpositionAndIcon(String text) {

String id="";

int size = includeMarkers.size();

if (size == 1) {

return;

}

double lat = 0.0;

double lng = 0.0;

String snippet = "";

for (MarkerOptions op : includeMarkers) {

lat += op.getPosition().latitude;

lng += op.getPosition().longitude;

snippet += op.getTitle() + "\n";

id=id+op.getTitle()+",";

}

options.position(new LatLng(lat / size, lng / size));// 设置中心位置为聚集点的平均距离

options.title(id);

options.snippet(snippet);

int iconType = size / 2;

switch (iconType) {

default:

options.icon(BitmapDescriptorFactory

.fromBitmap(getViewBitmap(getView(size,text,

R.mipmap.content_icon_positions_yellow))));

break;

}

}

public LatLngBounds getBounds() {

return bounds;

}

public MarkerOptions getOptions() {

return options;

}

public void setOptions(MarkerOptions options) {

this.options = options;

}

public View getView(int carNum,String text,int resourceId) {

View view = activity.getLayoutInflater().inflate(R.layout.my_car_cluster_view, null);

TextView carNumTextView = (TextView) view.findViewById(R.id.my_car_num);

TextView tv_price = (TextView) view.findViewById(R.id.tv_price);

TextView tv_price_status = (TextView) view.findViewById(R.id.tv_price_status);

tv_price.setText(text);

tv_price_status.setText("元/天");

tv_price.setTextColor(Color.parseColor("#FFBB18"));

tv_price_status.setTextColor(Color.parseColor("#FFBB18"));

LinearLayout myCarLayout = (LinearLayout) view.findViewById(R.id.my_car_bg);

myCarLayout.setBackgroundResource(resourceId);

carNumTextView.setText(String.valueOf(carNum));

return view;

}

/**

* 把一个view转化成bitmap对象

*/

public static Bitmap getViewBitmap(View view) {view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),

MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

view.buildDrawingCache();

Bitmap bitmap = view.getDrawingCache();

return bitmap;

}

}

在前一篇博客的基础上我们进行聚合,只需要做以下操作:

public class FragmentMap extends Fragment implements LocationSource, AMapLocationListener,OnCameraChangeListener {

private static FragmentMap fragment = null;

@ViewInject(R.id.map)

private MapView mapView;

private AMap aMap;

private View mapLayout;

private OnLocationChangedListener mListener;

private LocationManagerProxy mAMapLocationManager;

private List positionEneityList = new ArrayList();

private ArrayList markerOptionsListYellow = new ArrayList();// 所有的marker

private ArrayList markerOptionsListInViewYellow= new ArrayList();// 视野内的marker

String yellow="";

private int height;// 屏幕高度(px)

private int width;// 屏幕宽度(px)

private int gridSize = 50;// marker点区域大小

Handler handler = new Handler() {

@Override

public void handleMessage(android.os.Message msg) {

super.handleMessage(msg);

if (msg.what == 0) {

resetMarks();// 更新markers

}

}

};

public static Fragment newInstance() {

if (fragment == null) {

synchronized (FragmentMap.class) {

if (fragment == null) {

fragment = new FragmentMap();

}

}

}

return fragment;

}

public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

if (mapLayout == null) {

mapLayout = inflater.inflate(R.layout.fragment_map, null);

ViewUtils.inject(this, mapLayout);

mapView.onCreate(savedInstanceState);

DisplayMetrics dm = new DisplayMetrics();

getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);

width = dm.widthPixels;

height = dm.heightPixels;

if (aMap == null) {

aMap = mapView.getMap();

aMap.setLocationSource(this);// 设置定位监听

aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示

aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false

}

} else {

if (mapLayout.getParent() != null) {

((ViewGroup) mapLayout.getParent()).removeView(mapLayout);

}

}

aMap.setOnCameraChangeListener(this);

return mapLayout;

}

/**

* 获取视野内的marker 根据聚合算法合成自定义的marker 显示视野内的marker

*/

private void resetMarks() {

// 开始刷新界面

Projection projection = aMap.getProjection();

Point p = null;

markerOptionsListInViewYellow.clear();

// 获取在当前视野内的marker;提高效率

for (MarkerOptions mp : markerOptionsListYellow) {

p = projection.toScreenLocation(mp.getPosition());

if (p.x < 0 || p.y < 0 || p.x > width || p.y > height) {

// 不添加到计算的列表中

} else {

markerOptionsListInViewYellow.add(mp);

}

}

// 自定义的聚合类MarkerCluster

ArrayList<MarkerClusterYellow> clustersMarkeryellow = new ArrayList<MarkerClusterYellow>();

for (MarkerOptions mp : markerOptionsListInViewYellow) {

if (clustersMarkeryellow.size() == 0) {

clustersMarkeryellow.add(new MarkerClusterYellow(getActivity(), mp,

projection, gridSize));//gridSize 根据自己需求调整

} else {

boolean isIn = false;

for (MarkerClusterYellow cluster : clustersMarkeryellow) {

if (cluster.getBounds().contains(mp.getPosition())) {

cluster.addMarker(mp);

isIn = true;

break;

}

}

if (!isIn) {

clustersMarkeryellow.add(new MarkerClusterYellow(getActivity(), mp, projection, gridSize));

}

}

}

// 先清除地图上所有覆盖物

aMap.clear();

for (MarkerClusterYellow markerClusterYellow : clustersMarkeryellow) {

markerClusterYellow.setpositionAndIcon(yellow);// 设置聚合点的位置和icon

aMap.addMarker(markerClusterYellow.getOptions());// 重新添加

}

}

private void initview() {

for (int i = 0; i < positionEneityList.size(); i++) {

if (positionEneityList.get(i).getType().equals("2")) {

yellow=positionEneityList.get(i).getPrice();

View view01 = View.inflate(getActivity(),R.layout.view_everyday, null);

TextView tv_price = (TextView) view01.findViewById(R.id.tv_price);

TextView tv_price_status = (TextView) view01.findViewById(R.id.tv_price_status);

tv_price.setText(positionEneityList.get(i).getPrice());

tv_price_status.setText("元/天");

Bitmap bitmap = CommentActivity.convertViewToBitmap(view01);

markerOptionsListYellow.add(new MarkerOptions() .position(new LatLng(Double.parseDouble(positionEneityList.get(i).getLatitude())

, Double.parseDouble(positionEneityList.get(i).getLongitude()))).icon(BitmapDescriptorFactory.fromBitmap(bitmap))

.title(positionEneityList.get(i).getId()));

}

}

}

@Override

public void onCameraChange(CameraPosition cameraPosition) {

}

@Override

public void onCameraChangeFinish(CameraPosition cameraPosition) {

handler.sendEmptyMessage(0);// 更新界面marker

}

}

定位和地图显示部分请参考之前的博客:

http://blog.it985.com/13773.html   //地图

http://blog.it985.com/13784.html   //定位

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/13798.html

75d087ef9a9fb11dc373caaf33adbf7f.png

微信打赏

支付宝打赏

感谢您对作者Lena的打赏,我们会更加努力!    如果您想成为作者,请点我

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值