百度地图聚合

简介: 一、牛人们的想法 下面是我参考的有关的博客,下面将一一列举 1.MarkerCluster之百度地图版  http://hi.baidu.com/liongg/item/d8adece188fbfb11585dd89f 2.Marker Cluster面面观 http://hi.baidu.com/liongg/item/a380cc95bd70c2bdcd80
一、牛人们的想法
下面是我参考的有关的博客,下面将一一列举
1.MarkerCluster之百度地图版  http://hi.baidu.com/liongg/item/d8adece188fbfb11585dd89f
4.百度地图官网上已经有JS版的标注物聚合实例与原文件,建议看百度地图上的代码,规范且函数注释明确。
百度地图javascript开源库:  http://developer.baidu.com/map/library.htm
二、我的思路
1.下面以一个流程图来表述我的想法。
2.下面贴出代码
[html]  view plain copy
  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.下面是程序的实例图片

目录
相关文章
|
11月前
|
人工智能 资源调度 自然语言处理
《探秘:人工智能算法与鸿蒙Next携手赋能元宇宙高并发用户交互》
在元宇宙的宏大蓝图中,高并发用户交互是实现沉浸式体验的关键。鸿蒙Next通过分布式架构、微内核优化、智能场景感知和ArkTS语言等技术,使人工智能算法能高效适配,实现计算资源的最优利用,支持大规模多人在线游戏、商务会议等场景下的流畅交互,推动元宇宙产业蓬勃发展。
288 17
|
SQL 数据库连接 数据库
[IM002]Navicat ODBC驱动器管理器 未发现数据源名称并且未指定默认驱动程序
[IM002]Navicat ODBC驱动器管理器 未发现数据源名称并且未指定默认驱动程序
466 0
|
移动开发 前端开发 JavaScript
鸿蒙-webview的使用和JS交互(附源码)
日常我们在开发项目时,为了项目快速的开发和迭代,难免会用到H5页面。使用鸿蒙进行项目开发时,也一样免不了要加载H5页面,在移动开发中打开H5页面需要使用WebView组件。同时,为了和H5页面进行数据交换,有时候还需要借助JSBridge来实现客户端与H5之间的通讯。 那么鸿蒙之中用到的技术是什么呢?WebView 在此之前,先看一个报错 ​ App Launch: The Huawei Lite Simulator supports only Lite projects.
907 0
鸿蒙-webview的使用和JS交互(附源码)
|
存储 UED
Winform下拉列表的魔力:解锁字典数据展示的多种炫酷方式,让用户体验再升级!
【8月更文挑战第3天】在Winform开发中,下拉列表(ComboBox)常用于让用户从预设列表中选择。展示字典数据时,可根据需求选择方法:直接显示键、键值组合显示或保持键值关联。直接显示键适合键即信息的情况;键值组合显示则通过拼接实现;若需保持键值关联,则可利用`KeyValuePair`作为数据源,结合`DisplayMember`和`ValueMember`属性实现。具体实现见示例代码。
378 0
|
存储 监控 安全
《物联网技术》课程笔记——第一章 物联网概述
《物联网技术》课程笔记——第一章 物联网概述
|
存储 缓存 前端开发
微机原理与接口技术 微处理器架构详解
本文主要详解微处理器的架构。从微处理器的分类开始,到微处理器的历史、冯·诺依曼结构、哈佛结构等进行了细致地分析与总结。
899 1
微机原理与接口技术 微处理器架构详解
|
Shell
shell脚本并发控制详解
shell并发控制 1.文件描述符 File Descriptors (FD,文件描述符或文件句柄):进程使用文件描述符来管理打开的文件 查看当前进程的fd 确定以下三点 如何exec打开一个文件 ​ exec 3&lt;&gt; file1.txt 如何exec关闭一个文件(释放文件句柄) 如果没有释放句柄,文件删除后描述符依然还在 ​ exec 3&lt;&- 当一个文件FD未被释放,删除源文件也不会影响FD ​ rm -rf file1 ​ cp /proc/$$/3 file1
777 0
|
XML JSON 数据格式
Jayway - Json-Path 使用(一)
Jayway - Json-Path 使用(一)
1179 0
Jayway - Json-Path 使用(一)