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