8

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

请给我建议。

提前致谢。

4

2 回答 2

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- 通过从 Internet(例如从 OSM 服务器)下载瓷砖来提供瓷砖

因此,MapTileProviderBasic首先在文件系统中查找给定的图块,如果该图块不可用,则它在存档文件中查找它,如果在那里不可用,它会从 Internet 下载该图块。

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

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

于 2011-11-27T14:34:30.843 回答
1

让离线地图与默认提供程序一起使用的最简单方法MapTileProviderBasic是将您的地图档案库放入OSMDROID_PATH.

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

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

于 2014-12-15T12:55:44.517 回答