在 QML 中使用离线交互式地图

Posted

技术标签:

【中文标题】在 QML 中使用离线交互式地图【英文标题】:Use an offline interactive map in QML 【发布时间】:2021-03-25 19:19:57 【问题描述】:

我想以osm 文件的形式注入我从OpenStreetMap 获得的一大块地图。

根据我在文档中阅读的内容,Open Street Map Plugin 似乎没有任何参数将源文件作为映射。它仅适用于服务器。问题是我在运行我的应用程序时没有 Internet 连接。我需要在内部使用地图。

Mapbox 和 HERE 插件同上。

还有其他方法吗?

这是创建地图的样板:

Plugin 
    id: somePlugin
    // code here to choose the plugin as necessary


Map 
    id: map

    plugin: somePlugin

    center 
        latitude: -27
        longitude: 153
    
    zoomLevel: map.minimumZoomLevel

    gesture.enabled: true

【问题讨论】:

【参考方案1】:

2017 年 4 月更新:QtLocation 现在支持离线 OSM 磁贴。 见http://doc.qt.io/qt-5/location-plugin-osm.html

正如您所注意到的,QtLocation 目前不给您offline option。此外,对于底图,它目前仅支持image tiles(不是您所说的 XML 矢量 OSM 数据)。

你有几个选择:

在 QML 中:您可以使用 ArcGIS Runtime SDK for Qt。 从版本 10.26 开始,它支持添加带有离线切片的自定义地图图层。您需要先获取 OSM 数据的 PNG/JPG 图块。这是一个支持 OSM slippymap 瓦片的example layer。

在 C++ 中:您会发现一些显示矢量数据的选项,这些数据可能需要或不需要从 OSM 格式转换,还有更多工作要做:

http://wiki.openstreetmap.org/wiki/Libosmscout https://www.mapbox.com/blog/qmapboxgl/ QGis 是用 Qt 制作的,与许多其他开源地理项目一样,因此它们可能会有所帮助

另外,不要忘记在 Qt Bugtracker 中为上述问题投票!

【讨论】:

尽管 ArcGIS 是解决我的问题最方便的功能,但它太重 (700 MB)。 MaxpboxGL 似乎是从图块中获取离线地图的最简单方法,但我需要将 QMapboxGL 转换为 QML 对象。我想知道这是否可行。 很遗憾,QMapboxGL 项目不支持 Windows。我需要我的项目是跨平台的。 您的应用程序中的 ArcGIS 运行时库只有几百 Kbs,所以这应该不是什么大问题。不过,在主机上,您必须在系统级别安装它。 好吧。我可能会尝试,但我还没有找到基本许可证的价格。不过好像不是免费的…… 基本的这种功能是免费的。您只需在 Arcgis Online 上注册您的应用程序并获取密钥 - 否则您会在地图上看到水印【参考方案2】:

您可以生成或下载tiles 以供离线使用。要生成图块,请查看 TileMill 或 Maperitive。下载瓷砖可以通过Marble和其他各种工具实现,但请尊重瓷砖服务器的使用政策!下载高缩放图块会导致图块服务器上的负载很高,因为这些图块通常没有缓存,需要即时渲染。

【讨论】:

太棒了!我使用 Maperitive 从我的 osm 文件中生成 png 切片。现在我需要使用它们来生成地图。 您好,先生,我用同样的方法生成png文件。但是,就我而言,有太多的 png 文件 -zoom level 10- 我无法命名每个文件。(png 文件的名称应该应用这种模式 osm_100-- ---. 如 QtLocation 论坛中所述 我能问一下,你遇到过同样的问题吗?如果遇到了,你怎么能克服它,因为我看到没有答案.@scai。提前致谢。 对不起,我不明白你的问题。您不必命名/列出每个文件。文件名遵循一定的模式。你的实际问题是什么?也许你应该创建一个新问题。 我使用 Mapertive 生成​​ png 文件(图块),但 Mapertive 不遵循此模式 osm_100-<l|h>-<map_id>-<z>-<x>-<y>.<extension>。例如,当我下载一些缩放级别为 10 的图块时,一些 png 文件的名称是 202693,202694 等。不幸的是,我必须使用至少 10 级缩放,你猜有许多 png 文件必须命名为一个一。我问的是,如果你也遇到这种情况,你是怎么解决这个问题的?或者,可能有任何其他遵循此模式的图块创建者? @scai 很遗憾,我无法回答这个问题。我从来没有使用过 Qt 来显示地图。

以上是关于在 QML 中使用离线交互式地图的主要内容,如果未能解决你的问题,请参考以下文章

Qt/Qml:如何包含地图瓦片以供离线使用?

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

技术分享 | 新手入门-带你使用Qt实现离线缓存地图

技术分享 | 新手入门-带你使用Qt实现离线缓存地图

如何在FastReport VCL 6中使用交互式地图

QML与Qt C++ 交互机制探讨与总结(转)