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

时间:2011-11-15 13:05:19

标签: android sqlite maps osmdroid

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

请建议我。

提前致谢。

2 个答案:

答案 0 :(得分:22)

Osmdroid中的地图图块由地图图块提供商提供。 Osmdroid使用的默认磁贴提供程序是MapTileProviderBasic。此提供程序扩展MapTileProviderArray,这意味着它是一些其他磁贴提供程序的数组 - 当请求磁贴时,这些磁贴提供程序将逐个询问磁贴图像,直到其中一个提供它。看一下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);
}

有三个地图图块提供程序按顺序添加到提供程序数组中:

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

因此MapTileProviderBasic首先在文件系统中查找给定的磁贴,如果磁贴不可用,则它会在归档文件中查找它,如果它不可用,则再次从Internet下载磁贴

好的,这是默认机制。如果要更改此机制以查找存储在数据库中的切片,则可以创建类似于MapTileProviderBasic的类。因此,您的类也可以扩展MapTileProviderArray并在构造函数中使用其他提供程序。在Osmdroid中有一个类DatabaseFileArchive,它可以帮助您从数据库中读取切片。

创建自己的磁贴提供程序后,您应该使用它而不是默认的。地图图块提供程序已附加到MapViewMapView的一些构造函数将MapTileProviderBase作为参数 - 您可以使用其中一个来附加您自己的提供者。

答案 1 :(得分:1)

让离线地图与默认提供商MapTileProviderBasic配合使用的最简单方法是将地图中的地图放入OSMDROID_PATH

换句话说,将.zip, .sqlite, .mbtiles.gemf文件下载到osmdroid/目录中。

如果您查看MapTileFileArchiveProvider,则会在ArchiveFileFactory中调用getArchiveFiles(),根据文件扩展名选择正确的存档提供程序。