Android 百度地图 缩放级别 自适应
来源:互联网 发布:华大基因与阿里云 编辑:程序博客网 时间:2024/05/01 01:11
很多时候我们需要在百度地图上添加自己的多个Marker,可是如何做到多个Marker能够在同一个手机屏幕视野中显示出来呢?其实也就是控制百度地图的一个自身缩放级别。如下图:
首先,我们得了解百度地图Android SDK v3.5.0从3.5版本开始,它的缩放级别从3-20,总共18个级别,如下:
{"10m", "20m", "50m", "100m", "200m", "500m", "1km", "2km", "5km", "10km", "20km", "25km", "50km", "100km", "200km", "500km", "1000km", "2000km"}
Level依次为:20、19、18、17、16、15、14、13、12、11、10、9、8、7、6、5、4、3
比如上图中的两个Marker,我们可以先计算出两个点之间的距离,从而判断设置其Level。
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom("级别").build()));
最后,如何通过经纬度计算两个Marker之间的距离呢?贴出代码…….
/** * 计算两个Marker之间的距离 * @param terminal * @param latNLng */ private double calculateDistance() { double distance = GeoHasher.GetDistance(latitude01, longitude01, latitude02, longitude02); return distance; }
再给出一个工具类:
import java.util.HashMap;import java.util.Map;/** * 通过经纬度计算距离的工具类 * @author Botision.Huang */public class GeoHasher { private static String BASE32 = "0123456789bcdefghjkmnpqrstuvwxyz"; private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } public static String convertToString(char[] a) { String s = ""; for (int i = 0; i < a.length; i++) { s += a[i]; } return s; } public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * EARTH_RADIUS; return s; } public String encode_geohash(double latitude, double longitude, int precision) { char[] geohash = new char[precision + 1]; boolean is_even = true; int i = 0; double[] lat = new double[2]; double[] lon = new double[2]; double mid; char bits[] = { 16, 8, 4, 2, 1 }; int bit = 0, ch = 0; lat[0] = -90.0; lat[1] = 90.0; lon[0] = -180.0; lon[1] = 180.0; while (i < precision) { if (is_even) { mid = (lon[0] + lon[1]) / 2; if (longitude > mid) { ch |= bits[bit]; lon[0] = mid; } else lon[1] = mid; } else { mid = (lat[0] + lat[1]) / 2; if (latitude > mid) { ch |= bits[bit]; lat[0] = mid; } else lat[1] = mid; } is_even = !is_even; if (bit < 4) bit++; else { geohash[i++] = BASE32.charAt(ch); bit = 0; ch = 0; } } geohash[i] = 0; String s = ""; for (i = 0; i < geohash.length; i++) s += geohash[i]; return s; } public String[] expand(String geoStr) { String eastNeighbour = getEastNeighbour(geoStr); String westNeighbour = getWestNeighbour(geoStr); String northNeighbour = getNorthNeibour(geoStr); String southNeighbour = getSouthNeibour(geoStr); String[] expandGeoStr = { geoStr, eastNeighbour, westNeighbour, northNeighbour, southNeighbour, getNorthNeibour(westNeighbour), getNorthNeibour(eastNeighbour), getSouthNeibour(westNeighbour), getSouthNeibour(eastNeighbour) }; return expandGeoStr; } public String getEastNeighbour(String geoStr) { Map<String, Object> map = extractLonLatFromGeoStr(geoStr); long lon = (Long) map.get("lon") + 1; return getGeoStrFrom(lon, (String) map.get("latBitStr"), true); } public String getWestNeighbour(String geoStr) { Map<String, Object> map = extractLonLatFromGeoStr(geoStr); long lon = (Long) map.get("lon") - 1; return getGeoStrFrom(lon, (String) map.get("latBitStr"), true); } public String getNorthNeibour(String geoStr) { Map<String, Object> map = extractLonLatFromGeoStr(geoStr); long lat = (Long) map.get("lat") + 1; return getGeoStrFrom(lat, (String) map.get("lonBitStr"), false); } public String getSouthNeibour(String geoStr) { Map<String, Object> map = extractLonLatFromGeoStr(geoStr); long lat = (Long) map.get("lat") - 1; return getGeoStrFrom(lat, (String) map.get("lonBitStr"), false); } public Map<String, Object> extractLonLatFromGeoStr(String geoStr) { boolean is_even = true; char bits[] = { 16, 8, 4, 2, 1 }; int bit = 0, ch = 0; int geoIdx; String lonBitStr = ""; String latBitStr = ""; long lon = 0; long lat = 0; for (int i = 0; i < geoStr.length(); i++) { geoIdx = BASE32.indexOf(geoStr.charAt(i)); for (bit = 0; bit < 5; bit++) { ch = geoIdx & bits[bit]; if (is_even) { if (ch != 0) { lonBitStr += "1"; lon = lon * 2 + 1; } else { lonBitStr += "0"; lon = lon * 2; } } else { if (ch != 0) { latBitStr += "1"; lat = lat * 2 + 1; } else { latBitStr += "0"; lat = lat * 2; } } is_even = !is_even; } } Map<String, Object> map = new HashMap<String, Object>(); map.put("lonBitStr", lonBitStr); map.put("latBitStr", latBitStr); map.put("lat", lat); map.put("lon", lon); return map; } public String getGeoStrFrom(long lonOrLat, String lonOrLatStr, boolean isLon) { String lonBitStr = ""; String latBitStr = ""; if (isLon) { lonBitStr = Long.toBinaryString(lonOrLat); latBitStr = lonOrLatStr; } else { latBitStr = Long.toBinaryString(lonOrLat); lonBitStr = lonOrLatStr; } boolean is_even = true; String geoStr = ""; int ch, bit; int geoStrLength = (lonBitStr.length() + latBitStr.length()) / 5; for (int i = 0; i < lonBitStr.length();) { ch = 0; for (bit = 0; bit < 5; bit++) { if (is_even) ch = ch * 2 + lonBitStr.charAt(i) - '0'; else { if (i < latBitStr.length()) ch = ch * 2 + latBitStr.charAt(i) - '0'; else bit--; i++; } is_even = !is_even; } geoStr += BASE32.charAt(ch); if (geoStr.length() == geoStrLength) return geoStr; } return geoStr; }}
0 0
- Android 百度地图 缩放级别 自适应
- android 百度地图 获取缩放级别
- android/ios--百度地图控制当前地图缩放级别(解决方案)
- 关于百度地图缩放级别
- 关于百度地图缩放级别
- 百度地图设置缩放级别
- 百度地图 根据标注点坐标范围计算显示缩放级别zoom自适应显示地图
- Android 设置百度地图最大最小缩放级别
- 百度地图_设置缩放级别
- 百度地图API二:根据标注点坐标范围计算显示缩放级别zoom自适应显示地图
- 百度地图 Android 设置 InfoWindow 不同缩放级别均能居中(自定义偏移量)
- 百度地图API缩放级别和比例尺记录
- 百度地图设置缩放级别 ,只需一句话
- 百度地图动态的设置中心坐标和缩放级别
- Android百度地图,后台返回的坐标,设置地图中心位置,缩放比例自适应,弹出窗体等
- Android自定义百度地图缩放图标
- android 百度地图的缩放比例尺
- Android自定义百度地图缩放图标
- 让apache支持https的设置步骤
- PHP 保持中文编码 json_encode 函数
- 大规模分布式系统架构与设计实战
- 欢迎使用CSDN-markdown编辑器
- 使用SAX方式解析XML文件
- Android 百度地图 缩放级别 自适应
- windows 下安装redis
- django 1.8 官方文档翻译:2-1-1 模型语法
- 1007--反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- eclipse 中直接打开class文件设置
- 不需要ViewInject,简化你的findViewById
- jQuery 实现侧边浮动导航菜单效果
- 安卓学习之路之Fragment和Activity之间的传值
- 一篇详细的 Android onTouch事件传递机制