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

Android端Mapbox v10 Java实现3D地形空指针异常问题求助

问题原因
  • 多个接口方法返回null触发空指针:你重写的getImages()、getLayers()方法直接返回了null,Mapbox SDK加载样式扩展时会遍历这些集合,没有对应配置也必须返回空集合,不能返回null。
  • 地形配置未生效:getTerrain()方法中已经创建了Terrain实例,但最终返回了null,等于没有传入地形配置。
  • 高程数据源地址错误:你使用的mapbox://mapbox.mapbox-terrain-v2是矢量地形数据源,3D地形需要的DEM高程数据源正确地址为mapbox://mapbox.mapbox-terrain-dem-v1。
修复后的完整实现代码
public class MainActivity extends AppCompatActivity {    
    private MapView mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapView = findViewById(R.id.mapView);
        MapboxMap mapboxMap = mapView.getMapboxMap();

        StyleContract.StyleExtension styleExtension = new StyleContract.StyleExtension() {
            @NonNull
            @Override
            public String getStyleUri() {
                return Style.SATELLITE;
            }

            @NonNull
            @Override
            public List<StyleContract.StyleSourceExtension> getSources() {
                RasterDemSource rasterDemSource = new RasterDemSource(new RasterDemSource.Builder("TERRAIN_SOURCE"));
                // 修正为正确的DEM高程数据源地址
                rasterDemSource.url("mapbox://mapbox.mapbox-terrain-dem-v1");
                List<StyleContract.StyleSourceExtension> ex = new ArrayList<>();
                ex.add(rasterDemSource);
                return ex;
            }

            @NonNull
            @Override
            public List<StyleContract.StyleImageExtension> getImages() {
                // 没有图片配置返回空集合,不能返回null
                return new ArrayList<>();
            }

            @NonNull
            @Override
            public List<Pair<StyleContract.StyleLayerExtension, LayerPosition>> getLayers() {
                // 没有额外图层配置返回空集合,不能返回null
                return new ArrayList<>();
            }

            @Nullable
            @Override
            public StyleContract.StyleLightExtension getLight() {
                return null;
            }

            @Nullable
            @Override
            public StyleContract.StyleTerrainExtension getTerrain() {
                Terrain terrain = new Terrain("TERRAIN_SOURCE");
                terrain.exaggeration(1.1);
                // 修正:返回创建好的地形实例,不要返回null
                return terrain;
            }
        };

        mapboxMap.loadStyle(styleExtension);
    }

    // 补充MapView必要的生命周期回调
    @Override
    protected void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }
}
更简洁的可选实现方案

你也可以先加载基础样式,等样式加载完成后再添加数据源和地形,代码更简洁:

mapboxMap.loadStyle(Style.SATELLITE, style -> {
    // 添加DEM高程数据源
    RasterDemSource demSource = new RasterDemSource(new RasterDemSource.Builder("TERRAIN_SOURCE")
            .url("mapbox://mapbox.mapbox-terrain-dem-v1"));
    style.addSource(demSource);
    // 设置地形
    Terrain terrain = new Terrain("TERRAIN_SOURCE").exaggeration(1.1);
    style.setTerrain(terrain);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:02