我需要将离线图块(slippy map)包含在主要在Android和iOS上运行的Qt / Qml移动应用程序中。
我找到的唯一记录良好且工作正常的解决方案是Qt的商业Esri Arcgis Runtime。但是,创建磁贴包需要使用Arcgis堆栈,无论是桌面还是服务器(如果我弄错了,请纠正我)。
https://developers.arcgis.com/qt/
我正在寻找一种开源且易于使用的替代方案。
QtLocation刚刚在Qt 5.5中得到了改进,但似乎没有针对离线磁贴包的开箱即用解决方案:
答案 0 :(得分:3)
我知道这个答案已经很晚了,但我在Linux上提供了客户端提供的离线地图时遇到了同样的挑战
您需要为地图图块创建目录结构。当我使用openstreetmaps时,我复制了他们使用的目录结构,即root / zoom_level / area_level_1 / area_level_2 / tile.png
e.g。 :
<强>〜/ osmTiles /三千八百二十零分之十二/ 2078.png 强>
我使用大理石(https://marble.kde.org/install.php?)将地图图块下载到正确的目录树(缓存)中,然后将其复制到目标硬件并用客户端的.png文件替换osm图块
然后我使用node.js中的npm来安装http-server,并在http // localhost:port上作为http服务器托管根tile目录(这个答案解释得非常好:https://stackoverflow.com/a/12905427/5452614)
e.g。 :
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]
}
答案 1 :(得分:2)
@Marco Piccolino,在我们与其他thread的对话之后,我在目前为止找到了详细的解决方法,仅使用QtLocation,离线磁贴缓存和简单的http服务器:
您需要将png图块放入如下文件夹树:&#34; ... / tiles / 1.0.0 / sat / {z} / {x} / {y} .png&# 34;,参见此link
您必须在该文件夹上运行http服务器(您可能希望使用此命令: sudo python -m SimpleHTTPServer 80 )
您必须编辑主机文件,将以下域映射到服务器的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]
}