mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-16 05:22:54 -04:00
Add maptiler API key setting for satellite maps. Rotate default key.
Use OSM map tiles, as wikimedia tiles are no longer available. Fix gcc warnings.
This commit is contained in:
parent
b7619e1c57
commit
8a3a246888
@ -66,6 +66,7 @@ ADSBDemodDisplayDialog::ADSBDemodDisplayDialog(ADSBDemodSettings *settings, QWid
|
||||
ui->mapProvider->setCurrentText(settings->m_mapProvider);
|
||||
}
|
||||
ui->mapType->setCurrentIndex((int)settings->m_mapType);
|
||||
ui->maptilerAPIKey->setText(m_settings->m_maptilerAPIKey);
|
||||
ui->navAids->setChecked(settings->m_displayNavAids);
|
||||
ui->atcCallsigns->setChecked(settings->m_atcCallsigns);
|
||||
ui->photos->setChecked(settings->m_displayPhotos);
|
||||
@ -158,6 +159,11 @@ void ADSBDemodDisplayDialog::accept()
|
||||
m_settings->m_mapType = (ADSBDemodSettings::MapType)ui->mapType->currentIndex();
|
||||
m_settingsKeys.append("mapType");
|
||||
}
|
||||
if (m_settings->m_maptilerAPIKey != ui->maptilerAPIKey->text())
|
||||
{
|
||||
m_settings->m_maptilerAPIKey = ui->maptilerAPIKey->text();
|
||||
m_settingsKeys.append("maptilerAPIKey");
|
||||
}
|
||||
if (m_settings->m_displayNavAids != ui->navAids->isChecked())
|
||||
{
|
||||
m_settings->m_displayNavAids = ui->navAids->isChecked();
|
||||
|
@ -277,14 +277,14 @@
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="aircraftMinZoomLabel">
|
||||
<property name="text">
|
||||
<string>Zoom level for aircraft scaling</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="aircraftMinZoom">
|
||||
<property name="toolTip">
|
||||
<string>When map zoom (0 min zoom - 15 max zoom) is higher than this value, aircraft icon size will be scaled</string>
|
||||
@ -294,14 +294,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="airportSizeLabel">
|
||||
<property name="text">
|
||||
<string>Display airports with size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="airportSize">
|
||||
<property name="toolTip">
|
||||
<string>Sets the minimum airport size that will be displayed on the map</string>
|
||||
@ -323,14 +323,14 @@
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="heliportsLabel">
|
||||
<property name="text">
|
||||
<string>Display heliports</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<item row="5" column="1">
|
||||
<widget class="QCheckBox" name="heliports">
|
||||
<property name="toolTip">
|
||||
<string>When checked, heliports are displayed on the map</string>
|
||||
@ -340,14 +340,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="airportRangeLabel">
|
||||
<property name="text">
|
||||
<string>Airport display distance (km)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<item row="6" column="1">
|
||||
<widget class="QSpinBox" name="airportRange">
|
||||
<property name="toolTip">
|
||||
<string>Displays airports within the specified distance in kilometres from My Position</string>
|
||||
@ -357,14 +357,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="airspacesLabel">
|
||||
<property name="text">
|
||||
<string>Airspaces to display</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<item row="7" column="1">
|
||||
<widget class="QListWidget" name="airspaces">
|
||||
<property name="toolTip">
|
||||
<string>Airspace categories to display</string>
|
||||
@ -521,14 +521,14 @@
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="airspaceRangeLabel">
|
||||
<property name="text">
|
||||
<string>Airspace display distance (km)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<item row="8" column="1">
|
||||
<widget class="QSpinBox" name="airspaceRange">
|
||||
<property name="toolTip">
|
||||
<string>Displays airspace within the specified distance in kilometres from My Position</string>
|
||||
@ -538,14 +538,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<item row="9" column="0">
|
||||
<widget class="QLabel" name="displayNavAids">
|
||||
<property name="text">
|
||||
<string>Display NAVAIDs</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<item row="9" column="1">
|
||||
<widget class="QCheckBox" name="navAids">
|
||||
<property name="toolTip">
|
||||
<string>Display NAVAIDs such as VORs and NDBs</string>
|
||||
@ -555,7 +555,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="1">
|
||||
<item row="10" column="1">
|
||||
<widget class="QCheckBox" name="atcCallsigns">
|
||||
<property name="toolTip">
|
||||
<string>Use ATC callsigns (SPEEDBIRD) rather than ICAO (BAW) for aircraft labels on map</string>
|
||||
@ -565,27 +565,44 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<item row="10" column="0">
|
||||
<widget class="QLabel" name="atcCallsignsLabel">
|
||||
<property name="text">
|
||||
<string>Use ATC callsigns on map</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="1">
|
||||
<item row="11" column="1">
|
||||
<widget class="QComboBox" name="flightPathPalette">
|
||||
<property name="toolTip">
|
||||
<string>Colour palette to use for aircraft flight paths</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="0">
|
||||
<item row="11" column="0">
|
||||
<widget class="QLabel" name="flightPathPaletteLabel">
|
||||
<property name="text">
|
||||
<string>Flight path palette</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Maptiler API key</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="maptilerAPIKey">
|
||||
<property name="toolTip">
|
||||
<string>API key for Maptiler (https://maptiler.com) for satellite map</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
@ -2063,15 +2063,11 @@ void ADSBDemodGUI::handleADSB(
|
||||
aircraft = getAircraft(icao, newAircraft);
|
||||
}
|
||||
|
||||
/*if (aircraft->m_icaoHex != "43ea47") {
|
||||
return;
|
||||
}*/
|
||||
|
||||
// ADS-B, non-transponder ADS-B, TIS-B, or rebroadcast of ADS-B (ADS-R)
|
||||
if ((df == 17) || ((df == 18) && (ca != 3) && (ca != 4)))
|
||||
{
|
||||
const int tc = (data[4] >> 3) & 0x1f; // Type code
|
||||
unsigned surveillanceStatus = 0;
|
||||
//unsigned surveillanceStatus = 0;
|
||||
|
||||
m_tcStats[tc]++;
|
||||
if (updateTCStats(tc, TC_0, 0, 0)) {
|
||||
@ -2096,8 +2092,6 @@ void ADSBDemodGUI::handleADSB(
|
||||
|
||||
decodeID(data, emitterCategory, callsign);
|
||||
|
||||
int ec = data[4] & 0x7; // Emitter category
|
||||
|
||||
QString prevEmitterCategory = aircraft->m_emitterCategory;
|
||||
aircraft->m_emitterCategory = emitterCategory;
|
||||
aircraft->m_emitterCategoryItem->setText(aircraft->m_emitterCategory);
|
||||
@ -2210,7 +2204,7 @@ void ADSBDemodGUI::handleADSB(
|
||||
{
|
||||
// Airborne position (9-18 baro, 20-22 GNSS)
|
||||
|
||||
surveillanceStatus = (data[4] >> 1) & 0x3;
|
||||
//surveillanceStatus = (data[4] >> 1) & 0x3;
|
||||
|
||||
// ADS-B: Version 0 is single antenna flag, version 2 is NIC supplement-B
|
||||
// TSI-B: ICAO/Mode A flag
|
||||
@ -2239,7 +2233,7 @@ void ADSBDemodGUI::handleADSB(
|
||||
{
|
||||
int f;
|
||||
double latCpr, lonCpr;
|
||||
unsigned t = (data[2] >> 3) & 1; // Not valid for TIS-B
|
||||
//unsigned t = (data[2] >> 3) & 1; // Not valid for TIS-B
|
||||
bool globalValid = false;
|
||||
double globalLatitude, globalLongitude;
|
||||
bool localValid = false;
|
||||
@ -2289,7 +2283,7 @@ void ADSBDemodGUI::handleADSB(
|
||||
}
|
||||
|
||||
// Local decode using a single aircraft position + location of receiver or previous global position
|
||||
localValid = decodeLocalPosition(f, aircraft->m_cprLat[f], aircraft->m_cprLong[f], aircraft->m_onSurface, dateTime, aircraft, localLatitude, localLongitude, true);
|
||||
localValid = decodeLocalPosition(f, aircraft->m_cprLat[f], aircraft->m_cprLong[f], aircraft->m_onSurface, aircraft, localLatitude, localLongitude, true);
|
||||
|
||||
if (aircraft->m_globalPosition && !localValid)
|
||||
{
|
||||
@ -2511,7 +2505,7 @@ void ADSBDemodGUI::handleADSB(
|
||||
bool nicSupplementA = (data[9] >> 4) & 0x1;
|
||||
int nacp = data[9] & 0xf;
|
||||
int sil = (data[10] >> 4) & 0x3;
|
||||
bool hrd = (data[10] >> 2) & 0x1; // Whether headings are magnetic (false) or true North (true)
|
||||
//bool hrd = (data[10] >> 2) & 0x1; // Whether headings are magnetic (false) or true North (true)
|
||||
bool silSuppliment = (data[10] >> 1) & 0x1; // 0 per hour / 1 per sample
|
||||
|
||||
aircraft->m_nicSupplementA = nicSupplementA;
|
||||
@ -2537,7 +2531,7 @@ void ADSBDemodGUI::handleADSB(
|
||||
// Airborne
|
||||
unsigned capacityClassCode = ((data[5] & 0xff) << 8) | (data[6] & 0xff);
|
||||
bool tcasOperational = (capacityClassCode >> 13) & 1;
|
||||
bool adsbIn = (capacityClassCode >> 12) & 1;
|
||||
//bool adsbIn = (capacityClassCode >> 12) & 1;
|
||||
|
||||
aircraft->m_tcasOperational = tcasOperational;
|
||||
aircraft->m_tcasOperationalValid = true;
|
||||
@ -2882,10 +2876,10 @@ void ADSBDemodGUI::handleADSB(
|
||||
else if (df == 0)
|
||||
{
|
||||
// Short air-to-air ACAS (Airborne Collision Avoidance System)
|
||||
bool onSurface = (data[0] >> 2) & 1;
|
||||
unsigned crosslinkCapability = (data[0] >> 1) & 1;
|
||||
//bool onSurface = (data[0] >> 2) & 1;
|
||||
//unsigned crosslinkCapability = (data[0] >> 1) & 1;
|
||||
unsigned spare1 = data[0] & 1;
|
||||
unsigned sensitivityLevel = (data[1] >> 5) & 0x7;
|
||||
//unsigned sensitivityLevel = (data[1] >> 5) & 0x7;
|
||||
unsigned spare2 = (data[1] >> 3) & 0x3;
|
||||
unsigned replyInfo = ((data[1] & 0x7) << 1) | ((data[2] >> 7) & 1);
|
||||
unsigned spare3 = (data[2] >> 5) & 0x3;
|
||||
@ -3439,7 +3433,7 @@ bool ADSBDemodGUI::decodeGlobalPosition(int f, const double cprLat[2], const dou
|
||||
}
|
||||
|
||||
// Only valid if airborne within 180nm/333km (C.2.6.4) or 45nm for surface
|
||||
bool ADSBDemodGUI::decodeLocalPosition(int f, double cprLat, double cprLong, bool onSurface, const QDateTime& dateTime, const Aircraft *aircraft, double& latitude, double& longitude, bool countFailure)
|
||||
bool ADSBDemodGUI::decodeLocalPosition(int f, double cprLat, double cprLong, bool onSurface, const Aircraft *aircraft, double& latitude, double& longitude, bool countFailure)
|
||||
{
|
||||
double refLatitude;
|
||||
double refLongitude;
|
||||
@ -3708,7 +3702,7 @@ void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime,
|
||||
}
|
||||
else
|
||||
{
|
||||
if (decodeLocalPosition(f, cprLat[f], cprLon[f], aircraft->m_onSurface, dateTime, aircraft, latitude_0_5, longitude_0_5, false)) {
|
||||
if (decodeLocalPosition(f, cprLat[f], cprLon[f], aircraft->m_onSurface, aircraft, latitude_0_5, longitude_0_5, false)) {
|
||||
positionValid_0_5 = true;
|
||||
}
|
||||
}
|
||||
@ -5511,7 +5505,6 @@ void ADSBDemodGUI::statsTable_customContextMenuRequested(QPoint pos)
|
||||
QMenu* tableContextMenu = new QMenu(ui->statsTable);
|
||||
connect(tableContextMenu, &QMenu::aboutToHide, tableContextMenu, &QMenu::deleteLater);
|
||||
|
||||
int row = item->row();
|
||||
QAction* copyAction = new QAction("Copy", tableContextMenu);
|
||||
const QString text = item->text();
|
||||
connect(copyAction, &QAction::triggered, this, [text]()->void {
|
||||
@ -5793,6 +5786,8 @@ void ADSBDemodGUI::on_stats_clicked(bool checked)
|
||||
|
||||
void ADSBDemodGUI::on_ic_globalCheckStateChanged(int state)
|
||||
{
|
||||
(void) state;
|
||||
|
||||
for (int i = 0; i < ui->ic->count(); i++)
|
||||
{
|
||||
int ic = ui->ic->itemText(i).toInt();
|
||||
@ -6972,7 +6967,7 @@ ADSBDemodGUI::ADSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb
|
||||
}
|
||||
|
||||
m_osmPort = 0; // Pick a free port
|
||||
m_templateServer = new ADSBOSMTemplateServer("q2RVNAe3eFKCH4XsrE3r", m_osmPort);
|
||||
m_templateServer = new ADSBOSMTemplateServer(maptilerAPIKey(), m_osmPort);
|
||||
|
||||
#ifdef QT_LOCATION_FOUND
|
||||
ui->map->setAttribute(Qt::WA_AcceptTouchEvents, true);
|
||||
@ -7204,6 +7199,13 @@ ADSBDemodGUI::~ADSBDemodGUI()
|
||||
delete m_networkManager;
|
||||
}
|
||||
|
||||
// Free keys, so no point in stealing them :)
|
||||
|
||||
QString ADSBDemodGUI::maptilerAPIKey() const
|
||||
{
|
||||
return m_settings.m_maptilerAPIKey.isEmpty() ? "Nzl2cSyOnewxUc9VWg4n" : m_settings.m_maptilerAPIKey;
|
||||
}
|
||||
|
||||
void ADSBDemodGUI::applySetting(const QString& settingsKey)
|
||||
{
|
||||
applySettings({settingsKey});
|
||||
@ -7231,6 +7233,13 @@ void ADSBDemodGUI::applyAllSettings()
|
||||
// All settings are valid - we just use settingsKeys here to avoid updating things that are slow to update
|
||||
void ADSBDemodGUI::displaySettings(const QStringList& settingsKeys, bool force)
|
||||
{
|
||||
if (settingsKeys.contains("maptilerAPIKey"))
|
||||
{
|
||||
m_templateServer->close();
|
||||
delete m_templateServer;
|
||||
m_templateServer = new ADSBOSMTemplateServer(maptilerAPIKey(), m_osmPort);
|
||||
}
|
||||
|
||||
m_channelMarker.blockSignals(true);
|
||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||
@ -8718,6 +8727,8 @@ static void calcRadialEndPoint(float startLatitude, float startLongitude, float
|
||||
|
||||
void ADSBDemodGUI::updateCoverageMap(float azimuth, float elevation, float distance, float altitude)
|
||||
{
|
||||
(void) elevation;
|
||||
|
||||
int i = (int) (azimuth / ADSBDemodGUI::m_maxRangeDeg);
|
||||
int k = altitude >= 10000 ? 1 : 0;
|
||||
if (distance > m_maxRange[k][i])
|
||||
|
@ -1343,6 +1343,8 @@ private:
|
||||
explicit ADSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
||||
virtual ~ADSBDemodGUI();
|
||||
|
||||
QString maptilerAPIKey() const;
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySetting(const QString& settingsKey);
|
||||
void applySettings(const QStringList& settingsKeys, bool force = false);
|
||||
@ -1375,7 +1377,7 @@ private:
|
||||
bool validateGlobalPosition(double latitude, double longitude, bool countFailure);
|
||||
bool validateLocalPosition(double latitude, double longitude, bool surfacePosition, bool countFailure);
|
||||
bool decodeGlobalPosition(int f, const double cprLat[2], const double cprLong[2], const QDateTime cprTime[2], double& latitude, double& longitude, bool countFailure);
|
||||
bool decodeLocalPosition(int f, double cprLat, double cprLong, bool onSurface, const QDateTime& dateTime, const Aircraft *aircraft, double& latitude, double& longitude, bool countFailure);
|
||||
bool decodeLocalPosition(int f, double cprLat, double cprLong, bool onSurface, const Aircraft *aircraft, double& latitude, double& longitude, bool countFailure);
|
||||
void decodeCpr(const QByteArray& data, int& f, double& latCpr, double& lonCpr) const;
|
||||
bool decodeAltitude(const QByteArray& data, int& altFt) const;
|
||||
void decodeModeSAltitude(const QByteArray& data, const QDateTime dateTime, Aircraft *aircraft);
|
||||
|
@ -80,6 +80,7 @@ void ADSBDemodSettings::resetToDefaults()
|
||||
m_interpolatorTapsPerPhase = 3.5f; // without gaining much improvement in PER
|
||||
m_aviationstackAPIKey = "";
|
||||
m_checkWXAPIKey = "";
|
||||
m_maptilerAPIKey = "";
|
||||
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++)
|
||||
{
|
||||
m_columnIndexes[i] = i;
|
||||
@ -212,6 +213,8 @@ QByteArray ADSBDemodSettings::serialize() const
|
||||
s.writeS32(76, m_chipsThreshold);
|
||||
s.writeBool(77, m_favourLivery);
|
||||
|
||||
s.writeString(78, m_maptilerAPIKey);
|
||||
|
||||
for (int i = 0; i < ADSBDEMOD_COLUMNS; i++) {
|
||||
s.writeS32(100 + i, m_columnIndexes[i]);
|
||||
}
|
||||
@ -357,6 +360,8 @@ bool ADSBDemodSettings::deserialize(const QByteArray& data)
|
||||
d.readS32(76, &m_chipsThreshold, 0);
|
||||
d.readBool(77, &m_favourLivery, true);
|
||||
|
||||
d.readString(78, &m_maptilerAPIKey, "");
|
||||
|
||||
applyPalette();
|
||||
|
||||
#ifdef LINUX
|
||||
@ -579,6 +584,9 @@ void ADSBDemodSettings::applySettings(const QStringList& settingsKeys, const ADS
|
||||
if (settingsKeys.contains("checkWXAPIKey")) {
|
||||
m_checkWXAPIKey = settings.m_checkWXAPIKey;
|
||||
}
|
||||
if (settingsKeys.contains("maptilerAPIKey")) {
|
||||
m_maptilerAPIKey = settings.m_maptilerAPIKey;
|
||||
}
|
||||
if (settingsKeys.contains("logFilename")) {
|
||||
m_logFilename = settings.m_logFilename;
|
||||
}
|
||||
@ -782,6 +790,9 @@ QString ADSBDemodSettings::getDebugString(const QStringList& settingsKeys, bool
|
||||
if (settingsKeys.contains("checkWXAPIKey") || force) {
|
||||
ostr << " m_checkWXAPIKey: " << m_checkWXAPIKey.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("maptilerAPIKey") || force) {
|
||||
ostr << " m_maptilerAPIKey: " << m_maptilerAPIKey.toStdString();
|
||||
}
|
||||
if (settingsKeys.contains("logFilename") || force) {
|
||||
ostr << " m_logFilename: " << m_logFilename.toStdString();
|
||||
}
|
||||
|
@ -195,6 +195,7 @@ struct ADSBDemodSettings
|
||||
QList<NotificationSettings *> m_notificationSettings;
|
||||
QString m_aviationstackAPIKey; //!< aviationstack.com API key
|
||||
QString m_checkWXAPIKey; //!< checkwxapi.com API key
|
||||
QString m_maptilerAPIKey; //!< maptiler.com API key (for osm/satellite map)
|
||||
|
||||
QString m_logFilename;
|
||||
bool m_logEnabled;
|
||||
|
@ -67,14 +67,14 @@ private slots:
|
||||
{
|
||||
xml = QString("\
|
||||
{\
|
||||
\"UrlTemplate\" : \"https://maps.wikimedia.org/osm-intl/%z/%x/%y%1.png\",\
|
||||
\"UrlTemplate\" : \"https://tile.openstreetmap.org/%z/%x/%y.png\",\
|
||||
\"ImageFormat\" : \"png\",\
|
||||
\"QImageFormat\" : \"Indexed8\",\
|
||||
\"ID\" : \"wmf-intl-%2x\",\
|
||||
\"ID\" : \"osm-%1x\",\
|
||||
\"MaximumZoomLevel\" : 18,\
|
||||
\"MapCopyRight\" : \"<a href='https://wikimediafoundation.org/wiki/Terms_of_Use'>WikiMedia Foundation</a>\",\
|
||||
\"DataCopyRight\" : \"<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors\"\
|
||||
}").arg(hiresURL).arg(hires ? 1 : 2);
|
||||
}").arg(hires ? 1 : 2);
|
||||
}
|
||||
else if (tokens[1] == "/satellite")
|
||||
{
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
<h2>Introduction</h2>
|
||||
|
||||
The ADS-B demodulator plugin can be used to receive and display ADS-B and Mode-S frames broadcast by aircraft. These contain information about an aircraft, such as position, altitude, heading and speed, broadcast by aircraft on 1090MHz. ADS-B and Mode-S frames have a chip rate of 2Mchip/s, so the baseband sample rate should be set to 2MSa/s or greater.
|
||||
The ADS-B demodulator plugin can be used to receive and display ADS-B and Mode S frames broadcast by aircraft. These contain information about an aircraft, such as position, altitude, heading and speed, broadcast by aircraft on 1090MHz. ADS-B and Mode S frames have a chip rate of 2Mchip/s, so the baseband sample rate should be set to 2MSa/s or greater.
|
||||
|
||||
As well as displaying information received via ADS-B and Mode-S, the plugin can also combine information from a number of databases to display more information about the aircraft and flight, airports and weather.
|
||||
As well as displaying information received via ADS-B and Mode S, the plugin can also combine information from a number of databases to display more information about the aircraft and flight, airports and weather.
|
||||
|
||||

|
||||
|
||||
@ -36,27 +36,29 @@ Average total power in dB relative to a +/- 1.0 amplitude signal received in the
|
||||
|
||||
This is the bandwidth in MHz of the channel signal before demodulation.
|
||||
|
||||
<h3>QNH</h3>
|
||||
|
||||
The QNH setting should be set to the local air pressure in Hectopascals / millibars. It is used to adjust aircraft reported pressure altitudes to heights for display on the 3D map.
|
||||
|
||||
When unchecked, the QHN setting is automatically adjusted according to values received from aircraft below the transition altitude. When checked, a value can be entered manually.
|
||||
|
||||
<h3>5: SR - Channel Sample Rate</h3>
|
||||
|
||||
This specifies the channel sample rate the demodulator uses. Values of 2M-12MSa/s are supported, 2MSa/s steps. Ideally, this should be set to the same value as the baseband sample rate (the sample rate received from the radio). If it is different from the baseband sample rate, interpolation or decimation will be performed as needed to match the rates. However, interpolation currently requires a significant amount of processing power and may result in dropped samples.
|
||||
This specifies the channel sample rate the demodulator uses. Values of 2M-12MSa/s are supported, 2MSa/s steps. Ideally, this should be set to the same value as the baseband sample rate (the sample rate received from the radio). If it is different from the baseband sample rate, interpolation or decimation will be performed as needed to match the rates. However, interpolation currently requires a significant amount of processing power.
|
||||
|
||||
2 MSa/s should give decent decodes. Higher rates may be experimented with if your hardware allows it (radio device and processing power). However the higher the rate the more processing power required.
|
||||
|
||||
<h3>6: S - Demodulate Mode-S frames</h3>
|
||||
<h3>6: S - Demodulate Mode S frames</h3>
|
||||
|
||||
Checking the S button will enable demodulation of Mode-S ELS (Elementary Surveillance), EHS (Enhanced Surveillance) and MRAR (Meteorological Routine Air Report) frames.
|
||||
|
||||
<h3>7: FP - Correlate Against Full Preamble</h3>
|
||||
|
||||
When the FP button is checked, the demodulator will correlated the received signal against all expected 8 bits of the ES1090 preamble. When unchecked, the correlation will only be against the first 6 bits. Only correlating the first 6 bits can reduce the processing requirements, but may result in more invalid frames.
|
||||
Checking the S button will enable demodulation of Mode S ELS (Elementary Surveillance), EHS (Enhanced Surveillance) and MRAR (Meteorological Routine Air Report) frames.
|
||||
|
||||
<h3>8: Threshold</h3>
|
||||
|
||||
This sets the correlation threshold in dB between the received signal and expected 1090ES preamble, that is required to be exceeded before the demodulator will try to decode a frame. Lower values should decode more frames and will require more processing power, but will more often decode invalid frames. You may also look at correlation values obtained with reliable signals in the "Correlation" column of the data table.
|
||||
|
||||
<h3>9: Download Opensky-Network Aircraft Database</h3>
|
||||
<h3>9: Download Aircraft Database</h3>
|
||||
|
||||
Clicking this will download the [Opensky-Network](https://opensky-network.org/) aircraft database. This database contains information about aircraft, such as registration, aircraft model and owner details, that is not broadcast via ADS-B. Once downloaded, this additional information will be displayed in the table alongside the ADS-B data. The database should only need to be downloaded once, as it is saved to disk, and it is recommended to download it before enabling the demodulator.
|
||||
Clicking this will download the aircraft database. This database contains information about aircraft, such as registration, aircraft model and owner details, that is not broadcast via ADS-B. Once downloaded, this additional information will be displayed in the table alongside the ADS-B data. The database should only need to be downloaded once, as it is saved to disk, and it should be downloaded before starting the demodulator.
|
||||
|
||||
<h3>10: Download OurAirports Airport Databases</h3>
|
||||
|
||||
@ -70,9 +72,24 @@ Clicking this will download the [OpenAIP](https://www.openaip.net/) airspace and
|
||||
|
||||
Clicking the Display Settings button will open the Display Settings dialog, which allows you to choose:
|
||||
|
||||
General:
|
||||
|
||||
* The units for altitude, speed and vertical climb rate. These can be either ft (feet), kn (knots) and ft/min (feet per minute), or m (metres), kph (kilometers per hour) and m/s (metres per second).
|
||||
* Whether aircraft photos are displayed for the highlighted aircraft.
|
||||
* The timeout, in seconds, after which an aircraft will be removed from the table and map, if an ADS-B frame has not been received from it.
|
||||
* The font used for the table.
|
||||
* Whether the columns in the table are automatically resized after an aircraft is added to it. If unchecked, columns can be resized manually and should be saved with presets.
|
||||
* Whether to log 3D model matching information. This explains why a particular 3D model is used for an aircraft / airline.
|
||||
* Whether to favour airline liveries over aircraft type when trying to find a 3D model. E.g. if actual aircraft is BA 787 and that exact 3D model is not available, would you prefer to have a BA 777 model or a 787 with a random livery.
|
||||
* A [aviationstack](https://aviationstack.com/product) API key, needed to download flight information (such as live departure and arrival airports and times).
|
||||
* A [CheckWX](https://www.checkwxapi.com/) API key can be entered in order to download airport weather (METARs) which can be displayed on the map.
|
||||
* The transition altitude in feet for use in ATC mode. Below the TA, altitude will be displayed. Above the TA flight levels will be displayed.
|
||||
|
||||
Map:
|
||||
|
||||
* The map provider. This can be osm for OpenStreetMaps or mapboxgl for Mapbox. mapboxgl is not supported on Windows. mapboxgl should be used on Linux with Qt 5.15.3, as osm maps will cause SDRangel to hang, due to a bug in Qt.
|
||||
* The type of map that will be displayed. This can either be a light or dark aviation map (with no place names to reduce clutter), a street map or satellite imagery.
|
||||
* A [Maptiler](https://www.maptiler.com/) API key can be entered in order to use satellite map imagery. Although you may be able to view satellite imagery without entering a key, if too many users do this, we may exceed our usage quota and then the imagery will be unavailable for all.
|
||||
* The minimum zoom level (0 min zoom - 15 max zoom) at which aircraft icons will be scaled.
|
||||
* The minimum size airport that will be displayed on the map: small, medium or large. Use small to display GA airfields, medium for regional airports and large for international airports.
|
||||
* Whether or not to display heliports.
|
||||
@ -81,16 +98,7 @@ Clicking the Display Settings button will open the Display Settings dialog, whic
|
||||
* The distance (in kilometres), from the location set under Preferences > My Position, at which airspaces will be displayed on the map. Displaying too many airspaces will slow down drawing of the map.
|
||||
* Whether NAVAIDs, such as VORs, are displayed on the map.
|
||||
* Whether callsigns as said by ATC (E.g. Speedbird) are used on the map instead of the airline ICAO designator (E.g. BAW).
|
||||
* Whether aircraft photos are displayed for the highlighted aircraft.
|
||||
* The timeout, in seconds, after which an aircraft will be removed from the table and map, if an ADS-B frame has not been received from it.
|
||||
* The font used for the table.
|
||||
* Whether demodulator statistics are displayed (primarily an option for developers).
|
||||
* Whether the columns in the table are automatically resized after an aircraft is added to it. If unchecked, columns can be resized manually and should be saved with presets.
|
||||
* The transition altitude in feet for use in ATC mode. Below the TA, altitude will be displayed. Above the TA flight levels will be displayed.
|
||||
|
||||
You can also enter an [aviationstack](https://aviationstack.com/product) API key, needed to download flight information (such as departure and arrival airports and times).
|
||||
|
||||
A [CheckWX](https://www.checkwxapi.com/) API key can be entered in order to download airport weather (METARs) which can be displayed on the map.
|
||||
* The colour palette to use for aircraft flight paths.
|
||||
|
||||

|
||||
|
||||
@ -104,7 +112,48 @@ Checking this button draws flight paths for all aircraft.
|
||||
|
||||
<h3>ATC Mode</h3>
|
||||
|
||||
When in ATC mode, the map will display callsign, altitude, ground speed and type for all aircraft. When unchecked, only callsign (or ICAO, until callsign is received) will be displayed.
|
||||
When in ATC mode, the map will display callsign, altitude, ground speed and type, as well as the last 25 seconds of it flight path for all aircraft.
|
||||
When unchecked, only callsign (or ICAO, until callsign is received) will be displayed.
|
||||
|
||||
<h3>Receiver Coverage Map</h3>
|
||||
|
||||
When checked, a receive coverage map will be displayed. This will show the maximum distance a packet has been received from in each direction.
|
||||
The yellow region is for packets freceived from aircraft above 10000ft, with the green region for below 10000ft.
|
||||
|
||||
Right clicking on the button will clear the coverage map data.
|
||||
|
||||

|
||||
|
||||
<h3>Display Statistics</h3>
|
||||
|
||||
When checked, a statistics table will be displayed. This table contains statistics such as:
|
||||
|
||||
* Total number of frames received.
|
||||
* Frame reception rate in fps (frames per second).
|
||||
* Data rate in nbp (kilobits per second).
|
||||
* Number of ADS-B frames received by TC (typecode).
|
||||
* Number of Mode S frarames received by DF (downlink format).
|
||||
* Maximum range to an aircraft in km.
|
||||
* Maximum aircraft altitude in feet.
|
||||
* Maximum reception rate in fps.
|
||||
|
||||
The statistics can be reset by right clicking the button.
|
||||
|
||||
<h3>Display Chart</h3>
|
||||
|
||||
When checked, a chart will be displayed that shows ADS-B and Mode S frame rates in fps (frames per second) as well as the total number of aircraft frames have been received from in the last 10 seconds.
|
||||
The chart is update every second. Data older than 10 minutes is averaged over a minute, in order to keep the number of data points managable.
|
||||
|
||||
You can zoom in/out the chart's horizontal axis using the mouse wheel. Hold shift to zoom in/out the chart's vertical axis.
|
||||
Series can be hidden/shown by clicking on the corresponding label in the legend.
|
||||
|
||||
<h3>Display Orientation</h3>
|
||||
|
||||
Check to display the ADS-B table and map side by side. Uncheck for table on top of the map.
|
||||
|
||||
<h3>Display Containment Radius</h3>
|
||||
|
||||
When checked, an aircrafts horizontal containment radius will be drawn as a red circle around an aircraft on the map. This circle represents the aircrafts uncertainty in its reported position.
|
||||
|
||||
<h3>15: Download flight information for selected flight</h3>
|
||||
|
||||
@ -130,7 +179,7 @@ As a server:
|
||||
|
||||
* For OpenSky Network, check Enable Server and set Port to 30005. You can check for successful feeding at: https://opensky-network.org/my-opensky
|
||||
|
||||
The Beast binary and Hex formats are as detailed here: https://wiki.jetvision.de/wiki/Mode-S_Beast:Data_Output_Formats
|
||||
The Beast binary and Hex formats are as detailed here: https://wiki.jetvision.de/wiki/Mode S_Beast:Data_Output_Formats
|
||||
|
||||
When Enable import is checked, aircraft data for aircraft anywhere in the world can be imported from OpenSky Network.
|
||||
A username and password are not required, but when specified, this allows the update period to be reduced to 5 seconds instead of 10 seconds, and 4000 API calls per day instead of 400.
|
||||
@ -202,6 +251,7 @@ In the Speech and Command strings, variables can be used to substitute in data f
|
||||
* ${category}
|
||||
* ${status}
|
||||
* ${squawk}
|
||||
* ${ident}
|
||||
* ${registration}
|
||||
* ${manufacturer}
|
||||
* ${owner}
|
||||
@ -209,6 +259,12 @@ In the Speech and Command strings, variables can be used to substitute in data f
|
||||
* ${ap}
|
||||
* ${vMode}
|
||||
* ${lMode}
|
||||
* ${tcas}
|
||||
* ${acas}
|
||||
* ${ra}
|
||||
* ${version}
|
||||
* ${length}
|
||||
* ${width}
|
||||
* ${baro}
|
||||
* ${headwind}
|
||||
* ${windSpeed}
|
||||
@ -218,6 +274,7 @@ In the Speech and Command strings, variables can be used to substitute in data f
|
||||
* ${humidity}
|
||||
* ${latitude}
|
||||
* ${longitude}
|
||||
* ${ic}
|
||||
* ${rssi}
|
||||
* ${flightstatus}
|
||||
* ${departure}
|
||||
@ -247,58 +304,81 @@ Specify the AM Demodulator that will be have its centre frequency set when an ai
|
||||
|
||||
<h3>ADS-B Data</h3>
|
||||
|
||||
The table displays the decoded ADS-B and Mode-S data for each aircraft along side data available for the aircraft from the Opensky Network database (DB) and aviationstack (API). The data is not all able to be transmitted in a single ADS-B frame, so the table displays an amalgamation of the latest received data of each type.
|
||||
The table displays the decoded ADS-B and Mode S data for each aircraft along side data available for the aircraft from the database (DB) and aviationstack (API). The data is not all able to be transmitted in a single ADS-B frame, so the table displays an amalgamation of the latest received data of each type.
|
||||
|
||||

|
||||
|
||||
* ICAO ID - 24-bit hexadecimal ICAO aircraft address. This is unique for each aircraft. (ADS-B)
|
||||
* Callsign - Aircraft callsign (which is sometimes also the flight number). (ADS-B / Mode-S)
|
||||
* ATC callsign - Callsign used by ATC (E.g. Speedbird for British Airways).
|
||||
* Callsign - Aircraft callsign (which is sometimes also the flight number). (ADS-B / Mode S)
|
||||
* ATC callsign - Callsign used by ATC (E.g. Speedbird for BAW / British Airways).
|
||||
* Aircraft - The aircraft model. (DB)
|
||||
* Type - The aircraft's ICAO type desiginator. (DB)
|
||||
* Sideview - Sideview image of the aircraft. (DB)
|
||||
* Airline - The logo of the operator of the aircraft (or owner if no operator known). (DB)
|
||||
* Country - The flag of the country the aircraft is registered in. (DB)
|
||||
* GS - Groundspeed in knots or kilometers per hour. (Mode-S)
|
||||
* TAS - True airspeed in knots or kilometers per hour. (Mode-S)
|
||||
* IAS - Indicated airspeed in knots or kilometers per hour. (Mode-S)
|
||||
* Mach - Mach number. (Mode-S)
|
||||
* Sel Alt - Selected altitude (as set on MCP/FCU or by FMS) in feet or metres. (ADS-B / Mode-S)
|
||||
* Alt - Altitude in feet or metres. (ADS-B / Mode-S)
|
||||
* VR - The vertical climb rate (or descent rate if negative) in feet/minute or m/s. (ADS-B / Mode-S)
|
||||
* Sel Hd - Selected heading (as set on MCP/FCU or by FMS) in degrees. (ADS-B / Mode-S)
|
||||
* Hd - The aircraft heading or track, in degrees. (ADS-B / Mode-S)
|
||||
* TR - Turn rate in degrees per second. (Mode-S)
|
||||
* Roll - Roll angle in degrees. Positive is right wing down. (Mode-S)
|
||||
* GS - Groundspeed in knots or kilometers per hour. (Mode S)
|
||||
* TAS - True airspeed in knots or kilometers per hour. (Mode S)
|
||||
* IAS - Indicated airspeed in knots or kilometers per hour. (Mode S)
|
||||
* Mach - Mach number. (Mode S)
|
||||
* Sel Alt - Selected altitude (as set on MCP/FCU or by FMS) in feet or metres. (ADS-B / Mode S)
|
||||
* Alt - Altitude in feet or metres. Typically the barometric altitude, but can be GNSS height. (ADS-B / Mode S)
|
||||
* VR - The vertical climb rate (or descent rate if negative) in feet/minute or m/s. (ADS-B / Mode S)
|
||||
* Sel Hd - Selected heading (as set on MCP/FCU or by FMS) in degrees. (ADS-B / Mode S)
|
||||
* Hd - The aircraft heading, in degrees magnetic. (ADS-B / Mode S)
|
||||
* Trk - The aircraft track, in degrees. (ADS-B / Mode S)
|
||||
* TR - Turn rate in degrees per second. (Mode S)
|
||||
* Roll - Roll angle in degrees. Positive is right wing down. (Mode S)
|
||||
* D - The distance to the aircraft from the receiving antenna in kilometres. The location of the receiving antenna is set under the Preferences > My Position menu.
|
||||
* Az/El - The azimuth and elevation angles to the aircraft from the receiving antenna in degrees. These values can be sent to a rotator controller Feature plugin to track the aircraft.
|
||||
* Category (Cat) - The vehicle category, such as Light, Large, Heavy or Rotorcraft. (ADS-B)
|
||||
* Status - The status of the flight, including if there is an emergency. (ADS-B)
|
||||
* Squawk - The squawk code (Mode-A transponder code). (ADS-B / Mode-S)
|
||||
* Squawk - The squawk code (Mode-A transponder code). (ADS-B / Mode S)
|
||||
* Ident - Ident switch active. (ADS-B)
|
||||
* Registration (Reg) - The registration number of the aircraft. (DB)
|
||||
* Registered - The date when the aircraft was registered. (DB)
|
||||
* Manufacturer - The manufacturer of the aircraft. (DB)
|
||||
* Owner - The owner of the aircraft. (DB)
|
||||
* Operator - The operator ICAO. (DB)
|
||||
* AP - Whether autopilot is enabled. (ADS-B)
|
||||
* V Mode - Vertical navigation mode. This may be VNAV (Vertical navigation), HOLD (Altitude hold) or APP (Approach). (ADS-B / Mode-S)
|
||||
* V Mode - Vertical navigation mode. This may be VNAV (Vertical navigation), HOLD (Altitude hold) or APP (Approach). (ADS-B / Mode S)
|
||||
* L Mode - Lateral navigation mode. This may be LNAV (Lateral navigation) or APP (Approach). (ADS-B)
|
||||
* Baro - Baro setting in mb. (ADS-B / Mode-S)
|
||||
* H Wnd - Headwind in knots or kilometers per hour. Negative values indicate a tailwind. (Derived from Mode-S)
|
||||
* OAT - Outside air temperature in degrees Celsius, estimated from Mach and TAS. (Derived from Mode-S)
|
||||
* Wnd - Wind speed in knots or kilometers per hour. (Mode-S)
|
||||
* Wnd - Wind direction in degrees. (Mode-S)
|
||||
* P - Average static air pressure in hectopascals. (Mode-S)
|
||||
* T - Static air temperature in degrees Celsius. (Mode-S)
|
||||
* U - Humidity in percent. (Mode-S)
|
||||
* TCAS - Whether TCAS is operational, or RA in red if an RA (Resolution Advisory) is active. (Mode S)
|
||||
* ACAS - ACAS capability: V=Vertical, H=Horizontal. (Mode S)
|
||||
* RA - ACAS resolution advistory. (Mode S)
|
||||
* Max AS - Maximum airspeed in knots. (Mode S)
|
||||
* Version - ADS-B version number. Only available for aircraft on the surface. (ADS-B)
|
||||
* L - Length of aircraft in metres. Only available for aircraft on the surface. (ADS-B)
|
||||
* W - Width of aircraft in metres. (ADS-B)
|
||||
* QNH - QNH/barometer setting in millibar/hectopascals. (ADS-B / Mode S)
|
||||
* H Wnd - Headwind in knots or kilometers per hour. Negative values indicate a tailwind. (Derived from Mode S)
|
||||
* OAT - Outside air temperature in degrees Celsius, estimated from Mach and TAS. (Derived from Mode S)
|
||||
* Wnd - Wind speed in knots or kilometers per hour. (Mode S)
|
||||
* Wnd - Wind direction in degrees. (Mode S)
|
||||
* P - Average static air pressure in hectopascals. (Mode S)
|
||||
* T - Static air temperature in degrees Celsius. (Mode S)
|
||||
* U - Humidity in percent. (Mode S)
|
||||
* Latitude (Lat) - Vertical position coordinate, in decimal degrees. North positive. (ADS-B)
|
||||
* Longitude (Lon) - Horizontal position coordinate, in decimal degrees. East positive. (ADS-B)
|
||||
* Updated - The local time at which the last message was received. (ADS-B / Mode-S)
|
||||
* RX Frames - A count of the number of frames received from this aircraft. (ADS-B / Mode-S)
|
||||
* TIS-B - A count of the number of TIS-B frames for this aircraft. (ADS-B)
|
||||
* IC - Interogator code of Mode S ground station. (Mode S)
|
||||
* Updated - The local time at which the last message was received. (ADS-B / Mode S)
|
||||
* Frames - A count of the total number of frames received from this aircraft. (ADS-B / Mode S)
|
||||
* ADS-B FC - A count of the number of ADS-B frames received from this aircraft. (ADS-B)
|
||||
* Mode S FC - A count of the number of Mode S frames (excluding ADS-B) received from this aircraft. (Mode S)
|
||||
* Non-transponder - A count of the number of ADS-B non-transponder frames received. (ADS-B NT)
|
||||
* TIS-B FC - A count of the number of TIS-B frames for this aircraft. (ADS-B)
|
||||
* ADS-R FC - A count of the number of ADS-R frames for this aircraft. (ADS-R)
|
||||
* Rc - Horizontal containment radius for the aircraft. (ADS-B)
|
||||
* NACp - Navigation Accuracy Category for position. (ADS-B)
|
||||
* NACv - Navigation Accuracy Category for velocity. (ADS-B)
|
||||
* GVA - Geometric Vertical Accuracy. (ADS-B)
|
||||
* NIC - Navigation Integrity Category. (ADS-B)
|
||||
* NICbaro - Barometric Altitude Integrity Code. Whether the barometric pressure altitude has been cross-checked against another source. (ADS-B)
|
||||
* SIL - Source Integrity Level. (ADS-B)
|
||||
* Correlation - Displays the minimum, average and maximum of the preamble correlation in dB for each received frame. These values can be used to help select a threshold setting. This correlation value is the ratio between the presence and absence of the signal corresponding to the "ones" and the "zeros" of the sync word adjusted by the bits ratio. It can be interpreted as a SNR estimation.
|
||||
* RSSI - This Received Signal Strength Indicator is based on the signal power during correlation estimation. This is the power sum during the expected presence of the signal i.e. the "ones" of the sync word.
|
||||
* Flight status - scheduled, active, landed, cancelled, incident or diverted. (API)
|
||||
* Dep - Departure airport. (API)
|
||||
* Arr - Arrival airport. (API)
|
||||
* Dep - Departure airport. (DB / API)
|
||||
* Arr - Arrival airport. (DB / API)
|
||||
* STD - Scheduled time of departure. (API)
|
||||
* ETD - Estimated time of departure. (API)
|
||||
* ATD - Actual time of departure. (API)
|
||||
@ -343,8 +423,12 @@ The Az/El row gives the azimuth and elevation of the airport from the location s
|
||||
|
||||
<h2>Attribution</h2>
|
||||
|
||||
Airline logos and flags are by Steve Hibberd from https://radarspotting.com
|
||||
Airline logos, sideviews and flags are by Steve Hibberd from [RadarSpotting](https://radarspotting.com)
|
||||
|
||||
Map icons are by Cuperto, Alice Design, Alex Ahineev, Botho Willer, Verry Obito, Sean Maldjia, Tinashe Mugayi, Georgiana Ionescu, Andreas Vögele, Tom Fricker, Will Sullivan, Tim Tores, BGBOXXX Design, and Angriawan Ditya Zulkarnain from the Noun Project https://thenounproject.com/
|
||||
Aircraft and route data comes from [OpenSky Network](https://opensky-network.org/), [RadarSpotting](https://radarspotting.com) / [Planebase](https://planebase.biz/) and [VRS](https://sdm.virtualradarserver.co.uk/).
|
||||
|
||||
Map icons are by Pablo Rozenberg, Cuperto, Alice Design, Alex Ahineev, Botho Willer, Verry Obito, Sean Maldjia, Tinashe Mugayi, Georgiana Ionescu, Andreas Vögele, Tom Fricker, Will Sullivan, Tim Tores, BGBOXXX Design, Joel Wisneski, Sergey Kashin and Angriawan Ditya Zulkarnain from the [Noun Project](https://thenounproject.com/)
|
||||
|
||||
F35 icon is from [Vecteezy](www.vecteezy.com).
|
||||
|
||||
NDB icon is by Inductiveload from WikiMedia.
|
||||
|
Loading…
x
Reference in New Issue
Block a user