首页 > 解决方案 > 具有自定义 Tileset 或样式的 Mapbox NavigationView

问题描述

如何将一个图块集添加到 NavigationView?

我的第一次尝试是使用 Mapbox Studio 创建一个完整的样式并将一个图块集链接到它。然后我将样式添加到 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:尝试在 com.mapbox.services.android.navigation.ui.v5 的空对象引用上调用虚拟方法“java.util.List com.mapbox.mapboxsdk.maps.Style.getSources()” .map.NavigationMapboxMap.initializeWayName(NavigationMapboxMap.java:668) 在 com.mapbox.services.android.navigation.ui.v5.map.NavigationMapboxMap.addProgressChangeListener(NavigationMapboxMap.java:277) 在 com.mapbox.services.android.navigation .ui.v5.NavigationView.initializeNavigationListeners(NavigationView.java:691) 在 com.mapbox.services.android.navigation.ui.v5.NavigationView.initializeNavigation(NavigationView.java:632) 在 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

--------- 崩溃开始 2020-02-28 15:49:32.835 A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),故障地址 0x681713e80325b4 in tid 29828 (oid.med. ...), pid 29828 (oid.med....)

有任何想法吗?

标签: androidmapboxnavigationview

解决方案


  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 中的样式,而不是设备上的运行时。然后,您所要做的就是加载样式。


推荐阅读