百度地图之标注聚会

俗话说站在巨人的肩膀上将事半功倍,在写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.下面贴出代码

[html] view plaincopy

  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.下面是程序的实例图片

时间: 2024-09-11 02:06:54

百度地图之标注聚会的相关文章

百度地图怎么标注公司?

  百度地图标注公司教程有些朋友不是很了解,大家可以参考下文来学习百度地图怎么标注公司,百度地图是很多朋友在使用的工具,如果能在上面标注自己的公司是很不错的哦~ 如果您的商铺在百度地图上已经存在,搜索到后您可以直接认领;如果您的商铺在百度地图上还不存在,您可以先标注再进行认领. 参照您周边的地标性建筑,拖拽地图中的红点,标注到最准确的位置. 一个商铺不能被重复认领.如果您的商铺被其他人认领,请确认自己拥有认领的相关资质并且没有认领过该商铺后,请申请线下仲裁.

php+js实现百度地图多点标注的方法_php技巧

本文实例讲述了php+js实现百度地图多点标注的方法.分享给大家供大家参考,具体如下: 1.php创建json数据 $products = $this->product_db->select($where); $products_json = json_encode($products); 2.js传入json数据 类似于这样的结构 var markerArr = [{ title: "名称:广州火车站", point: "113.264531,23.157003

百度地图 定位 标注-IOS 百度地图 标注删除不了?求求大神啊 拜托了

问题描述 IOS 百度地图 标注删除不了?求求大神啊 拜托了 if (!_perList) { _perList=[[PersonalViewController alloc]init]; [self becomeFirstResponder]; CGFloat y=CGRectGetMaxY(_toolBar.frame); CGRect popFrame=CGRectMake(10, y, self.view.frame.size.width-20, self.view.frame.size

百度地图拖动标注后获取坐标

本来想用图吧的API来做的,结果弄了下,在手机上弄不了.换用百度地图了..本功能个人觉得在很多地方用到,先记下来,省得每次都得翻地图API文档一点一点弄.   功能表现为: 地图一开始打开就定位到你的附近(以百度地图的浏览器定位为准),地图中心有一标注,鼠标拖去标注结果后弹框显示经纬度,自己测试过在手机上也是可以拖动的   代码如下: <!DOCTYPE html><html><head>    <meta http-equiv="Content-Typ

removeoverlay-调用百度地图的removeOverlay函数不能清除标注

问题描述 调用百度地图的removeOverlay函数不能清除标注 function deletePoint(m,n){ var marker = new BMap.Marker(new BMap.Point(m, n)); map.removeOverlay(marker); alert("shanchu"); } 我从MFC调用deletePoint函数,传的m,n为我要删除的标注的经纬度信息,运行后可以打印"shanchu",说明我成功调用了函数,但是为什么不

百度地图api应用标注地理位置信息(js版)_javascript技巧

有时做了一些东西没有记录,而过一段时间再看的时候,有会忘记了.需要在重新在看一遍. 百度地图javascript api可以参考 http://developer.baidu.com/map/reference/  示例:http://developer.baidu.com/map/jsdemo.htm 更多百度地图的介绍http://www.cnblogs.com/milkmap/tag/%E5%9C%B0%E5%9B%BEAPI/   里面介绍的非常详细. 弄了一个百度地图来标注地理位置信息

百度地图API详解之地图标注

标注(Marker)是用来表示一个点位置的可见元素,每个标注自身都包含地理信息.比如你在西单商场位置添加了一个标注,不论地图移动.缩放,标注都会跟随一起移动,保证其始终指向正确的地理位置. 从上面的图可以看出,不论地图如何变化标注始终指向"西单商场"的位置. 如何知道某个点的坐标? 上例中我们在西单商场位置添加了一个标注,那么我是如何知道它的坐标点呢?可以通过API的事件机制来获取: map.addEventListener('click', function(e){ console.

"翔计划"新举措百度地图免费让中小企业标注

[赛迪网讯]自2011年百度联合工信部发布"翔计划"以来,这一高达30亿元的营销帮扶计划已在全国十余省市落地实施,成为倍受中小企业主欢迎和认可的新生产力引擎.近日,"翔计划"再推新举措,面向全国中小企业免费开放百度地图标注服务. 记者获悉,这是百度首次将其网络地图平台免费开放,旨在进一步为中小企业提供更强有力的网络营销支持.据了解,凡新签约百度推广的企业均可在百度地图上标注自身企业内容,展示公司名称.地址.联系方式.交通等信息.网民在百度上进行搜索时,还将会直接在搜

【百度地图API】如何快速创建带有标注的地图?——快速创建地图工具+如何标注商家

原文:[百度地图API]如何快速创建带有标注的地图?--快速创建地图工具+如何标注商家 摘要: 如果你不会程序,如果你不想写代码. 如果你想拥有一张自己的地图,如果你想在该地图上标注出你商店的位置. 不要犹豫了,就使用快速创建地图工具吧! -------------------------------------------------------------------------------------- 如何快速创建地图? 一.转入百度提供的快速创建地图工具页面:http://openap