Я создаю приложение с 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;
}