大理石地图显示相反纬度上的平铺 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