Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/QGCApplication.cc
Original file line number Diff line number Diff line change
Expand Up @@ -893,9 +893,9 @@ QString QGCApplication::bigSizeToString(quint64 size)
QString result;
const QLocale kLocale = getCurrentLanguage();
if (size < 1024) {
result = kLocale.toString(size);
result = kLocale.toString(size) + "B";
} else if (size < pow(1024, 2)) {
result = kLocale.toString(static_cast<double>(size) / 1024.0, 'f', 1) + "kB";
result = kLocale.toString(static_cast<double>(size) / 1024.0, 'f', 1) + "KB";
} else if (size < pow(1024, 3)) {
result = kLocale.toString(static_cast<double>(size) / pow(1024, 2), 'f', 1) + "MB";
} else if (size < pow(1024, 4)) {
Expand Down
7 changes: 4 additions & 3 deletions src/QmlControls/QGroundControlQmlGlobal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
#include "QGCApplication.h"
#include "LinkManager.h"
#include "MAVLinkProtocol.h"
#include "ElevationMapProvider.h"
#include "FirmwarePluginManager.h"
#include "AppSettings.h"
#include "FlightMapSettings.h"
#include "SettingsManager.h"
#include "PositionManager.h"
#include "QGCMapEngineManager.h"
#include "ADSBVehicleManager.h"
Expand Down Expand Up @@ -336,12 +337,12 @@ int QGroundControlQmlGlobal::mavlinkSystemID()

QString QGroundControlQmlGlobal::elevationProviderName()
{
return CopernicusElevationProvider::kProviderKey;
return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
}

QString QGroundControlQmlGlobal::elevationProviderNotice()
{
return CopernicusElevationProvider::kProviderNotice;
return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
}

QString QGroundControlQmlGlobal::parameterFileExtension() const
Expand Down
4 changes: 2 additions & 2 deletions src/QmlControls/QGroundControlQmlGlobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,8 @@ class QGroundControlQmlGlobal : public QGCTool
bool hasMAVLinkInspector () { return true; }
#endif

static QString elevationProviderName ();
static QString elevationProviderNotice ();
QString elevationProviderName ();
QString elevationProviderNotice ();

bool singleFirmwareSupport ();
bool singleVehicleSupport ();
Expand Down
1 change: 1 addition & 0 deletions src/QtLocationPlugin/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ target_link_libraries(QGCLocation
PRIVATE
Qt6::Positioning
Qt6::Sql
Compression
QGC
Settings
Utilities
Expand Down
20 changes: 12 additions & 8 deletions src/QtLocationPlugin/Providers/ElevationMapProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,30 @@
#include "ElevationMapProvider.h"
#include "TerrainTileCopernicus.h"

#include <QtCore/QDir>
#include <QtCore/QTemporaryFile>

int CopernicusElevationProvider::long2tileX(double lon, int z) const
{
Q_UNUSED(z)
return static_cast<int>(floor((lon + 180.0) / TerrainTileCopernicus::tileSizeDegrees));
return static_cast<int>(floor((lon + 180.0) / TerrainTileCopernicus::kTileSizeDegrees));
}

int CopernicusElevationProvider::lat2tileY(double lat, int z) const
{
Q_UNUSED(z)
return static_cast<int>(floor((lat + 90.0) / TerrainTileCopernicus::tileSizeDegrees));
return static_cast<int>(floor((lat + 90.0) / TerrainTileCopernicus::kTileSizeDegrees));
}

QString CopernicusElevationProvider::_getURL(int x, int y, int zoom) const
{
Q_UNUSED(zoom)
return _mapUrl
.arg((static_cast<double>(y) * TerrainTileCopernicus::tileSizeDegrees) - 90.0)
.arg((static_cast<double>(x) * TerrainTileCopernicus::tileSizeDegrees) - 180.0)
.arg((static_cast<double>(y + 1) * TerrainTileCopernicus::tileSizeDegrees) - 90.0)
.arg((static_cast<double>(x + 1) * TerrainTileCopernicus::tileSizeDegrees) - 180.0);
const double lat1 = (static_cast<double>(y) * TerrainTileCopernicus::kTileSizeDegrees) - 90.0;
const double lon1 = (static_cast<double>(x) * TerrainTileCopernicus::kTileSizeDegrees) - 180.0;
const double lat2 = (static_cast<double>(y + 1) * TerrainTileCopernicus::kTileSizeDegrees) - 90.0;
const double lon2 = (static_cast<double>(x + 1) * TerrainTileCopernicus::kTileSizeDegrees) - 180.0;
const QString url = _mapUrl.arg(lat1).arg(lon1).arg(lat2).arg(lon2);
return url;
}

QGCTileSet CopernicusElevationProvider::getTileCount(int zoom, double topleftLon,
Expand All @@ -59,5 +63,5 @@ QGCTileSet CopernicusElevationProvider::getTileCount(int zoom, double topleftLon

QByteArray CopernicusElevationProvider::serialize(const QByteArray &image) const
{
return TerrainTileCopernicus::serializeFromJson(image);
return TerrainTileCopernicus::serializeFromData(image);
}
17 changes: 9 additions & 8 deletions src/QtLocationPlugin/Providers/ElevationMapProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@

#include "MapProvider.h"

static constexpr const quint32 AVERAGE_COPERNICUS_ELEV_SIZE = 2786;

class ElevationProvider : public MapProvider
{
protected:
Expand All @@ -30,16 +28,17 @@ class ElevationProvider : public MapProvider
virtual QByteArray serialize(const QByteArray &image) const = 0;
};

/// https://spacedata.copernicus.eu/collections/copernicus-digital-elevation-model
class CopernicusElevationProvider : public ElevationProvider
{
public:
CopernicusElevationProvider()
: ElevationProvider(
QStringLiteral("Copernicus Elevation"),
QStringLiteral("https://terrain-ce.suite.auterion.com/"),
kProviderKey,
kProviderURL,
QStringLiteral("bin"),
AVERAGE_COPERNICUS_ELEV_SIZE,
QGeoMapType::StreetMap) {}
kAvgElevSize,
QGeoMapType::TerrainMap) {}

int long2tileX(double lon, int z) const final;
int lat2tileY(double lat, int z) const final;
Expand All @@ -50,11 +49,13 @@ class CopernicusElevationProvider : public ElevationProvider

QByteArray serialize(const QByteArray &image) const final;

static constexpr const char *kProviderKey = "Copernicus Elevation";
static constexpr const char *kProviderKey = "Copernicus";
static constexpr const char *kProviderNotice = "© Airbus Defence and Space GmbH";
static constexpr const char *kProviderURL = "https://terrain-ce.suite.auterion.com";
static constexpr quint32 kAvgElevSize = 2786;

private:
QString _getURL(int x, int y, int zoom) const final;

const QString _mapUrl = QStringLiteral("https://terrain-ce.suite.auterion.com/api/v1/carpet?points=%1,%2,%3,%4");
const QString _mapUrl = QString(kProviderURL) + QStringLiteral("/api/v1/carpet?points=%1,%2,%3,%4");
};
1 change: 0 additions & 1 deletion src/QtLocationPlugin/QGCCachedTileSet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include <QGCApplication.h>
#include <QGCFileDownload.h>
#include <QGCLoggingCategory.h>
#include <TerrainTile.h>

#include <QtNetwork/QNetworkProxy>

Expand Down
27 changes: 21 additions & 6 deletions src/QtLocationPlugin/QGCMapUrlEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,6 @@ const QList<SharedMapProvider> UrlFactory::_providers = {
std::make_shared<VWorldStreetMapProvider>(),
std::make_shared<VWorldSatMapProvider>(),

std::make_shared<CopernicusElevationProvider>(),

std::make_shared<JapanStdMapProvider>(),
std::make_shared<JapanSeamlessMapProvider>(),
std::make_shared<JapanAnaglyphMapProvider>(),
Expand All @@ -72,7 +70,9 @@ const QList<SharedMapProvider> UrlFactory::_providers = {

std::make_shared<LINZBasemapMapProvider>(),

std::make_shared<CustomURLMapProvider>()
std::make_shared<CustomURLMapProvider>(),

std::make_shared<CopernicusElevationProvider>()
};

QString UrlFactory::getImageFormat(int qtMapId, QByteArrayView image)
Expand Down Expand Up @@ -229,6 +229,18 @@ int UrlFactory::getQtMapIdFromProviderType(QStringView type)
return -1;
}

QStringList UrlFactory::getElevationProviderTypes()
{
QStringList types;
for (const SharedMapProvider &provider : _providers) {
if (provider->isElevationProvider()) {
(void) types.append(provider->getMapName());
}
}

return types;
}

QStringList UrlFactory::getProviderTypes()
{
QStringList types;
Expand All @@ -242,18 +254,21 @@ QStringList UrlFactory::getProviderTypes()
QString UrlFactory::providerTypeFromHash(int hash)
{
for (const SharedMapProvider &provider : _providers) {
if (hashFromProviderType(provider->getMapName()) == hash) {
return provider->getMapName();
const QString mapName = provider->getMapName();
if (hashFromProviderType(mapName) == hash) {
return mapName;
}
}

qCWarning(QGCMapUrlEngineLog) << Q_FUNC_INFO << "provider not found from hash:" << hash;
return QStringLiteral("");
}

// This seems to limit provider name length to less than ~25 chars due to downcasting to int
int UrlFactory::hashFromProviderType(QStringView type)
{
return static_cast<int>(qHash(type) >> 1);
const auto hash = qHash(type) >> 1;
return static_cast<int>(hash);
}

QString UrlFactory::tileHashToType(QStringView tileHash)
Expand Down
1 change: 1 addition & 0 deletions src/QtLocationPlugin/QGCMapUrlEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class UrlFactory
QStringView mapType);

static const QList<std::shared_ptr<const MapProvider>>& getProviders() { return _providers; }
static QStringList getElevationProviderTypes();
static QStringList getProviderTypes();
static int getQtMapIdFromProviderType(QStringView type);
static QString getProviderTypeFromQtMapId(int qtMapId);
Expand Down
26 changes: 18 additions & 8 deletions src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#include "ElevationMapProvider.h"
#include "QmlObjectListModel.h"
#include "QGCApplication.h"
#include "QGCToolbox.h"
#include "SettingsManager.h"
#include "QGCLoggingCategory.h"

#include <QtCore/qapplicationstatic.h>
Expand All @@ -29,9 +31,6 @@

QGC_LOGGING_CATEGORY(QGCMapEngineManagerLog, "qgc.qtlocation.qmlcontrol.qgcmapenginemanagerlog")

static const QString kQmlOfflineMapKeyName = QStringLiteral("QGCOfflineMap");
static const QString kElevationMapType = QString(CopernicusElevationProvider::kProviderKey); // TODO: Variable Elevation Provider Type

Q_APPLICATION_STATIC(QGCMapEngineManager, _mapEngineManager);

QGCMapEngineManager *QGCMapEngineManager::instance()
Expand Down Expand Up @@ -75,7 +74,8 @@ void QGCMapEngineManager::updateForCurrentView(double lon0, double lat0, double
}

if (_fetchElevation) {
const QGCTileSet set = UrlFactory::getTileCount(1, lon0, lat0, lon1, lat1, kElevationMapType);
const QString elevationProviderName = qgcApp()->toolbox()->settingsManager()->flightMapSettings()->elevationMapProvider()->rawValue().toString();
const QGCTileSet set = UrlFactory::getTileCount(1, lon0, lat0, lon1, lat1, elevationProviderName);
_elevationSet += set;
}

Expand Down Expand Up @@ -142,9 +142,11 @@ void QGCMapEngineManager::startDownload(const QString &name, const QString &mapT
qCWarning(QGCMapEngineManagerLog) << Q_FUNC_INFO << "No Tiles to save";
}

if ((mapType != kElevationMapType) && _fetchElevation) {
const int mapid = UrlFactory::getQtMapIdFromProviderType(mapType);
if (_fetchElevation && !UrlFactory::isElevation(mapid)) {
QGCCachedTileSet* const set = new QGCCachedTileSet(name + QStringLiteral(" Elevation"));
set->setMapTypeStr(kElevationMapType);
const QString elevationProviderName = qgcApp()->toolbox()->settingsManager()->flightMapSettings()->elevationMapProvider()->rawValue().toString();
set->setMapTypeStr(elevationProviderName);
set->setTopleftLat(_topleftLat);
set->setTopleftLon(_topleftLon);
set->setBottomRightLat(_bottomRightLat);
Expand All @@ -153,7 +155,7 @@ void QGCMapEngineManager::startDownload(const QString &name, const QString &mapT
set->setMaxZoom(1);
set->setTotalTileSize(_elevationSet.tileSize);
set->setTotalTileCount(static_cast<quint32>(_elevationSet.tileCount));
set->setType(kElevationMapType);
set->setType(elevationProviderName);

QGCCreateTileSetTask* const task = new QGCCreateTileSetTask(set);
(void) connect(task, &QGCCreateTileSetTask::tileSetSaved, this, &QGCMapEngineManager::_tileSetSaved);
Expand Down Expand Up @@ -436,11 +438,19 @@ QStringList QGCMapEngineManager::mapList()
QStringList QGCMapEngineManager::mapProviderList()
{
QStringList mapStringList = mapList();
(void) mapStringList.removeAll(CopernicusElevationProvider::kProviderKey);
const QStringList elevationStringList = elevationProviderList();
for (const QString &elevationProviderName : elevationStringList) {
(void) mapStringList.removeAll(elevationProviderName);
}

static const QRegularExpression providerType = QRegularExpression(QStringLiteral("^([^\\ ]*) (.*)$"));
(void) mapStringList.replaceInStrings(providerType,"\\1");
(void) mapStringList.removeDuplicates();

return mapStringList;
}

QStringList QGCMapEngineManager::elevationProviderList()
{
return UrlFactory::getElevationProviderTypes();
}
5 changes: 4 additions & 1 deletion src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class QGCMapEngineManager : public QObject
// QML_SINGLETON
Q_MOC_INCLUDE("QmlObjectListModel.h")
Q_MOC_INCLUDE("QGCCachedTileSet.h")

Q_PROPERTY(bool fetchElevation MEMBER _fetchElevation NOTIFY fetchElevationChanged)
Q_PROPERTY(bool importReplace MEMBER _importReplace NOTIFY importReplaceChanged)
Q_PROPERTY(ImportAction importAction READ importAction WRITE setImportAction NOTIFY importActionChanged)
Expand All @@ -43,6 +42,7 @@ class QGCMapEngineManager : public QObject
Q_PROPERTY(QString tileSizeStr READ tileSizeStr NOTIFY tileSizeChanged)
Q_PROPERTY(QStringList mapList READ mapList CONSTANT)
Q_PROPERTY(QStringList mapProviderList READ mapProviderList CONSTANT)
Q_PROPERTY(QStringList elevationProviderList READ elevationProviderList CONSTANT)
Q_PROPERTY(quint64 tileCount READ tileCount NOTIFY tileCountChanged)
Q_PROPERTY(quint64 tileSize READ tileSize NOTIFY tileSizeChanged)

Expand Down Expand Up @@ -92,6 +92,7 @@ class QGCMapEngineManager : public QObject

static QStringList mapList();
static QStringList mapProviderList();
static QStringList elevationProviderList();

signals:
void actionProgressChanged();
Expand Down Expand Up @@ -133,4 +134,6 @@ private slots:
QString _errorMessage;
bool _fetchElevation = true;
bool _importReplace = false;

static constexpr const char *kQmlOfflineMapKeyName = "QGCOfflineMap";
};
6 changes: 6 additions & 0 deletions src/Settings/FlightMap.SettingsGroup.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@
"shortDesc": "Currently selected map type for flight maps",
"type": "string",
"default": "Hybrid"
},
{
"name": "elevationMapProvider",
"shortDesc": "Currently selected elevation map provider",
"type": "string",
"default": "Copernicus"
}
]
}
1 change: 1 addition & 0 deletions src/Settings/FlightMapSettings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ DECLARE_SETTINGGROUP(FlightMap, "FlightMap")

DECLARE_SETTINGSFACT(FlightMapSettings, mapProvider)
DECLARE_SETTINGSFACT(FlightMapSettings, mapType)
DECLARE_SETTINGSFACT(FlightMapSettings, elevationMapProvider)
2 changes: 1 addition & 1 deletion src/Settings/FlightMapSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ class FlightMapSettings : public SettingsGroup
DEFINE_SETTING_NAME_GROUP()
DEFINE_SETTINGFACT(mapProvider)
DEFINE_SETTINGFACT(mapType)

DEFINE_SETTINGFACT(elevationMapProvider)
};
14 changes: 9 additions & 5 deletions src/Terrain/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
find_package(Qt6 REQUIRED COMPONENTS Core Location Network Positioning)

qt_add_library(Terrain STATIC
Providers/TerrainQueryCopernicus.cc
Providers/TerrainQueryCopernicus.h
Providers/TerrainTileCopernicus.cc
Providers/TerrainTileCopernicus.h
TerrainQuery.cc
TerrainQuery.h
TerrainQueryAirMap.cc
TerrainQueryAirMap.h
TerrainQueryInterface.cc
TerrainQueryInterface.h
TerrainTile.cc
TerrainTile.h
TerrainTileCopernicus.cc
TerrainTileCopernicus.h
TerrainTileManager.cc
TerrainTileManager.h
)
Expand All @@ -26,4 +26,8 @@ target_link_libraries(Terrain
Qt6::Positioning
)

target_include_directories(Terrain PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(Terrain
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/Providers
)
Loading
Loading