我有一个项目也需要在离线模式下显示地图数据。我也使用过 OpenStreet 地图。我已经保存了地图图像(图块),并且每个图块都由数据库中的 tilekey 引用。我想从数据库中访问这些地图图块并相应地使用它们。
请给我建议。
提前致谢。
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
. MapView
takeMapTileProviderBase
作为参数的一些构造函数 - 您可以使用其中一个来附加您自己的提供程序。
让离线地图与默认提供程序一起使用的最简单方法MapTileProviderBasic
是将您的地图档案库放入OSMDROID_PATH
.
换句话说,将您的.zip, .sqlite, .mbtiles
or.gemf
文件下载到osmdroid/
目录中。
如果您查看它,您MapTileFileArchiveProvider
会看到它调用其中根据文件扩展名选择正确的存档提供程序。getArchiveFiles()
ArchiveFileFactory