android - 如何通过将 map 图 block 图像保存到 sqlite 数据库中来使用 osmdroid 实现离线 map ?

标签 android sqlite maps osmdroid

我有一个项目也需要在离线模式下显示 map 数据。我同样使用了 OpenStreet map 。我已经保存了 map 图像(图 block ),每个图 block 都由数据库中的图 block 键引用。我想从数据库访问这些 map 图 block 并相应地使用它们。

请给我建议。

提前致谢。

最佳答案

Osmdroid 中的 map 图 block 由 map 图 block 提供商提供。 Osmdroid 使用的默认图 block 提供程序是 MapTileProviderBasic .该提供商扩展了 MapTileProviderArray ,这意味着它是一些其他图 block 提供者的数组 - 当请求一个图 block 时,这些图 block 提供者将一个一个地询问图 block 图像,直到其中一个提供它。看一下 MapTileProviderBasic 的构造函数:

public MapTileProviderBasic(final IRegisterReceiver pRegisterReceiver,
              final INetworkAvailablityCheck aNetworkAvailablityCheck, 
                                        final ITileSource pTileSource) {

    super(pTileSource, pRegisterReceiver);    
    final TileWriter tileWriter = new TileWriter();

    final MapTileFilesystemProvider fileSystemProvider = 
        new MapTileFilesystemProvider(pRegisterReceiver, pTileSource);
    mTileProviderList.add(fileSystemProvider);

    final MapTileFileArchiveProvider archiveProvider = 
        new MapTileFileArchiveProvider(pRegisterReceiver, pTileSource);
    mTileProviderList.add(archiveProvider);

    final MapTileDownloader downloaderProvider = 
        new MapTileDownloader(pTileSource, tileWriter, aNetworkAvailablityCheck);
    mTileProviderList.add(downloaderProvider);
}

已将三个 map 图 block 提供程序添加到提供程序数组中,顺序如下:

  • MapTileFilesystemProvider - 从文件系统(SD 卡目录)提供图 block
  • MapTileFileArchiveProvider - 提供文件系统中存档的切片
  • MapTileDownloader - 通过从 Internet(例如从 OSM 服务器)下载切片来提供切片

因此 MapTileProviderBasic 首先在文件系统中查找给定的图 block ,如果该图 block 不可用,则它会在存档文件中查找,如果不可用,则再次下载该图 block 来自互联网。

好的,这是默认机制。如果您想更改此机制以查找存储在数据库中的图 block ,那么您可以创建自己的类似于 MapTileProviderBasic 的类。因此,您的类还可以扩展 MapTileProviderArray 并仅在构造函数中使用其他提供程序。在 Osmdroid 中有一个类 DatabaseFileArchive这可能会帮助您从数据库中读取图 block 。

创建自己的 tile provider 后,您应该使用它而不是默认的。 map 图 block 提供程序附加到 MapViewMapView 的一些构造函数将 MapTileProviderBase 作为参数 - 您可以使用其中之一来附加您自己的提供程序。

关于android - 如何通过将 map 图 block 图像保存到 sqlite 数据库中来使用 osmdroid 实现离线 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8136775/

相关文章:

Android wear Wearable ListView ImageView 选择器

c# - 如何在 OncreateView 中运行一些异步的东西?

android - 尝试写一个只读数据库......但我不是

android:关闭游标后是否需要关闭Db

android - Google map (Android) 中的图像

Android 相机 Intent 在 RESULT_OK 情况下不返回

android - 如何制作自定义 map 演示

javascript - 获取多边形中每个点的纬度和经度 - Google Maps API v3

php - SQLite 作为 session 存储

azure - 是否可以通过 Azure Maps API 中的 ID 获取地点?