Qt/Qml:如何包含地图瓦片以供离线使用?
Posted
技术标签:
【中文标题】Qt/Qml:如何包含地图瓦片以供离线使用?【英文标题】:Qt/Qml: how to include map tiles for offline usage? 【发布时间】:2015-05-21 03:00:24 【问题描述】:我需要在一个主要在 android 和 ios 上运行的 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:如何包含地图瓦片以供离线使用?的主要内容,如果未能解决你的问题,请参考以下文章
在 PhoneGap/Chrome 应用程序中存储视频以供离线使用