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
相关产品推荐
相关产品推荐

