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()中调用该方法即可。
数据集需要自己从数据库中提取,这方面就略过了。
相关文章推荐
- Android基于mAppWidget实现手绘地图(六)–如何展示地图对象
- 【Android】基于andengine游戏引擎的简单游戏实现(模拟控制器、tiledmap地图)
- 九、android的ListView实现数据列表展示
- Android实战简易教程-第十六枪(LineChart实现数据趋势展示)
- Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件
- Android基于mAppWidget实现手绘地图(五)--如何创建地图资源
- 基于 android 数据备份恢复的一种实现
- Android基于WIFI实现电脑和手机间数据传输的技术方案研究
- 基于Java LinkedList,实现Android大数据缓存策略
- Android中ListView实现展示列表数据
- 基于 android 数据备份恢复的一种实现
- Android基于WIFI实现电脑和手机间数据传输的技术方案研究
- android客户端和网站数据交互的实现(基于Http协议获取数据方法)
- Android基于WIFI实现电脑和手机间数据传输的技术方案研究
- php和jquery实现地图区域数据统计展示数据示例
- Android基于WIFI实现电脑和手机间数据传输的技术方案研究
- 基于 android 数据备份恢复的一种实现
- android客户端和网站数据交互的实现(基于Http协议获取数据方法)
- Android基于mAppWidget实现手绘地图(八)–获取用户地理位置
- Android基于mAppWidget实现手绘地图(二)--概要