2017-02-05 24 views
0

Я создаю приложение с Qt 5.7 и виджетами Marble Maps, и мне нужно отображать секционные диаграммы FAA в приложении (они доступны для бесплатной загрузки здесь: https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/vfr/). Эти диаграммы представлены в формате GEO-TIFF, и они правильно привязаны к географии.Marble Maps показывает черепичные диаграммы FAA (карты) на противоположной широте

Первый шаг, чтобы показать эти карты в Мрамор, - это преобразовать их в плитки. Я делаю это с помощью gdaltranslate и gdal2tiles.py. После запуска этих утилит на монтажной диаграмме в Монреале я получаю результаты, показанные в этой папке: http://flt.l5.ca/maps/sectionals.

Процесс преобразования кажется успешным, потому что диаграмма может быть очень точно наложена поверх Google Maps, например: http://flt.l5.ca/maps/sectionals/googlemaps.html.

Для того, чтобы показать карту в мраморе, я создал следующий 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, но на ложном полушарии, то есть вместо того, чтобы отображаться в верхней части Монреаль около 45N широты, он появляется в Южной Америке на той же долготе, но напротив широты (45S).

Как это возможно, учитывая, что другие сервисы картографирования, такие как Google Maps, помещают их в нужное место?

Очень простой код для отображения карты в MarbleWidget в Qt приведен ниже.

#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

Найдено. Соглашение об именах для имен файлов плитки, используемых gdal2tiles.py, основано на схеме XYZ, которую использует Google Maps. Мраморные карты основаны на схеме TMS, которая использует противоположное соглашение широты из схемы XYZ. Исправление исходного кода gdal2tiles.py создает плитки с правильными именами TMS и устраняет проблему.

Благодаря jeffaudi на GitHub для публикации своего решения: https://gist.github.com/jeffaudi/9da77abf254301652baa#file-gdal2tilesg-py