如何使用osmdroid实现离线地图,将地图瓦片图像保存到sqlite数据库中?

8
我有一个项目需要在离线模式下显示地图数据。我已经使用了OpenStreet maps。我保存了地图图像(瓷砖),每个瓷砖都在数据库中通过一个瓷砖密钥进行引用。我想从数据库中访问这些地图瓷砖并相应地使用它们。
请给我建议。
提前感谢您。

你能详细说明一下你是如何保存那些地图瓦片的吗? - Muhammad Umar
你可以使用http://mobac.sourceforge.net/下载地图文件到你的安卓应用程序中,并使用类似osmandroid或mapsforge的库来利用你下载的地图。 - thewhitetulip
然后..你在Mobac中使用哪种格式来创建地图?@AyushVerma - gumuruh
2个回答

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 首先在文件系统中查找给定的瓷片,如果瓷片不可用,则在归档文件中查找,如果在那里也不可用,则从互联网下载该瓷片。

好的,这是默认机制。如果您想将此机制更改为查找存储在数据库中的瓷砖,则可以创建类似于 MapTileProviderBasic 的自己的类。因此,您的类也可以扩展 MapTileProviderArray ,并仅在构造函数中使用其他提供程序。在 Osmdroid 中有一个名为DatabaseFileArchive 的类,它可能会帮助您从数据库中读取图块。

创建自己的瓷砖提供程序后,您应该使用它代替默认提供程序。地图瓷片提供程序附加到 MapView 上。 MapView 的一些构造函数将 MapTileProviderBase 作为参数 - 您可以使用其中之一将自己的提供程序附加。


1
感谢Piotr的辛勤努力。我是Android新手,查看了jar文件。我刚刚发现了上面的代码,并知道了该去哪里。但我尝试了两天,仍无法继续。如果您能提供此方面的示例代码,那将更加有帮助。提前感谢Piotr。 - Ayush Verma
@Piotr,请问您能否更新您的答案中的链接,因为它们无法使用... - PrincessLeiha
@Pallavi,好的,链接已更新(osmdroid更改了其存储库结构)。 - Piotr

2
将离线地图与默认提供程序MapTileProviderBasic配合使用的最简单方法是将地图存档放入OSMDROID_PATH中。
换句话说,将您的.zip、.sqlite、.mbtiles.gemf文件下载到osmdroid/目录中。
如果您查看MapTileFileArchiveProvider,您会发现它调用ArchiveFileFactory中的getArchiveFiles(),该工厂根据文件扩展名选择正确的存档提供程序。

它只是显示空的MapView。没有瓷砖显示该怎么办。 - Mukeshkumar S
@MaharithAdityaSS 请确保您将地图定位在离线地图覆盖的区域,并且缩放级别在离线地图覆盖范围内。 - Espen Riskedal
@MaharithAdityaSS 如果你的预算允许,就从这里获取示例 https://openmaptiles.org/docs/mobile/mobile/ - 无论如何,你真的想要从OSMDroid切换到MapBox - Espen Riskedal
有没有任何开源的? - Mukeshkumar S
请告诉我任何开源选项。我的要求很简单。我只想从SD卡加载地图,并在用户放置标记时获取其经纬度。 - Mukeshkumar S
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接