Qt/Qml:如何包含离线使用的地图瓦片?

5
我需要在主要运行于Android和iOS的Qt/Qml移动应用程序中包含离线瓦片(滑动地图)。
我找到的唯一有文档记录且可行的解决方案是商业Esri Arcgis Runtime for Qt。然而,创建瓦片包需要使用Arcgis堆栈,无论是桌面还是服务器(如果我错了,请纠正我)。

https://developers.arcgis.com/qt/

我希望您能够提供一个易于使用且开源的替代方案。 QtLocation在Qt 5.5中得到改进,但似乎没有针对离线瓦片包的开箱即用解决方案:

http://doc-snapshots.qt.io/qt5-5.5/qtlocation-index.html


1
你是否考虑过在Android SDK中实现类似于Local MBTiles Layer的功能?创建MBTiles并不需要ArcGIS。Mapbox iOS SDK支持离线MBTiles。 - Kirk Kuykendall
1
谢谢你的指引,Kirk。我会去了解一下。与此同时,Arcgis Runtime QT 的人告诉我这个功能已经在列表中了,希望它能够在下一个版本中实现。 - Marco Piccolino
3个回答

3

我知道这个答案有点晚,但是我在Linux上也遇到了客户提供的离线地图的挑战。

您需要为地图瓦片创建目录结构。因为我使用的是开放街道地图,所以我复制了它们使用的目录结构,即root/zoom_level/area_level_1/area_level_2/tile.png

例如:

~/osmTiles/12/3820/2078.png

我使用大理石 (https://marble.kde.org/install.php?) 将地图瓦片下载到正确的目录树 (缓存) 中,然后将其复制到目标硬件并使用客户端的 .png 文件替换 osm 瓦片。
然后我使用来自 node.js 的 npm 安装 http-server,并将根瓦片目录作为 http 服务器托管在 http//localhost:port (这个答案解释得非常好:https://dev59.com/92cs5IYBdhLWcg3wXi1E#12905427)
例如: http-server ~/osmTiles -p 8080 它将在 http//127.0.0.1:8080 上提供 osmTiles 最后,我修改了标准的 QML 插件。
Plugin {
  id: osmPlugin
  name: "osm"
  PluginParameter { name: "osm.useragent";         value: "My Company Name" }
  PluginParameter { name: "osm.mapping.host";      value: "http://127.0.0.1:8080/" }
  PluginParameter { name: "osm.mapping.copyright"; value: "MyCompany" }
}

我告诉QML在哪里查找我的离线瓦片。我必须指定地图应该是自定义地图,这更加困难。通过试错,我发现supportedMapTypes[7]是自定义地图。我不知道为什么,但它就是这样工作的。

Map{
  plugin: osmPlugin
  activeMapType: supportedMapTypes[7]
}

2

@Marco Piccolino,根据我们在这个线程中的交谈,以下是我目前发现的详细解决方案,仅使用QtLocation、离线瓦片缓存和简单的http服务器:

  • 您需要将png瓦片放入文件夹树中,如下所示:".../tiles/1.0.0/sat/{z}/{x}/{y}.png",参见此链接

  • 您必须在该文件夹上运行一个http服务器(您可能想要使用此命令:sudo python -m SimpleHTTPServer 80

  • 您将不得不编辑您的hosts文件,将以下域名映射到您的服务器IP地址(很可能是127.0.0.1):otile1.mqcdn.com。这个技巧相当肮脏,但由于这个url在QtLocation OSM插件内部硬编码,我们在当前可用的QML API下没有太多选择。

  • 最后,最简单的部分,在QML代码中,您应该有像这样的内容:

Plugin {
    id: mapProvider
    name: "osm"
}

Map { anchors.fill: parent plugin: mapProvider gesture.enabled: true activeMapType: supportedMapTypes[1] }


谢谢Babou,这是一个非常有用的提示。在嵌入式环境中,这应该适用于一些平台,但我不确定iOS是否可以。您有任何经验吗?它能运行服务器吗? - Marco Piccolino
很遗憾,我在那方面没有任何经验。 - babou
.@babou 我错了还是你必须编辑主机文件才能使这个解决方案不适用于其他机器? - Marco Piccolino

0

我在那个URL中看到了“页面未找到”,你是如何解决这个问题的? - Parisa.H.R

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