如何通过将地图切片图像保存到 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 可能会帮助您从数据库中读取磁贴。

创建您自己的磁贴提供程序后,您应该使用它而不是默认的。地图切片提供者附加到MapViewMapView 的一些构造函数将 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获取路径来显示文档目录中保存的图像

如何从API加载图像并将其保存到sqlite数据库中?

如何使用 sqlite 将我的图像保存到数据库中? [关闭]

如何解码保存到 SQLite 数据库并在 ImageView 中显示的图像文件路径