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

Posted

技术标签:

【中文标题】Qt/Qml:如何包含地图瓦片以供离线使用?【英文标题】:Qt/Qml: how to include map tiles for offline usage? 【发布时间】:2015-05-21 03:00:24 【问题描述】:

我需要在一个主要在 androidios 上运行的 Qt/Qml 移动应用程序中包含离线图块(滑动地图)。

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

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

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

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

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

【问题讨论】:

您是否考虑过在 Android SDK 中实现类似于 Local MBTiles Layer 的东西?创建 MBTiles 不需要 ArcGIS。 Mapbox iOS SDK 支持离线 MBTiles。 感谢柯克的指点,我会调查的。与此同时,Arcgis Runtime QT 的人告诉我这个功能在列表中,希望它会进入下一个版本 【参考方案1】:

我知道这个答案来晚了,但我在 Linux 上使用客户端提供的离线地图时遇到了同样的挑战

您需要为地图图块创建目录结构。当我使用openstreetmaps时,我复制了他们使用的目录结构,即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 并将根 tile 目录托管为 http//localhost:port 的 http 服务器(这个答案很好地解释了它:https://***.com/a/12905427/5452614)

例如:

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,在我们与另一个 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,我们真的没有太多选择。

最后是最简单的部分,在 QML 代码中你应该有这样的东西:

插入 id:地图提供者 名称:“osm” Map anchors.fill: parent plugin: mapProvider gesture.enabled: true activeMapType: supportedMapTypes[1]

【讨论】:

感谢 Babou,这是一个非常有用的提示。在嵌入式上下文中,这应该适用于某些平台,但是我不确定 iOS。有这方面的经验吗?可以在上面运行服务器吗? 很遗憾,我没有这方面的经验。 .@babou 是我弄错了,还是您必须编辑主机这一事实使该解决方案无法移植到其他机器上?【参考方案3】:

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

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

【讨论】:

以上是关于Qt/Qml:如何包含地图瓦片以供离线使用?的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch - 缓存地图以供离线使用

如何缓存 Firebase 数据以供离线使用?

如何在 JavaScript 中保存网站以供离线使用

在 PhoneGap/Chrome 应用程序中存储视频以供离线使用

如何在 Android 中存储媒体 DRM 密钥以供离线使用

如何在flutter mobile中保存网站以供离线使用