Android端MapBox显示多地球时无法获取未包裹坐标范围
Android MapBox 无法获取跨180°经线的未包裹可见范围
问题描述
在Android端MapBox中,缩小地图到能显示多个地球副本时,单张地图经度范围为-180至180,此时预期可见经度范围约为-240至240,但调用coordinateBoundsForCameraUnwrapped和coordinateBoundsForCamera获取的包裹与未包裹范围均为-121至116,未包裹结果仍被限制在-180/180范围内。
代码片段
val options = CameraOptions.Builder().zoom(mapboxMap.cameraState.zoom) .center(mapboxMap.cameraState.center) .bearing(mapboxMap.cameraState.bearing) .pitch(mapboxMap.cameraState.pitch) .build() val unwrappedBounds = mapboxMap.coordinateBoundsForCameraUnwrapped(options) val wrappedBounds = mapboxMap.coordinateBoundsForCamera(options) println("Wrapped: $wrappedBounds") println("Unwrapped: $unwrappedBounds")
日志结果
Wrapped: [southwest: Point{type=Point, bbox=null, coordinates=[-121.1356988416266,-82.59314961488414]}, northeast: Point{type=Point, bbox=null, coordinates=[116.56624773466814, 82.94613012791345]}, infiniteBounds: false] Unwrapped: [southwest: Point{type=Point, bbox=null, coordinates=[-121.1356988416266, -82.59314961488414]}, northeast: Point{type=Point, bbox=null, coordinates=[116.56624773466814, 82.94613012791345]}, infiniteBounds: false]
解决方案
coordinateBoundsForCameraUnwrapped的设计是返回相对于相机中心的未包裹范围,但当可见范围跨越多个地球副本时,它不会自动扩展到-180/180以外的偏移经度。要获取预期的跨副本可见范围,需要手动计算:
- 先获取包裹后的边界,计算经度跨度
- 根据相机中心的经度,推导未包裹的实际边界
代码示例:
val wrappedBounds = mapboxMap.coordinateBoundsForCamera(options) val centerLongitude = mapboxMap.cameraState.center.longitude // 计算经度跨度 val lonSpan = wrappedBounds.northeast.longitude - wrappedBounds.southwest.longitude // 计算未包裹的西南、东北经度 val unwrappedSouthwestLon = centerLongitude - lonSpan / 2 val unwrappedNortheastLon = centerLongitude + lonSpan / 2 // 构造未包裹的边界 val unwrappedSouthwest = Point.fromLngLat(unwrappedSouthwestLon, wrappedBounds.southwest.latitude) val unwrappedNortheast = Point.fromLngLat(unwrappedNortheastLon, wrappedBounds.northeast.latitude) val actualUnwrappedBounds = LatLngBounds.fromPoints(unwrappedSouthwest, unwrappedNortheast) println("Actual Unwrapped Bounds: $actualUnwrappedBounds")
原理说明
- 包裹后的边界经度跨度等于当前可见范围的实际跨度,不受-180/180限制
- 相机中心的经度是未包裹的真实经度(可能超出-180/180),以此为基准,加减跨度的一半就能得到真实的未包裹边界
- 纬度范围不受跨副本影响,直接复用包裹后的结果
内容的提问来源于stack exchange,提问作者jsdev
相关产品推荐
相关产品推荐

