为何mapBoxMap.elevation(at:)调用始终返回nil?
问题分析
你在Mapbox中添加地形数据源后,调用elevation(at:)始终返回nil,主要可能是以下原因导致:
- 地形数据源未完全加载就执行查询,异步加载的瓦片还未就绪
- 测试坐标不在
mapbox.mapbox-terrain-dem-v1数据源的覆盖范围内 RasterDemSource缺少必要配置参数,导致数据源解析异常- 地形设置过程中的隐性错误被忽略,未完成正确挂载
解决步骤
- 等待地形数据源加载完成后再查询
Mapbox地形数据是异步加载的,需监听数据源加载状态,确保就绪后再调用高程查询:
// 监听指定数据源加载完成事件 mapView.mapboxMap.style.onNext(.sourceDataLoaded) { [weak self] event in guard event.sourceId == "sourceId", event.isLoaded else { return } // 数据源加载完成,执行高程查询 let targetCoordinate = CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude) if let elevation = self?.mapView.mapboxMap.elevation(at: targetCoordinate) { print("DEBUG:: Elevation: \(elevation)") } }
- 完善RasterDemSource配置
创建数据源时补充tileSize参数(匹配Mapbox地形瓦片尺寸):
let style = mapView.mapboxMap.style do { var source = RasterDemSource() source.url = "mapbox://mapbox.mapbox-terrain-dem-v1" source.tileSize = 512 // 必须配置,否则可能导致数据加载异常 try style.addSource(source, id: "sourceId") let terrain = Terrain(sourceId: "sourceId") try mapView.mapboxMap.style.setTerrain(terrain) } catch { print("地形配置错误: \(error.localizedDescription)") }
验证测试坐标的有效性
确保测试坐标在地形数据源覆盖范围内(优先使用陆地坐标,如北京:39.9042, 116.4074),避免使用海洋、极地等无高程数据的区域。移除错误忽略逻辑
不要用try!跳过数据源添加的错误捕获,通过do-catch确认数据源是否成功挂载,排查潜在配置问题。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

