具有自定义 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....)
有什么想法吗?
- 我明白了
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) {
}
});
您的图块集是否来自 Mapbox Tilesets API?如果是:
确保图块集是 public
。您可以通过 Mapbox Studio 设置 public。
您在代码中使用了 VectorSource
。 https://github.com/mapbox/mapbox-android-demo/search?q=VectorSource&unscoped_q=VectorSource shows VectorSource
usage in the Mapbox demo app. The demo app example are also at https://docs.mapbox.com/android/maps/examples.
如果您使用的是 RasterSource
,请参阅演示应用程序中 https://github.com/mapbox/mapbox-android-demo/search?q=RasterSource&unscoped_q=RasterSource 的 RasterSource
用法。可能是您错误地初始化了各种源对象。
一般来说,如果您能解释一下您要添加的数据类型,我或许可以为您提供进一步的帮助。您还可以将所需的数据添加到 Mapbox Studio 中的样式,而不是在设备上的运行时。然后,您所要做的就是加载样式。
如何向 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....)
有什么想法吗?
- 我明白了
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) {
}
});
您的图块集是否来自 Mapbox Tilesets API?如果是:
确保图块集是
public
。您可以通过 Mapbox Studio 设置 public。您在代码中使用了
VectorSource
。 https://github.com/mapbox/mapbox-android-demo/search?q=VectorSource&unscoped_q=VectorSource showsVectorSource
usage in the Mapbox demo app. The demo app example are also at https://docs.mapbox.com/android/maps/examples.
如果您使用的是
RasterSource
,请参阅演示应用程序中 https://github.com/mapbox/mapbox-android-demo/search?q=RasterSource&unscoped_q=RasterSource 的RasterSource
用法。可能是您错误地初始化了各种源对象。
一般来说,如果您能解释一下您要添加的数据类型,我或许可以为您提供进一步的帮助。您还可以将所需的数据添加到 Mapbox Studio 中的样式,而不是在设备上的运行时。然后,您所要做的就是加载样式。