android - 具有自定义 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....)
有任何想法吗?
解决方案
- 我明白了
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 将其设置为公开。您
VectorSource
在代码中使用 a 。https://github.com/mapbox/mapbox-android-demo/search?q=VectorSource&unscoped_q=VectorSource显示VectorSource
了 Mapbox 演示应用程序中的使用情况。演示应用示例也位于https://docs.mapbox.com/android/maps/examples。
如果您使用的是
RasterSource
,请参阅演示应用程序中的https://github.com/mapbox/mapbox-android-demo/search?q=RasterSource&unscoped_q=RasterSourceRasterSource
用法。可能是您错误地初始化了各种源对象。
一般来说,如果您可以解释您要添加的数据类型,我可能会为您提供进一步的帮助。您还可以将所需的数据添加到 Mapbox Studio 中的样式,而不是设备上的运行时。然后,您所要做的就是加载样式。
推荐阅读
- excel - VBA:创建数据透视表
- excel - 如何计算具有多个范围的数字范围之间的每个值?
- google-apps-script - Google Forms Add-On - 安装插件后初始加载时菜单项未出现
- sql - 如何在 SQL 中计算百分比
- c# - 在文本框中输入相同的文本/字符串时如何获得另一个输出?
- javascript - Fabric.js:如何在组变大时防止文本模糊
- android-things - 有什么方法可以识别连接到覆盆子的多个 USB-uart 设备?
- mysql - 如何将带有西班牙字符(á、é、í、ó、ú、ñ)的 CSV 文件 utf-8 导入到 phpmyadmin 中的表格中
- laravel - 从 Laravel 中的 .env 获取 .data 到 Laravel Nova Card - vue 组件
- r - 重新排序相关矩阵的列和行以匹配数值向量