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 中得到了改进,但那里似乎没有离线瓦片包的开箱即用的解决方案:
@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]
}
我需要将离线图块(滑动地图)包含到主要在 Android 和 iOS 上运行的 Qt/Qml 移动应用程序中。
我找到的唯一记录完备且有效的解决方案是用于 Qt 的商业 Esri Arcgis Runtime。但是,创建切片包需要使用 Arcgis 堆栈,无论是桌面还是服务器(如果我弄错了请指正)。
https://developers.arcgis.com/qt/
我正在寻找开源且易于使用的替代方案。
QtLocation 刚刚在 Qt 5.5 中得到了改进,但那里似乎没有离线瓦片包的开箱即用的解决方案:
@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]
}