我有一个项目需要在离线模式下显示地图数据。我已经使用了OpenStreet maps。我保存了地图图像(瓷砖),每个瓷砖都在数据库中通过一个瓷砖密钥进行引用。我想从数据库中访问这些地图瓷砖并相应地使用它们。
请给我建议。
提前感谢您。
请给我建议。
提前感谢您。
在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
首先在文件系统中查找给定的瓷片,如果瓷片不可用,则在归档文件中查找,如果在那里也不可用,则从互联网下载该瓷片。
好的,这是默认机制。如果您想将此机制更改为查找存储在数据库中的瓷砖,则可以创建类似于 MapTileProviderBasic
的自己的类。因此,您的类也可以扩展 MapTileProviderArray
,并仅在构造函数中使用其他提供程序。在 Osmdroid 中有一个名为DatabaseFileArchive 的类,它可能会帮助您从数据库中读取图块。
创建自己的瓷砖提供程序后,您应该使用它代替默认提供程序。地图瓷片提供程序附加到 MapView
上。 MapView
的一些构造函数将 MapTileProviderBase
作为参数 - 您可以使用其中之一将自己的提供程序附加。
MapTileProviderBasic
配合使用的最简单方法是将地图存档放入OSMDROID_PATH
中。.zip、.sqlite、.mbtiles
或.gemf
文件下载到osmdroid/
目录中。MapTileFileArchiveProvider
,您会发现它调用ArchiveFileFactory
中的getArchiveFiles()
,该工厂根据文件扩展名选择正确的存档提供程序。