百度地图之标注聚会

  1. 云栖社区>
  2. 博客>
  3. 正文

百度地图之标注聚会

ctrip_xzh 2014-02-17 09:57:00 浏览562 评论0

摘要: 俗话说站在巨人的肩膀上将事半功倍,在写android的百度地图标注物聚合时,我在网上也进行了大量的查询,发现标注物聚合的算法很早就有人写了,不过他们是js或者是Google地图c#版的。借鉴他们的想法,我写了android的这版代码与大家一起分享

俗话说站在巨人的肩膀上将事半功倍,在写android的百度地图标注物聚合时,我在网上也进行了大量的查询,发现标注物聚合的算法很早就有人写了,不过他们是js或者是Google地图c#版的。借鉴他们的想法,我写了android的这版代码与大家一起分享。
一、牛人们的想法
下面是我参考的有关的博客,下面将一一列举
1.MarkerCluster之百度地图版  http://hi.baidu.com/liongg/item/d8adece188fbfb11585dd89f
2.Marker Cluster面面观 http://hi.baidu.com/liongg/item/a380cc95bd70c2bdcd80e581
3.GoogleMap标注物聚合解决办法 http://www.svennerberg.com/2009/01/handling-large-amounts-of-markers-in-google-maps/
4.百度地图官网上已经有JS版的标注物聚合实例与原文件,建议看百度地图上的代码,规范且函数注释明确。
百度地图javascript开源库:  http://developer.baidu.com/map/library.htm
二、我的思路
1.下面以一个流程图来表述我的想法。
2.下面贴出代码
  1. <span style="font-family:KaiTi_GB2312;"><span style="font-size:18px;">//cluster聚合器类  
  2. package com.zhl.map;  
  3.   
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import android.graphics.Bitmap;  
  8. import android.graphics.Point;  
  9. import android.graphics.drawable.BitmapDrawable;  
  10. import android.util.Log;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.widget.TextView;  
  14. import baidumapsdk.demo.R;  
  15.   
  16.   
  17. import com.baidu.mapapi.cloud.Bounds;  
  18. import com.baidu.mapapi.map.MapView;  
  19. import com.baidu.mapapi.map.OverlayItem;  
  20. import com.baidu.mapapi.utils.DistanceUtil;  
  21. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  22. import com.zhl.activity.MarkerClusterActivity;  
  23. import com.zhl.util.MapUtils;  
  24.   
  25. public class Cluster{  
  26.       
  27.     private MarkerClusterActivity mMarkCluster;  
  28.     private MapView mMapView;  
  29.     private int mMinClusterSize;  
  30.     private Boolean isAverageCenter;  
  31.     private int mGridSize;  
  32.     private double mDistance;  
  33.       
  34.     private List<ClusterMarker> mMarkers;  
  35.       
  36.   
  37.     public Cluster(MarkerClusterActivity markCluster,MapView mapView  
  38.             ,int minClusterSize,Boolean isAverageCenter  
  39.             ,int mGridSize,double mDistance) {  
  40.         this.mMarkCluster = markCluster;  
  41.         this.mMapView = mapView;  
  42.         this.mMinClusterSize = minClusterSize;  
  43.         this.isAverageCenter = isAverageCenter;  
  44.         this.mGridSize = mGridSize;  
  45.         this.mDistance = mDistance;  
  46.         mMarkers = new ArrayList<ClusterMarker>();  
  47.     }  
  48.   
  49.     public List<OverlayItem> createCluster(List<OverlayItem> markerList){  
  50.         this.mMarkers.clear();  
  51.         List<OverlayItem> itemList = new ArrayList<OverlayItem>();  
  52.         for(int i=0;i<markerList.size();i++){  
  53.             addCluster(markerList.get(i));  
  54.         }  
  55.         for(int i=0;i<mMarkers.size();i++){  
  56.             ClusterMarker cm = mMarkers.get(i);  
  57.             setClusterDrawable(cm);  
  58.             OverlayItem oi = new OverlayItem(cm.getmCenter(),cm.getTitle(),cm.getSnippet());  
  59.             oi.setMarker(cm.getMarker());  
  60.             itemList.add(oi);  
  61.         }  
  62.         return itemList;  
  63.     }  
  64.       
  65.     private void addCluster(OverlayItem marker){  
  66.         GeoPoint markGeo = marker.getPoint();  
  67.         if(mMarkers.size()==0){  
  68.             ClusterMarker clusterMarker = new ClusterMarker(marker.getPoint(), marker.getTitle(), marker.getSnippet());  
  69.             clusterMarker.setMarker(marker.getMarker());  
  70.             clusterMarker.AddMarker(marker, isAverageCenter);  
  71.             Bounds bound = new Bounds(markGeo.getLatitudeE6(),markGeo.getLongitudeE6(),markGeo.getLatitudeE6(),markGeo.getLongitudeE6());  
  72.             bound = MapUtils.getExtendedBounds(mMapView, bound, mGridSize);  
  73.             clusterMarker.setmGridBounds(bound);  
  74.             mMarkers.add(clusterMarker);  
  75.         }else{  
  76.             ClusterMarker clusterContain = null;  
  77.             double distance = mDistance;  
  78.             for(int i=0;i<mMarkers.size();i++){  
  79.                 ClusterMarker clusterMarker = mMarkers.get(i);  
  80.                 GeoPoint center = clusterMarker.getmCenter();  
  81.                 double d = DistanceUtil.getDistance(center, marker.getPoint());  
  82.                 if(d<distance){  
  83.                     distance = d;  
  84.                     clusterContain = clusterMarker;  
  85.                 }  
  86.             }  
  87.             if(clusterContain == null||!isMarkersInCluster(markGeo, clusterContain.getmGridBounds())){  
  88.                 ClusterMarker clusterMarker = new ClusterMarker(marker.getPoint(), marker.getTitle(), marker.getSnippet());  
  89.                 clusterMarker.AddMarker(marker, isAverageCenter);  
  90.                   
  91.                 clusterMarker.AddMarker(marker, isAverageCenter);  
  92.                 Bounds bound = new Bounds(markGeo.getLatitudeE6(),markGeo.getLongitudeE6(),markGeo.getLatitudeE6(),markGeo.getLongitudeE6());               bound = MapUtils.getExtendedBounds(mMapView, bound, mGridSize);  
  93.                 clusterMarker.setmGridBounds(bound);  
  94.                   
  95.                 mMarkers.add(clusterMarker);  
  96.             }else{  
  97.                 clusterContain.AddMarker(marker, isAverageCenter);  
  98.             }  
  99.   
  100.         }  
  101.     }  
  102.       
  103.     private void setClusterDrawable(ClusterMarker clusterMarker){  
  104.         View drawableView = LayoutInflater.from(mMarkCluster).inflate(  
  105.                 R.layout.drawable_mark, null);  
  106.         TextView text = (TextView) drawableView.findViewById(R.id.drawble_mark);  
  107.         int markNum = clusterMarker.getmMarkers().size();  
  108.         if(markNum>=2){  
  109.             text.setText(markNum+"");  
  110.             if(markNum<11){  
  111.                 text.setBackgroundResource(R.drawable.m0);  
  112.             }else if(markNum>10&&markNum<21){  
  113.                 text.setBackgroundResource(R.drawable.m1);  
  114.             }else if(markNum>20&&markNum<31){  
  115.                 text.setBackgroundResource(R.drawable.m2);  
  116.             }else if(markNum>30&&markNum<41){  
  117.                 text.setBackgroundResource(R.drawable.m3);  
  118.             }else{  
  119.                 text.setBackgroundResource(R.drawable.m4);  
  120.             }  
  121.             Bitmap bitmap = MapUtils.convertViewToBitmap(drawableView);  
  122.             clusterMarker.setMarker(new BitmapDrawable(bitmap));  
  123.         }else{  
  124.               
  125.         }  
  126.     }  
  127.       
  128.     private Boolean isMarkersInCluster(GeoPoint markerGeo,Bounds bound){  
  129.         if(markerGeo.getLatitudeE6()>bound.leftBottom.getLatitudeE6()  
  130.                 &&markerGeo.getLatitudeE6()<bound.rightTop.getLatitudeE6()  
  131.                 &&markerGeo.getLongitudeE6()>bound.rightTop.getLongitudeE6()  
  132.                 &&markerGeo.getLongitudeE6()<bound.leftBottom.getLongitudeE6()){  
  133.             return true;  
  134.         }  
  135.         return false;  
  136.           
  137.     }  
  138. }</span></span>  

3.工程demo代码下载,地图标注物聚合.zip
4.下面是程序的实例图片

【云栖快讯】一站式开发者服务,海量学习资源免费学  详情请点击

网友评论