# android-togetherMap
本文我将讲解一下我最近实现的高德地图Marker的聚合功能。在项目开发中需要使用到地图Marker的聚合功能,但是高德地图并没有实现对Marker的聚合功能,所以需要自己实现其聚合功能(这里说一下百度是实现的,为啥高德不做?)下面我将介绍一下具体的实现步骤。
本项目的github地址:<a href="https://github.com/yipianfengye/android-togetherMap">android-togetherMap</a>
本项目的具体实现效果如下:
![image](http://img.blog.csdn.net/20161019092142793)
**(一)集成高德地图API**
- 参考高德地图开放平台文档
高德地图API集成参考地址:<a href="http://lbs.amap.com/">高德开放平台</a>
包括配置Manifest,申请AppId等步骤;
- 添加Layout布局文件
```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
```
这里主要是添加MapView控件,该控件是地图显示控件,也是我们实现地图功能的主要控件。
- 执行Map对象初始化以及各个生命周期方法
```
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 此方法必须重写
init();
}
/**
* 初始化AMap对象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
}
aMap.setOnCameraChangeListener(onCameraChangeListener);
dotList.clear();
dotList = DotInfo.initData();
}
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
updateNormalMarkers();
}
/**
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必须重写
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必须重写
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
```
主要是在Activity的生命周期方法中添加对MapView的处理...
- 地图页面中添加Marker对象
```
/**
* 初始化marker数据
*/
private void loadMarker(List<DotInfo> dotList) {
if (dotList == null || dotList.size() == 0) {
return;
}
for (int i = 0; i < dotList.size(); i++) {
DotInfo dotInfo = dotList.get(i);
MarkerOptions options = new MarkerOptions();
options.anchor(0.5f, 1.0f);
options.position(new LatLng(dotInfo.getDotLat(), dotInfo.getDotLon()));
setIconToOptions(options);
Marker marker = aMap.addMarker(options);
marker.setObject(dotInfo);
marker.setZIndex(ORGZOON);
markerMap.put(dotInfo.getDotId(), marker);
}
}
```
删除方法中传递的参数是我在客户端写死的集合数据,执行到这里至此我们就实现了一个简单的地图页面,并添加了相应的Marker对象,具体效果如下:
<img src="http://img.blog.csdn.net/20161019092631689" width="300" height="500">
**(二)添加地图缩放聚合功能**
在上面我们已经实现了一个简单的地图显示页面以及添加了几个Marker对象,现在需要实现的效果是当我们扩大地图的显示比例的时候,相邻的Marker会聚合成一个合成的Marker对象,具体的实现效果就是我们一开始展示的效果。
- 重写地图的OnCameraChangeListener
该Listener会在地图移动或者是改变显示比例的时候被回调,这里我们再其回调方法onCameraChangeFinish方法中执行我们的Marker计算,聚合功能,具体代码如下:
```
/**
* 设置地图移动监听
*/
private AMap.OnCameraChangeListener onCameraChangeListener = new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
// 放大缩小完成后对聚合点进行重新计算
updateMapMarkers();
}
};
```
好吧,然后我们看一下自定义方法的updateMapMakers方法的实现逻辑:
```
/**
* 主要用于更改计算聚合Marker对象
*/
private synchronized void updateMapMarkers() {
if (dotList != null && dotList.size() > 0) {
Log.i(TAG, "地图级别:" + aMap.getCameraPosition().zoom);
// 若当前地图级别小于初始化比例尺,则显示聚合网点
if (aMap.getCameraPosition().zoom < ORGZOON) {
markerStatus = MARKER_TOGE;
updateTogMarkers();
}
// 显示普通marker
else {
if (markerStatus == MARKER_TOGE) {
markerStatus = MARKER_NORMA;
updateNormalMarkers();
}
}
System.gc();
}
}
```
地图缩放操作有两部分,分别为展示普通marker部分和展示聚合marker部分,这里地图显示比例有一个阙值,当我们的显示比例小于这个阙值的时候计算结果显示聚合Marker对象,当显示比例大于这个阙值的时候计算结果显示普通的Marker对象。
**(三)展示聚合Marker操作**
下面开始我们就将执行具体的Marker对象的聚合功能了
```
/**
* 更新聚合网点
*/
private void updateTogMarkers() {
Log.i(TAG, "开始显示聚合网点,清空地图normal marker...");
aMap.clear();
// 更新聚合marker
MapTogetherManager.getInstance(this, aMap).onMapLoadedUpdateMarker(markerMap);
// 设置marker点击事件,若是聚合网点此时点击marker则放大地图显示正常网点
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// 初始化地图按指定的比例尺移动到定位的坐标
aMap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(marker.getPosition(), ORGZOON, 3, 0)), 1000, null);
return true;
}
});
}
```
我们可以发现具体的Marker聚合操作是在MapTogetherManager类中实现的,所以我们需要看一下MaoTigetherManager的实现逻辑。
```
/**
* 更新聚合网点
*/
public void onMapLoadedUpdateMarker(final Map<String, Marker> markerMap) {
// 清空内存聚合网点数据
togDotInfoMap.clear();
togMarkerMap.clear();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lockObject) {
Log.i(TAG, "开始循环遍历,执行网点聚合操作...");
Iterator<Map.Entry<String, Marker>> iterator = markerMap.entrySet().iterator();
// 循环遍历在已有的聚合基础上,对添加的单个元素进行聚合
while (iterator.hasNext()) {
assignSingleCluster(iterator.next().getValue());
}
Log.i(TAG, "开始执行将聚合网点展示在地图上...");
// 将聚合的网点现在在地图
没有合适的资源?快使用搜索试试~ 我知道了~
Android-实现高德地图的marker聚合功能
共39个文件
xml:9个
java:7个
png:6个
需积分: 46 17 下载量 104 浏览量
2019-08-13
05:51:06
上传
评论 1
收藏 2.9MB ZIP 举报
温馨提示
本文我将讲解一下我最近实现的高德地图Marker的聚合功能。在项目开发中需要使用到地图Marker的聚合功能,但是高德地图并没有实现对Marker的聚合功能,所以需要自己实现其聚合功能
资源推荐
资源详情
资源评论
收起资源包目录
Android-实现高德地图的marker聚合功能.zip (39个子文件)
android-togetherMap-master
app
.gitignore 7B
build.gradle 1KB
src
androidTest
java
xiaomi
mich
com
android_togethermap
ExampleInstrumentedTest.java 774B
main
AndroidManifest.xml 2KB
res
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
layout
map_marker_layout.xml 848B
activity_main.xml 372B
values-w820dp
dimens.xml 358B
mipmap-xxhdpi
ic_launcher.png 8KB
drawable
ic_location_normal.png 1KB
marker_num_nonumber_bg.xml 254B
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
values
strings.xml 82B
colors.xml 208B
dimens.xml 211B
styles.xml 383B
java
xiaomi
mich
com
android_togethermap
MainActivity.java 6KB
model
DotInfo.java 3KB
utils
DisplayUtil.java 2KB
together
MapTogetherManager.java 8KB
TogDotInfo.java 1KB
test
java
xiaomi
mich
com
android_togethermap
ExampleUnitTest.java 413B
libs
arm64-v8a
libgdinamapv4sdk752.so 1.23MB
libgdinamapv4sdk752ex.so 182KB
AMap_3DMap_V4.0.1_20160923.jar 1.78MB
armeabi
libgdinamapv4sdk752.so 641KB
libgdinamapv4sdk752ex.so 134KB
proguard-rules.pro 656B
settings.gradle 15B
build.gradle 498B
gradlew 5KB
README.md 13KB
gradlew.bat 2KB
gradle.properties 730B
gradle
wrapper
gradle-wrapper.properties 233B
gradle-wrapper.jar 52KB
local.properties 501B
共 39 条
- 1
资源评论
weixin_39841848
- 粉丝: 509
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功