1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-15 21:01:45 -05:00
sdrangel/sdrbase/util/osndb.h
Jon Beniston 9c7aa8b333 Map Updates
Allow OpenSkyNetwork DB, OpenAIP and OurAirports DB stuctures to be
shared by different plugins, to speed up loading.
Perform map anti-aliasing on the whole map, rather than just info boxes,
to improve rendering speed when there are many items. Add map
multisampling as a preference.
Add plotting of airspaces, airports, navaids on Map feature.
Add support for polylines and polygons to be plotted on Map feature.
Add support for images to 2D Map feature.
Add distance and name filters to Map feature.
Filter map items when zoomed out or if off screen, to improve rendering
performance.
Add UK DAB, FM and AM transmitters to Map feature.
Use labelless maps for 2D transmit maps in Map feature (same as in ADS-B
demod).
2023-02-14 14:46:08 +00:00

159 lines
5.6 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2020 Jon Beniston, M7RCE //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_OSNDB_H
#define INCLUDE_OSNDB_H
#include <QString>
#include <QHash>
#include <QList>
#include <QDebug>
#include <QIcon>
#include <QMutex>
#include <QStandardPaths>
#include <QDateTime>
#include <stdio.h>
#include <string.h>
#include "util/csv.h"
#include "util/httpdownloadmanager.h"
#include "export.h"
#define OSNDB_URL "https://opensky-network.org/datasets/metadata/aircraftDatabase.zip"
struct SDRBASE_API AircraftInformation {
int m_icao;
QString m_registration;
QString m_manufacturerName;
QString m_model;
QString m_owner;
QString m_operator;
QString m_operatorICAO;
QString m_registered;
static void init()
{
QMutexLocker locker(&m_mutex);
if (!m_prefixMap)
{
// Read registration prefix to country map
m_prefixMap = CSV::hash(":/flags/regprefixmap.csv");
// Read operator air force to military map
m_militaryMap = CSV::hash(":/flags/militarymap.csv");
}
}
// Get flag based on registration
QString getFlag() const;
static QString getAirlineIconPath(const QString &operatorICAO);
// Try to find an airline logo based on ICAO
static QIcon *getAirlineIcon(const QString &operatorICAO);
static QString getFlagIconPath(const QString &country);
// Try to find an flag logo based on a country
static QIcon *getFlagIcon(const QString &country);
private:
static QHash<QString, QIcon *> m_airlineIcons; // Hashed on airline ICAO
static QHash<QString, bool> m_airlineMissingIcons; // Hash containing which ICAOs we don't have icons for
static QHash<QString, QIcon *> m_flagIcons; // Hashed on country
static QHash<QString, QString> *m_prefixMap; // Registration to country (flag name)
static QHash<QString, QString> *m_militaryMap; // Operator airforce to military (flag name)
static QMutex m_mutex;
};
class SDRBASE_API OsnDB : public QObject {
Q_OBJECT
public:
OsnDB(QObject* parent=nullptr);
~OsnDB();
void downloadAircraftInformation();
static QSharedPointer<const QHash<int, AircraftInformation *>> getAircraftInformation();
static QSharedPointer<const QHash<QString, AircraftInformation *>> getAircraftInformationByReg();
static QString getOSNDBZipFilename()
{
return getDataDir() + "/aircraftDatabase.zip";
}
static QString getOSNDBFilename()
{
return getDataDir() + "/aircraftDatabase.csv";
}
static QString getDataDir()
{
// Get directory to store app data in (aircraft & airport databases and user-definable icons)
QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
// First dir is writable
return locations[0];
}
private:
HttpDownloadManager m_dlm;
static QSharedPointer<const QHash<int, AircraftInformation *>> m_aircraftInformation;
static QSharedPointer<const QHash<QString, AircraftInformation *>> m_aircraftInformationByReg;
static QDateTime m_modifiedDateTime;
// Write a reduced size and validated version of the DB, so it loads quicker
static bool writeFastDB(const QString &filename, const QHash<int, AircraftInformation *> *aircraftInfo);
// Read smaller CSV file with no validation. Takes about 0.5s instead of 2s.
static QHash<int, AircraftInformation *> *readFastDB(const QString &filename);
// Read OpenSky Network CSV file
// This is large and contains lots of data we don't want, so we convert to
// a smaller version to speed up loading time
// Note that we use C file functions rather than QT, as these are ~30% faster
// and the QT version seemed to occasionally crash
static QHash<int, AircraftInformation *> *readOSNDB(const QString &filename);
static QString getFastDBFilename()
{
return getDataDir() + "/aircraftDatabaseFast.csv";
}
// Create hash table using registration as key
static QHash<QString, AircraftInformation *> *registrationHash(const QHash<int, AircraftInformation *> *in);
private slots:
void downloadFinished(const QString& filename, bool success);
signals:
void downloadingURL(const QString& url);
void downloadError(const QString& error);
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void downloadAircraftInformationFinished();
};
#endif