Mapbox Android 带有在线自定义 MBTiles 的 SDK

Mapbox Android SDK with online custom MBTiles

我已经开始使用 Mapbox Android SDK 构建 android 应用程序。我想使用从 Tilemill 创建的自定义 mbtiles 文件。我正在按照此说明进行操作

Code to Display the Tilemills mbtiles in android project

我已经成功地实现了这段代码并且运行良好。但问题是,当我构建 APK 时,它变成了一个巨大的文件,因为我的 MBTiles 文件太大了。这就是打开应用程序需要很长时间的原因。有什么方法可以从 http://www.example.com/mymap.mbtiles 等在线服务器存储访问 MBTiles 文件?我已经用下面的代码尝试了 MapView Activity 但没有得到任何运气

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MapView mapView = (MapView) findViewById(R.id.mapview);
        mapView.setZoom(10);
        mapView.setCenter(new LatLng(38.8977, -77.0365));
        mapView.setTileSource(new MBTilesLayer(this, "http://www.example.com/mymap.mbtiles"));

XML 文件包含

<com.mapbox.mapboxsdk.views.MapView
    android:id="@+id/mapview
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

在我看来,您在问题中使用的 API 现在已弃用,取而代之的是 mapbox-gl-native 项目。但是,根据我在此处和 GitHub 上的其他答案中发现的内容,可能有一种方法可以实现您想要做的事情:

  1. 使用 mb-util.
  2. 将您的 .mbtiles 文件提取为 .png 瓦片文件和一个 .json 文件
  3. 在服务器上托管这些文件。
  4. 使用 TileJsonTileLayer 而不是 MBTilesLayer 访问在线磁贴。在 mapbox-android-sdk-legacy 项目的#742 问题中可以找到这样做的尝试。

如果它不起作用,我很抱歉。这是我目前能想到的最好的,因为我没有时间自己实现它。

要在 Mapbox 或 Maplibre 中显示您自己的矢量 MBTiles 文件,您基本上只需要指向 MBTiles 文件作为您样式中矢量数据的来源 JSON。

在样式 JSON 的 sources 标签中,您需要将可能指向另一个 JSON 的 url 值替换为这种格式

mbtiles://<file-uri>

可能看起来像这样

mbtiles://file:///data/user/0/com.example.maplibretest/cache/india_coimbatore.mbtiles

这将指示 SDK 使用此链接的 MBTiles 文件作为矢量数据源而不是在线源。为了让你设置这个自定义 JSON 作为你的风格,你需要在你的应用程序中打包一个 JSON ,将它复制到你可以编辑它的地方,将你的 MBTiles 文件的 Uri 添加到 url 然后将 JSON 文件样式设置为 Mapbox 或 Maplibre SDK。您还可以从在线资源中获取样式 JSON,对其进行编辑,然后将其提供给 SDK。

我在这篇博文中详细描述了整个过程 - https://medium.com/@ty2/how-to-display-offline-maps-using-maplibre-mapbox-39ad0f3c7543