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

Qt/Qml: how to include map tiles for offline usage?

我需要将离线图块(滑动地图)包含到主要在 Android 和 iOS 上运行的 Qt/Qml 移动应用程序中。

我找到的唯一记录完备且有效的解决方案是用于 Qt 的商业 Esri Arcgis Runtime。但是,创建切片包需要使用 Arcgis 堆栈,无论是桌面还是服务器(如果我弄错了请指正)。

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

我正在寻找开源且易于使用的替代方案。

QtLocation 刚刚在 Qt 5.5 中得到了改进,但那里似乎没有离线瓦片包的开箱即用的解决方案:

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

@Marco Piccolino,在我们与另一位 thread 的对话之后,这是我目前找到的详细解决方法,仅使用 QtLocation、离线切片缓存和简单的 http 服务器:

  • 您需要将 png 图块放入这样的文件夹树中:“.../tiles/1.0.0/sat/{z}/{x}/{y}。 png", 比照这个 link

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

  • 您必须编辑主机文件以将以下域映射到您服务器的 IP 地址(很可能是 127.0.0.1):otile1.mqcdn.com.这个技巧很肮脏,但是由于这个 url 是硬编码在 QtLocation OSM 插件中的,我们对当前可用的 QML API.

    [=34= 没有太多选择]
  • 最后是最简单的部分,在 QML 代码中你应该有这样的东西:

Plugin {
    id: mapProvider
    name: "osm"
}

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

从版本 10.2.6 开始,现在可以通过 ArcGIS Runtime 库使用离线地图:

https://developers.arcgis.com/qt/qml/api-reference/class_tiled_map_service_layer.html

我知道这个答案来晚了,但我在 Linux

上遇到了与客户提供的离线地图相同的挑战

您需要为地图图块创建目录结构。当我使用 openstreetmaps 时,我复制了他们使用的目录结构,即 root/zoom_level/area_level_1/area_level_2/tile.png

例如:

~/osmTiles/12/3820/2078.png

我使用 marble (https://marble.kde.org/install.php?) 将地图图块下载到正确的目录树(缓存)中,然后将其复制到目标硬件并用客户端的 .png 文件替换 osm 图块

然后我使用 node.js 中的 npm 安装 http-server 并将根 tile 目录作为 http 服务器托管在 http//localhost:port(这个答案解释得很好: )

例如:

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]
}