百度地图聚合

一、牛人们的想法

下面是我参考的有关的博客,下面将一一列举

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.下面贴出代码

 <span style="font-family:KaiTi_GB2312;"><span style="font-size:18px;">//cluster聚合器类  
 package com.zhl.map;  
  
 import java.util.ArrayList;  
 import java.util.List;  
  
 import android.graphics.Bitmap;  
 import android.graphics.Point;  
 import android.graphics.drawable.BitmapDrawable;  
 import android.util.Log;  
 import android.view.LayoutInflater;  
 import android.view.View;  
 import android.widget.TextView;  
 import baidumapsdk.demo.R;  
  
  
 import com.baidu.mapapi.cloud.Bounds;  
 import com.baidu.mapapi.map.MapView;  
 import com.baidu.mapapi.map.OverlayItem;  
 import com.baidu.mapapi.utils.DistanceUtil;  
 import com.baidu.platform.comapi.basestruct.GeoPoint;  
 import com.zhl.activity.MarkerClusterActivity;  
 import com.zhl.util.MapUtils;  
  
 public class Cluster{  
  
     private MarkerClusterActivity mMarkCluster;  
     private MapView mMapView;  
     private int mMinClusterSize;  
     private Boolean isAverageCenter;  
     private int mGridSize;  
     private double mDistance;  
  
     private List<ClusterMarker> mMarkers;  
  
  
     public Cluster(MarkerClusterActivity markCluster,MapView mapView  
             ,int minClusterSize,Boolean isAverageCenter  
             ,int mGridSize,double mDistance) {  
  this.mMarkCluster = markCluster;  
  this.mMapView = mapView;  
  this.mMinClusterSize = minClusterSize;  
  this.isAverageCenter = isAverageCenter;  
  this.mGridSize = mGridSize;  
  this.mDistance = mDistance;  
  mMarkers = new ArrayList<ClusterMarker>();  
     }  
  
     public List<OverlayItem> createCluster(List<OverlayItem> markerList){  
         this.mMarkers.clear();  
         List<OverlayItem> itemList = new ArrayList<OverlayItem>();  
         for(int i=0;i<markerList.size();i++){  
             addCluster(markerList.get(i));  
         }  
         for(int i=0;i<mMarkers.size();i++){  
             ClusterMarker cm = mMarkers.get(i);  
             setClusterDrawable(cm);  
             OverlayItem oi = new OverlayItem(cm.getmCenter(),cm.getTitle(),cm.getSnippet());  
             oi.setMarker(cm.getMarker());  
             itemList.add(oi);  
         }  
         return itemList;  
     }  
  
     private void addCluster(OverlayItem marker){  
         GeoPoint markGeo = marker.getPoint();  
         if(mMarkers.size()==0){  
             ClusterMarker clusterMarker = new ClusterMarker(marker.getPoint(), marker.getTitle(), marker.getSnippet());  
             clusterMarker.setMarker(marker.getMarker());  
             clusterMarker.AddMarker(marker, isAverageCenter);  
             Bounds bound = new Bounds(markGeo.getLatitudeE6(),markGeo.getLongitudeE6(),markGeo.getLatitudeE6(),markGeo.getLongitudeE6());  
  bound = MapUtils.getExtendedBounds(mMapView, bound, mGridSize);  
             clusterMarker.setmGridBounds(bound);  
             mMarkers.add(clusterMarker);  
         }else{  
             ClusterMarker clusterContain = null;  
             double distance = mDistance;  
             for(int i=0;i<mMarkers.size();i++){  
                 ClusterMarker clusterMarker = mMarkers.get(i);  
                 GeoPoint center = clusterMarker.getmCenter();  
                 double d = DistanceUtil.getDistance(center, marker.getPoint());  
                 if(d<distance){  
  distance = d;  
  clusterContain = clusterMarker;  
                 }  
             }  
             if(clusterContain == null||!isMarkersInCluster(markGeo, clusterContain.getmGridBounds())){  
                 ClusterMarker clusterMarker = new ClusterMarker(marker.getPoint(), marker.getTitle(), marker.getSnippet());  
                 clusterMarker.AddMarker(marker, isAverageCenter);  
  
                 clusterMarker.AddMarker(marker, isAverageCenter);  
                 Bounds bound = new Bounds(markGeo.getLatitudeE6(),markGeo.getLongitudeE6(),markGeo.getLatitudeE6(),markGeo.getLongitudeE6());               bound = MapUtils.getExtendedBounds(mMapView, bound, mGridSize);  
                 clusterMarker.setmGridBounds(bound);  
  
                 mMarkers.add(clusterMarker);  
             }else{  
                 clusterContain.AddMarker(marker, isAverageCenter);  
             }  
  
         }  
     }  
  
     private void setClusterDrawable(ClusterMarker clusterMarker){  
         View drawableView = LayoutInflater.from(mMarkCluster).inflate(  
                 R.layout.drawable_mark, null);  
         TextView text = (TextView) drawableView.findViewById(R.id.drawble_mark);  
         int markNum = clusterMarker.getmMarkers().size();  
         if(markNum>=2){  
             text.setText(markNum+"");  
             if(markNum<11){  
                 text.setBackgroundResource(R.drawable.m0);  
             }else if(markNum>10&&markNum<21){  
                 text.setBackgroundResource(R.drawable.m1);  
             }else if(markNum>20&&markNum<31){  
                 text.setBackgroundResource(R.drawable.m2);  
             }else if(markNum>30&&markNum<41){  
                 text.setBackgroundResource(R.drawable.m3);  
             }else{  
                 text.setBackgroundResource(R.drawable.m4);  
             }  
             Bitmap bitmap = MapUtils.convertViewToBitmap(drawableView);  
             clusterMarker.setMarker(new BitmapDrawable(bitmap));  
         }else{  
  
         }  
     }  
  
     private Boolean isMarkersInCluster(GeoPoint markerGeo,Bounds bound){  
         if(markerGeo.getLatitudeE6()>bound.leftBottom.getLatitudeE6()  
                 &&markerGeo.getLatitudeE6()<bound.rightTop.getLatitudeE6()  
                 &&markerGeo.getLongitudeE6()>bound.rightTop.getLongitudeE6()  
                 &&markerGeo.getLongitudeE6()<bound.leftBottom.getLongitudeE6()){  
             return true;  
         }  
         return false;  
  
     }  
 }</span></span> 

