Отображение 3D карты местности Mapbox v10 для Android

#java #android #mapbox #mapbox-android

Вопрос:

Я пытаюсь использовать новый картографический блок для Android v10, в частности, с новой функцией 3d-местности. Все примеры приведены в Kotlin, я следовал приведенному ниже онлайн-руководству, но постоянно сталкиваюсь с одним и тем же сообщением об ошибке.

Онлайн-пример:

 mapboxMap.loadStyle(
 styleExtension = style(Style.SATELLITE_STREETS) {
    rasterDemSource("TERRAIN_SOURCE") {
     url("mapbox://mapbox.mapbox-terrain-dem-v1")
   }
    terrain("TERRAIN_SOURCE") {
     exaggeration(1.1) 
   }
)
 

Ниже приведен код, который я использую:

 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);
        //mapView.getMapboxMap().loadStyleUri(Style.OUTDOORS);

        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"));
                rasterDemSource.url("mapbox://mapbox.mapbox-terrain-v2");

                List<StyleContract.StyleSourceExtension> ex = new ArrayList<StyleContract.StyleSourceExtension>();
                ex.add(rasterDemSource);

                return ex;
            }

            @NonNull
            @Override
            public List<StyleContract.StyleImageExtension> getImages() {

                return null;
            }

            @NonNull
            @Override
            public List<Pair<StyleContract.StyleLayerExtension, LayerPosition>> getLayers() {
                return null;
            }

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

            @Nullable
            @Override
            public StyleContract.StyleTerrainExtension getTerrain() {
                Terrain terrain = new Terrain("TERRAIN_SOURCE");
                terrain.exaggeration(1.1);

                return null;
            }
        };

        mapboxMap.loadStyle(styleExtension);
    }
}
 

Я продолжаю получать следующий код ошибки:

2021-11-02 17:21:39.439 23646-23646/com.пример.мое приложение с системой.ошибка: java.lang.Исключение NullPointerException: Попытка вызвать метод интерфейса ‘java.util.Итератор java.lang.Повторяемый.итератор()’ для ссылки на нулевой объект 2021-11-02 17:21:39.439 23646-23646/com.пример.мое приложение с системой.ошибка: в com.mapbox.maps.MapboxMap.onFinishLoadingStyleExtension$sdk_release(MapboxMap.kt:1349) 2021-11-02 17:21:39.439 23646-23646/com.пример.мое приложение с системой.ошибка: в com.mapbox.maps.MapboxMap$loadStyle$1.Загружено(MapboxMap.kt:163) 2021-11-02 17:21:39.439 23646-23646/ком.пример.мое приложение с системой.ошибка: в com.mapbox.maps.MapboxMap$Инициализирует загрузку$1.Загружено(MapboxMap.kt:214) 2021-11-02 17:21:39.439 23646-23646/com.пример.мое приложение с системой.ошибка: в com.mapbox.maps.StyleObserver.onStyleLoaded(StyleObserver.КТ:58) 2021-11-02 17:21:39.439 23646-23646/ком.пример.мое_приложение Вт/система.подстраховались: на ком.mapbox.карты.NativeObserver.уведомить(NativeObserver.КТ:61) 2021-11-02 17:21:39.439 23646-23646/ком.пример.мое_приложение Вт/система.ошибка:
в android.os.MessageQueue.nativePollOnce(собственный метод) 2021-11-02 17:21:39.439 23646-23646/ком.пример.мое_приложение Вт/система.ошибка ERR:
в Android.ОС.Объект messagequeue.далее(объект messagequeue.Ява:335) 2021-11-02 17:21:39.440 23646-23646/ком.пример.мое_приложение Вт/система.ошибка ERR:
в Android.ОС.Петлитель.петли(лупер.Ява:206) 2021-11-02 17:21:39.440 23646-23646/ком.пример.мое_приложение Вт/система.ошибка ERR: в Android.приложение.ActivityThread.основной(ActivityThread.Ява:8633) 2021-11-02 17:21:39.440 23646-23646/ком.пример.мое_приложение Вт/система.ошибка:
в Java.лэнг,подумай.Метод.вызов(Собственный метод) 2021-11-02 17:21:39.440 23646-23646/com.пример.мое приложение с системой.ошибка:
в com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 2021-11-02 17:21:39.440 23646-23646/com.пример.мое приложение с системой.ошибка: в com.android.внутренняя.ос.ZygoteInit.main(ZygoteInit.java:1130) 2021-11-02 17:21:39.446 23646-23646/com.пример.мое приложение E/libc abi: завершается с неперехваченным исключением типа jni::Исключение PendingJavaException 2021-11-02 17:21:39.447 23646-23646/com.пример.мое приложение A/libc: Фатальный сигнал 6 (SIGABRT), код -1 (SI_QUEUE) в tid 23646 (например, мое приложение), pid 23646 (например, мое приложение)

Ответ №1:

Оказывается, я неправильно использовал расширение стиля, теперь работает следующее:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mapView = findViewById(R.id.mapView);

        MapboxMap mapboxMap = mapView.getMapboxMap();

        mapboxMap.loadStyle(createStyle());
    }

    private StyleContract.StyleExtension createStyle() {
        StyleExtensionImpl.Builder builder = new StyleExtensionImpl.Builder(Style.SATELLITE);

        RasterDemSource rasterDemSource = new RasterDemSource(new RasterDemSource.Builder("TERRAIN_SOURCE").tileSize(514));
        rasterDemSource.url("mapbox://mapbox.mapbox-terrain-dem-v1");
        builder.addSource(rasterDemSource);

        Terrain terrain = new Terrain("TERRAIN_SOURCE");
        terrain.exaggeration(1.1);
        builder.setTerrain(terrain);

        return builder.build();
    }
 

Ответ №2:

 mapboxMap.loadStyle(
    styleExtension = style(Style.SATELLITE_STREETS) {
     rasterDemSource("TERRAIN_SOURCE") {
    url("mapbox://mapbox.mapbox-terrain-dem-v1")
    }
     terrain("TERRAIN_SOURCE") {
      exaggeration(1.1) 
    }
)
 

вместо этого попробуйте использовать

 mapboxMap.loadStyle(
    styleExtension = style(Style.SATELLITE) {
     rasterDemSource("TERRAIN_SOURCE") {
    url("mapbox://mapbox.mapbox-terrain-dem-v1")
    }
     terrain("TERRAIN_SOURCE") {
      exaggeration(1.1) 
    }
)
 

Надеюсь, это поможет, так как это сработало идеально для меня без каких-либо проблем.