Qt/Qml:如何包括地图分幅以供脱机使用?

Qt/Qml:如何包括地图分幅以供脱机使用?,qt,mobile,location,maps,qml,Qt,Mobile,Location,Maps,Qml,我需要在主要运行在Android和iOS上的Qt/Qml移动应用程序中包含离线瓷砖(slippy map) 我发现的唯一一个有良好文档记录且有效的解决方案是商用Esri Arcgis Runtime for Qt。但是,创建磁贴软件包需要使用Arcgis堆栈(桌面或服务器)(如果我弄错了,请纠正我) 我正在寻找一个开源和易于使用的替代品 QtLocation在Qt 5.5中刚刚得到改进,但似乎没有现成的脱机磁贴包解决方案: @Marco Piccolino,在我们的对话之后,以下是我到目前为止

我需要在主要运行在Android和iOS上的Qt/Qml移动应用程序中包含离线瓷砖(slippy map)

我发现的唯一一个有良好文档记录且有效的解决方案是商用Esri Arcgis Runtime for Qt。但是,创建磁贴软件包需要使用Arcgis堆栈(桌面或服务器)(如果我弄错了,请纠正我)

我正在寻找一个开源和易于使用的替代品

QtLocation在Qt 5.5中刚刚得到改进,但似乎没有现成的脱机磁贴包解决方案:


@Marco Piccolino,在我们的对话之后,以下是我到目前为止发现的详细解决方法,仅使用QtLocation、脱机磁贴缓存和简单的http服务器:

  • 您需要将png磁贴放入如下文件夹树:“…/tiles/1.0.0/sat/{z}/{x}/{y}.png”,cf this

  • 您必须在该文件夹上运行http服务器(您可能希望使用以下命令:sudopython-msimplehttpserver 80

  • 您必须编辑主机文件以将以下域映射到服务器的IP地址(很可能是127.0.0.1):otile1.mqcdn.com。这个技巧非常糟糕,但是由于这个url是在QtLocation OSM插件中硬编码的,所以我们在当前可用的QML API中没有太多选择

  • 最后是最简单的部分,在QML代码中,您应该有如下内容:


从10.2.6版开始,现在可以通过ArcGIS运行库使用脱机地图互动程序:


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

您需要为地图分幅创建目录结构。在使用openstreetmaps时,我复制了它们使用的目录结构,即root/zoom\u level/area\u level\u 1/area\u level\u 2/tile.png

e、 g:

~/osmTiles/12/3820/2078.png

我使用marble(?)将地图分幅下载到正确的目录树(缓存),然后将其复制到目标硬件,并用客户端的.png文件替换osm分幅

然后,我使用node.js中的npm安装http服务器,并将根tile目录作为http服务器托管在http//localhost:port(这个答案解释得很好:)

e、 g:

http服务器~/osmTiles-p8080

在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 SDK中实现类似的功能?创建MBTILE不需要ArcGIS。支持离线MBTiles。谢谢你的指针Kirk,我会调查的。与此同时,Arcgis Runtime QT的人告诉我这个功能已经在列表中,希望它能进入下一个版本。谢谢巴布,这是一个非常有用的提示。在嵌入式环境中,这应该适用于某些平台,但我不确定iOS。有这方面的经验吗?服务器可以在其上运行吗?不幸的是,我在这方面没有任何经验。@babou我错了,或者您必须编辑主机这一事实是否使此解决方案无法移植到其他机器上?
Map{
  plugin: osmPlugin
  activeMapType: supportedMapTypes[7]
}