大理石地图显示相对纬度的平铺FAA剖面图(地图)

时间:2017-02-05 20:28:15

标签: qt maps gdal kde marble

我正在使用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;
}

1 个答案:

答案 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