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

时间:2015-03-18 10:56:49

标签: qt mobile location maps qml

我需要将离线图块(slippy map)包含在主要在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

2 个答案:

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