您的位置:首页 > 移动开发 > Android开发

Android基于高德地图自定义Maker实现地图省市区多层级数据展示

2017-05-08 13:36 561 查看

Android基于高德地图自定义Maker实现地图多层级数据展示

在项目开发中,遇到了一个需求:

根据地图缩放级别的不同显示不同数据,效果如下:



要完成以上功能首先要考虑一下几点:

监听地图摄像区域改变事件;
获取地图缩放级别(zoomLevel);
自定义Maker
逻辑判断
以下来一一实现。

一、监听地图摄像区域(视窗)改变事件

//获取AMap对象
AMap aMap = ((MapView) findViewById(R.id.map_maker)).getMap();


aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
//摄像区域(视窗)开始改变
}

@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
//改变结束
}
});

二、获取地图缩放级别(zoomLevel)

//zoomlevel in [3, 19)
aMap.getCameraPosition().zoom

三、自定义Maker

布局文件:my_maker.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
android:layout_width="35dp"
android:layout_height="50dp"
android:src="@drawable/google_places" />

<TextView
android:id="@+id/maker_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginStart="0.5dp"
android:layout_marginTop="9.5dp"
android:text="8"
android:textAlignment="center"
android:textColor="#ffffff"
android:textSize="13dp" />
</FrameLayout>
图片:google_places.png



添加Maker
Marker localMarker = aMap.addMarker(new MarkerOptions()
.position(new LatLng(lat,lng)) // 此处填写坐标点
.icon(BitmapDescriptorFactory.fromView(getMyView(num)))); // 自定义getMyView()方法返回一个View对象
localMarker.setObject(localMarker);

getMyView()
View getMyView(int pm_val) {
View view = getLayoutInflater().inflate(R.layout.my_maker, null);
TextView tv_val = (TextView) view.findViewById(R.id.maker_num);
tv_val.setText(pm_val + "");
return view;
}

四、逻辑判断

int beforeLevel = -1;
private void changeMaker(float zoom) {

Map<String, Integer> lmap = new HashMap<>();
Map<String, BillLocation> billLocationMap = new HashMap<>();

//高德地图定位信息返回:省份、城市、区县、商区(businessarea)、标题(title)、完整片段(snippet);
//我在这里将他分为5级:Math.round(zoom) 获取整数值[3,19],减3获得[0,16],除以3获得[0,1,2,3,4,5];4,5同级
//避免使用大量if-else条件判断

int level = (Math.round(zoom) - 3) / 3;

//与上次无变化则退出
if (beforeLevel == level) {
return;
}
beforeLevel = level;

//这里是将数据集locationList进行具体判断,进行具体操作处理
for (BillLocation bl : locationList) {
String key = null;
switch (level) {
case 0:
key = bl.province;
break;
case 1:
key = bl.city;
break;
case 2:
key = bl.county;
break;
case 3:
key = bl.area;
break;
case 4:
case 5:
key = bl.title;
break;
}

if (lmap.containsKey(key)) {
int num = lmap.get(key) + 1;
lmap.remove(key);
lmap.put(key, num);

} else {
lmap.put(key, 1);
billLocationMap.put(key, bl);
}
}

//清除所有maker
aMap.clear(false);

//这里将maker添加到地图上
Set<String> lset = lmap.keySet();
for (String key_set : lset) {
int num = lmap.get(key_set);
Marker localMarker = aMap.addMarker(new MarkerOptions()
.position(billLocationMap.get(key_set).point)
.icon(BitmapDescriptorFactory.fromView(getMyView(num))));
localMarker.setObject(localMarker);
}
}

只需要在onCameraChange()中调用该方法即可。
数据集需要自己从数据库中提取,这方面就略过了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: