如何通过将地图切片图像保存到 sqlite 数据库来使用 osmdroid 实现离线地图?
Posted
技术标签:
【中文标题】如何通过将地图切片图像保存到 sqlite 数据库来使用 osmdroid 实现离线地图?【英文标题】:How can I implement offline maps using osmdroid by saving map tiles images into sqlite database? 【发布时间】:2011-12-29 12:32:40 【问题描述】:我有一个项目也需要在离线模式下显示地图数据。我也使用过 OpenStreet 地图。我已经保存了地图图像(图块),并且每个图块都由数据库中的 tilekey 引用。我想从数据库中访问这些地图图块并相应地使用它们。
请给我建议。
提前致谢。
【问题讨论】:
您能详细说明您是如何保存这些地图图块的吗 您可以使用mobac.sourceforge.net将地图文件下载到您的android应用程序,并使用osmandroid或mapsforge等库来使用您下载的地图 然后..您在 mobac 中使用哪种格式来创建地图? @AyushVerma 【参考方案1】: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 下载该图块。
好的,这是默认机制。如果您想更改此机制以查找存储在数据库中的图块,那么您可以创建自己的类,类似于MapTileProviderBasic
。所以你的类也可以扩展 MapTileProviderArray
并在构造函数中使用其他提供者。在 Osmdroid 中有一个类 DatabaseFileArchive 可能会帮助您从数据库中读取磁贴。
创建您自己的磁贴提供程序后,您应该使用它而不是默认的。地图切片提供者附加到MapView
。 MapView
的一些构造函数将 MapTileProviderBase
作为参数 - 您可以使用其中一个来附加您自己的提供程序。
【讨论】:
感谢 Piotr 付出的巨大努力。我是 Android 新手,我查看了 jar 文件。我刚刚找到了上面的代码并找到了我必须去的地方。但我尝试了 2 天,但我无法继续。如果您为此提供示例代码,将会更有帮助。在此先感谢 Piotr。 @Piotr,您能否更新答案中的链接,因为它们不起作用... @Pallavi,好的,链接已更新(osmdroid 更改了它们的存储库结构)。【参考方案2】:让离线地图与默认提供程序 MapTileProviderBasic
一起工作的最简单方法是将您的地图库放在 OSMDROID_PATH
中。
换句话说,将您的.zip, .sqlite, .mbtiles
或.gemf
文件下载到osmdroid/
目录中。
如果您查看MapTileFileArchiveProvider
,您会看到它在ArchiveFileFactory
中调用getArchiveFiles()
,它会根据文件扩展名选择正确的存档提供程序。
【讨论】:
它只显示空的 MapView。没有显示 Tile 做什么。 @MaharithAdityaSS 确保您已将地图定位在离线地图覆盖的区域上,并且缩放级别在离线地图覆盖范围内 由于地图大小,我想加载从 OpenMapTiles.org 获得的矢量切片。有没有其他办法。请帮帮我。我完全迷路了。 @MaharithAdityaSS 如果您的预算允许,只需从此处获取示例openmaptiles.org/docs/mobile/mobile - 你真的想从 OSMDroid 切换到 MapBox 有没有开源的以上是关于如何通过将地图切片图像保存到 sqlite 数据库来使用 osmdroid 实现离线地图?的主要内容,如果未能解决你的问题,请参考以下文章
如何将从 UIImagePickerViewController 中选择的图像路径保存到 sqlite 数据库并稍后访问它? IOS
如何通过iphone中的sqlite获取路径来显示文档目录中保存的图像