编写自定义 Qt Location GeoServices 插件以使用地理参考图像文件作为地图源
Writing a custom Qt Location GeoServices plugin to use geo-referenced image file as map source
我目前正在开发一个 Qt Quick 应用程序,该应用程序将为较小的区域(1 平方公里左右)提供地图查看器,其地图详细信息将在单个地理参考图像文件中提供 ( GeoTIFF、地理参考 PDF、ESRI 形状文件等),以及当前位置的显示、操作员识别的兴趣点等。它的主要职责是显示自定义地图(与从 public 检索的通用地图相反)地图图像服务提供商(OSM、MabBox、ESRI 等),它通常用于连接受限的区域
广泛的网络搜索发现其他人过去也有过类似的查询(这里,Qt 论坛等),一般的解决方案建议如下:
- 带有 Qt SDK 的 ArcGIS Runtime 不适合我,因为我打算使用 ARM 处理器定位嵌入式 linux 设备,而 ArcGIS 没有可用于任意目标的交叉编译的源代码。他们最近发布了一个 Android 版本,但总体上没有针对 ARM linux)
- QGIS 开发者库GPL 许可证与我的商业开发不兼容
- 将 Qt Location Map 组件与本地切片服务器或离线切片集合一起使用(一些插件最近引入了对此的支持)似乎有点hack,如前所述,我主要使用自定义地图,而不是 public 地图服务器图像的离线副本,否则我的图像不够大,无法真正保证平铺
从头开始开发一个 Qt Quick 组件来做到这一点是可行的,但考虑到现有的 Qt Location Map 组件提供了一个定义良好的预先存在的前端接口对于我的地图需要做的所有事情并且具有基于可扩展插件的架构,编写自定义 Qt Location GeoServices 插件似乎是最明智和优雅的前进方式。
我已经开始检查现有插件的源代码,但无法摆脱这样一种感觉,即在一个拥有 80 亿人口的世界中,"nothing new under the sun",如果它是好主意....
有没有更熟悉 Qt Location 模块的人愿意发表评论?
由于地理参考图像可以任意大,将它们转换为平铺金字塔是一种标准,以便能够在任何硬件上有效地显示它们(以加倍大小为代价,最坏情况取决于关于你想要多少层)。
即使您会编写自己的地理服务插件,您很可能最终会(直接或通过使用第 3 方代码)平铺您的 geotiff。
也就是说,QtLocation 确实允许您使用以大多数方式(http、https、文件、qrc 等)。
所以继续吧,启动 QGis,安装 QTiler 插件,然后转换您的图像。
如果您需要通过网络将这些图片直接提供给客户端(因此需要在客户端进行转换),您可以查看 QTiler 的功能,或者构建您的 gdal 管道(gdal_translate、gdalwarp 和 gdal2tiles ), 并将相关的 gdal 位与您的应用程序一起发送。
如果您同时需要多个图像,您可以使用具有不同插件参数的多个 Plugin 元素,或者您可以 fork osm 插件并支持多个自定义主机。
根据 Paul 的回复,以及 Qt 论坛和邮件列表上对同一查询的几个类似回复,再加上我自己的调查,我得出以下结论:
生成自定义 Qt Location GeoServices 插件以直接从地理参考图像文件提供地图图像并不是一个好主意,因为实施起来不那么简单,而且在实践中任何非普通地图图像可能足够大,以至于初始拼贴步骤,然后使用引用本地拼贴集的标准拼贴映射插件之一更合适。
我目前正在开发一个 Qt Quick 应用程序,该应用程序将为较小的区域(1 平方公里左右)提供地图查看器,其地图详细信息将在单个地理参考图像文件中提供 ( GeoTIFF、地理参考 PDF、ESRI 形状文件等),以及当前位置的显示、操作员识别的兴趣点等。它的主要职责是显示自定义地图(与从 public 检索的通用地图相反)地图图像服务提供商(OSM、MabBox、ESRI 等),它通常用于连接受限的区域
广泛的网络搜索发现其他人过去也有过类似的查询(这里,Qt 论坛等),一般的解决方案建议如下:
- 带有 Qt SDK 的 ArcGIS Runtime 不适合我,因为我打算使用 ARM 处理器定位嵌入式 linux 设备,而 ArcGIS 没有可用于任意目标的交叉编译的源代码。他们最近发布了一个 Android 版本,但总体上没有针对 ARM linux)
- QGIS 开发者库GPL 许可证与我的商业开发不兼容
- 将 Qt Location Map 组件与本地切片服务器或离线切片集合一起使用(一些插件最近引入了对此的支持)似乎有点hack,如前所述,我主要使用自定义地图,而不是 public 地图服务器图像的离线副本,否则我的图像不够大,无法真正保证平铺
从头开始开发一个 Qt Quick 组件来做到这一点是可行的,但考虑到现有的 Qt Location Map 组件提供了一个定义良好的预先存在的前端接口对于我的地图需要做的所有事情并且具有基于可扩展插件的架构,编写自定义 Qt Location GeoServices 插件似乎是最明智和优雅的前进方式。
我已经开始检查现有插件的源代码,但无法摆脱这样一种感觉,即在一个拥有 80 亿人口的世界中,"nothing new under the sun",如果它是好主意....
有没有更熟悉 Qt Location 模块的人愿意发表评论?
由于地理参考图像可以任意大,将它们转换为平铺金字塔是一种标准,以便能够在任何硬件上有效地显示它们(以加倍大小为代价,最坏情况取决于关于你想要多少层)。 即使您会编写自己的地理服务插件,您很可能最终会(直接或通过使用第 3 方代码)平铺您的 geotiff。
也就是说,QtLocation 确实允许您使用以大多数方式(http、https、文件、qrc 等)。
所以继续吧,启动 QGis,安装 QTiler 插件,然后转换您的图像。 如果您需要通过网络将这些图片直接提供给客户端(因此需要在客户端进行转换),您可以查看 QTiler 的功能,或者构建您的 gdal 管道(gdal_translate、gdalwarp 和 gdal2tiles ), 并将相关的 gdal 位与您的应用程序一起发送。
如果您同时需要多个图像,您可以使用具有不同插件参数的多个 Plugin 元素,或者您可以 fork osm 插件并支持多个自定义主机。
根据 Paul 的回复,以及 Qt 论坛和邮件列表上对同一查询的几个类似回复,再加上我自己的调查,我得出以下结论:
生成自定义 Qt Location GeoServices 插件以直接从地理参考图像文件提供地图图像并不是一个好主意,因为实施起来不那么简单,而且在实践中任何非普通地图图像可能足够大,以至于初始拼贴步骤,然后使用引用本地拼贴集的标准拼贴映射插件之一更合适。