我正在使用Qt 5.7和Marble Maps小部件构建应用程序,我需要在应用程序中显示FAA剖面图(可在此处免费下载:https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/vfr/)。这些图表采用GEO-TIFF格式,并且可以正确地进行地理参考。
在Marble中显示这些地图的第一步是将它们转换为图块。我这样做是使用gdaltranslate和gdal2tiles.py。在蒙特利尔剖面图上运行这些实用程序后,我得到了此文件夹中显示的结果:http://flt.l5.ca/maps/sectionals。
转化过程似乎很成功,因为图表可以非常精确地覆盖在Google地图上,例如:http://flt.l5.ca/maps/sectionals/googlemaps.html。
为了在Marble中显示地图,我创建了以下DGML文件:
<?xml version="1.0" encoding="UTF-8"?>
<dgml xmlns="http://edu.kde.org/marble/dgml/2.0">
<document>
<head>
<license short="© FAA">© FAA</license>
<name>FAA Sectionals</name>
<target>earth</target>
<theme>sectionals</theme>
<icon pixmap="preview.png"/>
<visible>true</visible>
<description><![CDATA[<p>FAA Sectional Charts</p><p>FAA-provided sectional VFR charts for the USA.</p>]]></description>
<zoom>
<minimum> 900 </minimum>
<maximum> 3500 </maximum>
<discrete> true </discrete>
</zoom>
</head>
<map bgcolor="#000000">
<canvas/>
<target/>
<layer name="sectionals" backend="texture">
<texture name="faa_data" expire="604800">
<sourcedir format="PNG"> earth/sectionals </sourcedir>
<tileSize width="256" height="256"/>
<storageLayout levelZeroColumns="1" levelZeroRows="1" maximumTileLevel="19" mode="OpenStreetMap"/>
<projection name="Mercator"/>
<downloadUrl protocol="http" host="flt.l5.ca" path="/maps/sectionals"/>
</texture>
</layer>
</map>
<settings>
<property name="coordinate-grid">
<value>true</value>
<available>true</available>
</property>
<property name="overviewmap">
<value>true</value>
<available>true</available>
</property>
<property name="compass">
<value>true</value>
<available>true</available>
</property>
<property name="scalebar">
<value>true</value>
<available>true</available>
</property>
</settings>
</document>
</dgml>
地图确实出现在大理石地图中,但是在错误的半球上,即它不是在北纬45N左右的蒙特利尔顶部显示,而是出现在南美洲同一经度但纬度相反(45S)。
如果谷歌地图等其他地图服务把它放在正确的地方,这怎么可能呢?
在Qt中的MarbleWidget中显示地图的非常简单的代码包含在下面。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "marble/MarbleWidget.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Marble::MarbleWidget *mapWidget = ui->MarbleWidget;
mapWidget->setProjection( Marble::Mercator );
mapWidget->setMapThemeId(QStringLiteral("earth/sectionals/sectionals.dgml" ));
mapWidget->setShowOverviewMap(false);
mapWidget->setShowScaleBar(false);
mapWidget->setShowCompass(false);
mapWidget->setMapQualityForViewContext( Marble::PrintQuality, Marble::Still );
mapWidget->setMapQualityForViewContext( Marble::LowQuality, Marble::Animation );
}
MainWindow::~MainWindow()
{
delete ui;
}
答案 0 :(得分:0)
找到它。 gdal2tiles.py使用的tile文件名的命名约定基于Google Maps使用的XYZ方案。 Marble Maps基于TMS方案,该方案使用XYZ方案中相反的纬度惯例。修复gdal2tiles.py的源代码会生成具有正确TMS文件名的切片并解决问题。
感谢GitHub上的jeffaudi发布他的解决方案:https://gist.github.com/jeffaudi/9da77abf254301652baa#file-gdal2tilesg-py