具有自定义 Tileset 或 Style 的 Mapbox NavigationView

Mapbox NavigationView with custom Tileset or Style

如何向 NavigationView 添加一个图块集?

我的第一个尝试是使用 Mapbox Studio 创建一个完整的样式,link 为它创建一个 tileset。然后我将样式添加到 Fragment

内的 NavigationView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    [...]

    // Mapbox
    navigationView = view.findViewById(R.id.mapboxNavigationView);
    navigationView.onCreate(null);

    [...]

    navigationView.initialize(this, initialPosition);

    return view;
}



@SuppressLint("MissingPermission")
@Override
public void onNavigationReady(boolean isRunning) {
    mapboxMap = navigationView.retrieveNavigationMapboxMap().retrieveMap();

    mapboxMap.setStyle("mySecretStyle", new Style.OnStyleLoaded() {
        @Override
        public void onStyleLoaded(@NonNull Style style) {
            // Never called ...
        }
    });
}

如您所见,样式添加成功。

但是出现如下错误,没有导航开始

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.mapbox.mapboxsdk.maps.Style.getSources()' on a null object reference at com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap.initializeWayName(NavigationMapboxMap.java:668) at com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap.addProgressChangeListener(NavigationMapboxMap.java:277) at com.mapbox.services.android.navigation.ui.v5.NavigationView.initializeNavigationListeners(NavigationView.java:691) at com.mapbox.services.android.navigation.ui.v5.NavigationView.initializeNavigation(NavigationView.java:632) at com.mapbox.services.android.navigation.ui.v5.NavigationView.startNavigation(NavigationView.java:394)

我的第二种方法是只添加一个在 Mapbox Studio 上传的图块集:

@Override
public void onNavigationReady(boolean isRunning) {
    mapboxMap = navigationView.retrieveNavigationMapboxMap().retrieveMap();

    mapboxMap.getStyle(new Style.OnStyleLoaded() {
        @Override
        public void onStyleLoaded(@NonNull Style style) {   
            String sourceId = "indoor-source";
            style.addSource(new RasterSource(sourceId, "mytileid"));
            String layerId = "indoor-layer";
            RasterLayer rasterLayer = new RasterLayer(layerId, sourceId);
            style.addLayer(rasterLayer);
        }
    });
}

但这也不起作用 - 但至少导航是 运行 默认导航样式。

我的第三次尝试(使用有效的样式)

@Override
public void onNavigationRunning() {
    navigationView.retrieveNavigationMapboxMap().retrieveMap().setStyle("mySecretStyle");
}

...结果为 SIGSEGV

--------- beginning of crash 2020-02-28 15:49:32.835 A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x681713e80325b4 in tid 29828 (oid.med....), pid 29828 (oid.med....)

有什么想法吗?

  1. 我明白了mapboxMap.setStyle("mySecretStyle",。您只是通过您的样式 ID 而不是 mySecretStyle 吗?如果是这样,您应该改用 new Style.Builder().fromUri()
mapboxMap.setStyle(new Style.Builder().fromUri("styleIdHere"), new Style.OnStyleLoaded() {
          @Override
          public void onStyleLoaded(@NonNull Style style) {


          }
        });
  1. 您的图块集是否来自 Mapbox Tilesets API?如果是:

  2. 如果您使用的是 RasterSource,请参阅演示应用程序中 https://github.com/mapbox/mapbox-android-demo/search?q=RasterSource&unscoped_q=RasterSourceRasterSource 用法。可能是您错误地初始化了各种源对象。

一般来说,如果您能解释一下您要添加的数据类型,我或许可以为您提供进一步的帮助。您还可以将所需的数据添加到 Mapbox Studio 中的样式,而不是在设备上的运行时。然后,您所要做的就是加载样式。