You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何mapBoxMap.elevation(at:)调用始终返回nil?

问题分析

你在Mapbox中添加地形数据源后,调用elevation(at:)始终返回nil,主要可能是以下原因导致:

  • 地形数据源未完全加载就执行查询,异步加载的瓦片还未就绪
  • 测试坐标不在mapbox.mapbox-terrain-dem-v1数据源的覆盖范围内
  • RasterDemSource缺少必要配置参数,导致数据源解析异常
  • 地形设置过程中的隐性错误被忽略,未完成正确挂载

解决步骤

  1. 等待地形数据源加载完成后再查询
    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)")
    }
}
  1. 完善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)")
}
  1. 验证测试坐标的有效性
    确保测试坐标在地形数据源覆盖范围内(优先使用陆地坐标,如北京:39.9042, 116.4074),避免使用海洋、极地等无高程数据的区域。

  2. 移除错误忽略逻辑
    不要用try!跳过数据源添加的错误捕获,通过do-catch确认数据源是否成功挂载,排查潜在配置问题。


内容的提问来源于stack exchange,提问作者Gustavo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:32:13