大理石地图显示相反纬度上的平铺 FAA 截面图(地图)
Marble Maps shows tiled FAA sectional charts (maps) on opposite latitude
我正在使用 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>
该地图确实出现在 Marble Maps 中,但出现在错误的半球,即它没有显示在北纬 45 度左右的蒙特利尔顶部,而是显示在南美洲的经度相同但纬度相反 (45S)。
考虑到 Google 地图等其他地图服务将它放在正确的位置,这怎么可能?
下面包含了在 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;
}
找到了。 gdal2tiles.py 使用的图块文件名的命名约定基于 Google 地图使用的 XYZ 方案。 Marble Maps 基于 TMS 方案,该方案使用与 XYZ 方案相反的纬度约定。修复 gdal2tiles.py 的源代码可以生成具有正确 TMS 文件名的图块并解决问题。
感谢 jeffaudi 在 GitHub 上发布他的解决方案:https://gist.github.com/jeffaudi/9da77abf254301652baa#file-gdal2tilesg-py
我正在使用 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>
该地图确实出现在 Marble Maps 中,但出现在错误的半球,即它没有显示在北纬 45 度左右的蒙特利尔顶部,而是显示在南美洲的经度相同但纬度相反 (45S)。
考虑到 Google 地图等其他地图服务将它放在正确的位置,这怎么可能?
下面包含了在 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;
}
找到了。 gdal2tiles.py 使用的图块文件名的命名约定基于 Google 地图使用的 XYZ 方案。 Marble Maps 基于 TMS 方案,该方案使用与 XYZ 方案相反的纬度约定。修复 gdal2tiles.py 的源代码可以生成具有正确 TMS 文件名的图块并解决问题。
感谢 jeffaudi 在 GitHub 上发布他的解决方案:https://gist.github.com/jeffaudi/9da77abf254301652baa#file-gdal2tilesg-py