OSMDroid开发如何获取可见地图半径以适配API缩放参数要求
OSMDroid 当前可见地图半径获取实现
你不需要通过zoomLevel换算半径——和你iOS端MapKit的实现逻辑一致,OSMDroid本身提供了屏幕像素点与经纬度坐标互转的能力,可以直接算出和iOS端逻辑对齐的半径参数,跨端一致性更好,也不会因为设备屏幕尺寸、像素密度差异出现计算偏差。
实现逻辑
和你iOS端的逻辑完全对齐:
- 取屏幕左上角的像素原点(0,0),通过地图投影转换为对应经纬度坐标
- 取当前地图中心点的经纬度坐标
- 用和iOS端完全相同的公式计算两点的经纬度差值,开平方得到半径参数
- 如果需要实际物理距离(单位:米),可以直接调用OSMDroid内置的坐标距离计算方法
代码实现
import org.osmdroid.views.MapView import org.osmdroid.util.GeoPoint import kotlin.math.sqrt // 获取屏幕左上角对应的经纬度坐标 fun MapView.getTopLeftCoordinate(): GeoPoint { return projection.fromPixels(0, 0) as GeoPoint } // 获取和iOS端计算逻辑一致的经纬度半径 fun MapView.getCurrentRadius(): Double { val topLeftCoord = getTopLeftCoordinate() val centerCoord = mapCenter as GeoPoint return sqrt( Math.pow(centerCoord.latitude - topLeftCoord.latitude, 2.0) + Math.pow(centerCoord.longitude - topLeftCoord.longitude, 2.0) ) } // 如果需要单位为米的实际地理半径,用这个方法 fun MapView.getCurrentRadiusInMeters(): Double { val topLeftCoord = getTopLeftCoordinate() val centerCoord = mapCenter as GeoPoint return centerCoord.distanceTo(topLeftCoord) }
使用提示
- 不要依赖
zoomLevel换算半径:同缩放等级下,不同屏幕尺寸、像素密度的设备可见地图范围差异很大,换算结果误差会非常明显 - 注意计算时机:建议在地图拖动、缩放操作结束后再调用方法获取半径,避免拿到未更新的投影参数导致结果不准,可以通过给
MapView设置地图监听器,在回调触发时更新参数传给自有API
内容的提问来源于stack exchange,提问作者Nathan Fallet
相关产品推荐
相关产品推荐