3.工程demo代码下载,地图标注物聚合.zip

4.下面是程序的实例图片

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Akka(43): Http:SSE-Server Sent Event - 服务端主推消息

   因为我了解Akka-http的主要目的不是为了有关Web-Server的编程,而是想实现一套系统集成的api,所以也需要考虑由服务端主动向客户端发送指令的...

28990
来自专栏程序员互动联盟

【专业领域】android apk 防止反编译技术第五篇-完整性校验

关于防止android apk被反编译的技术我们前面已经讲了四种。他们分别是加壳技术、运行时修改字节码、伪加密、对抗JD-GUI,如果有不明白的可以查看我的博客...

42470
来自专栏向治洪

系统捕获异常并发送到服务器

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个...

21870
来自专栏向治洪

Volley解析之表单提交篇

要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式。  数据包: Connection: ...

24350
来自专栏向治洪

Universal-Image-Loader源码分析,及常用的缓存策略

讲到图片请求,主要涉及到网络请求,内存缓存,硬盘缓存等原理和4大引用的问题,概括起来主要有以下几个内容: 原理示意图     主体有三个,分别是UI,缓存模...

23490
来自专栏MelonTeam专栏

Viewpager循环滑动的实现

导语 本文讲述实现ViewPager循环滑动效果的两种方案: 方案1: 复写ViewPager或者Adapter,扩展dataList,左右各加1...

25560
来自专栏醒者呆

算法族的集中管理——策略模式

策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。 我们正好可以使用策略模式加...

307100
来自专栏Fish

Android判断网络状况

啊,调bug的时候发现在没有网络的时候程序会崩,因此决定加个网络判断的。就是这个代码啦~然后到了要用的时候,new一个类对象调用这个方法就可以了。 packag...

24990
来自专栏AndroidTv

【Andorid源码解析】View.post() 到底干了啥

emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决。但说实话,实在是太懒了,总感...

44160
来自专栏酷玩时刻

Android版-微信APP支付

服务端源码地址:http://git.oschina.net/javen205/weixin_guide 客户端源码地址:https://github.com...

1.4K20

扫码关注云+社区

领取腾讯云代金券