Skip to content
Open
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
5 changes: 5 additions & 0 deletions src/QGCApplication.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "QGCImageProvider.h"
#include "QGCLoggingCategory.h"
#include "QGCLoggingCategoryManager.h"
#include "QGCMapEngineManager.h"
#include "SettingsManager.h"
#include "MavlinkSettings.h"
#include "AppSettings.h"
Expand Down Expand Up @@ -242,6 +243,10 @@ void QGCApplication::init()
qCWarning(QGCApplicationLog) << "Could not load /fonts/opensans-demibold font";
}

// Register here, not in _initQmlRootWindow, so the unit-test harness (which builds
// its own engine) also resolves the QGroundControl.QGCMapEngineManager QML import.
QGCMapEngineManager::registerQmlTypes();

if (_simpleBootTest) {
// Since GStream builds are so problematic we initialize video during the simple boot test
// to make sure it works and verfies plugin availability.
Expand Down
11 changes: 11 additions & 0 deletions src/QtLocationPlugin/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,17 @@ qt_add_plugin(QGCLocation
QGCTileCacheDatabase.cpp
QGCTileCacheDatabase.h
QGCTileCacheTypes.h
QGCTileDatabaseSchema.cpp
QGCTileDatabaseSchema.h
QGCTileFallback.cpp
QGCTileFallback.h
QGCTileCacheWorker.cpp
QGCTileCacheWorker.h
QGCTileSetImporter.cpp
QGCTileSetImporter.h
QGCTileSet.h
QGCTileCache.cpp
QGCTileCache.h
QGeoFileTileCacheQGC.cpp
QGeoFileTileCacheQGC.h
QGeoMapReplyQGC.cpp
Expand All @@ -54,6 +62,8 @@ qt_add_plugin(QGCLocation
QGeoTiledMapQGC.h
QGeoTileFetcherQGC.cpp
QGeoTileFetcherQGC.h
TileFetchMetrics.cpp
TileFetchMetrics.h
)

if(IOS)
Expand All @@ -71,6 +81,7 @@ target_link_libraries(QGCLocation
QGCNetwork
PUBLIC
Qt6::Core
Qt6::Gui
Qt6::Location
Qt6::LocationPrivate
Qt6::Network
Expand Down
2 changes: 1 addition & 1 deletion src/QtLocationPlugin/Providers/BingMapProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
QString BingMapProvider::_getURL(int x, int y, int zoom) const
{
const QString key = _tileXYToQuadKey(x, y, zoom);
return _mapUrl.arg(_getServerNum(x, y, 4)).arg(_mapTypeId, key, _imageFormat, _versionBingMaps, _language);
return _mapUrl.arg(_getServerNum(x, y, kServerCount)).arg(_mapTypeId, key, _imageFormat, _versionBingMaps, _language);
}
53 changes: 8 additions & 45 deletions src/QtLocationPlugin/Providers/BingMapProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,65 +3,28 @@
#include "MapProvider.h"

static constexpr const quint32 AVERAGE_BING_STREET_MAP = 1297;
static constexpr const quint32 AVERAGE_BING_SAT_MAP = 19597;
static constexpr const quint32 AVERAGE_BING_SAT_MAP = 19597;

class BingMapProvider : public MapProvider
{
protected:
BingMapProvider(const QString &mapName, const QString &mapTypeCode, const QString &imageFormat, quint32 averageSize,
MapProvider::MapStyle mapType)
: MapProvider(mapName, QStringLiteral("https://www.bing.com/maps/"), imageFormat, averageSize, mapType)
, _mapTypeId(mapTypeCode) {}

public:
bool isBingProvider() const final { return true; }
BingMapProvider(const QString& mapName, const QString& mapTypeCode, const QString& imageFormat, quint32 averageSize,
MapProvider::MapStyle mapType)
: MapProvider(mapName, QStringLiteral("https://www.bing.com/maps/"), imageFormat, averageSize, mapType),
_mapTypeId(mapTypeCode)
{}

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

const QString _mapTypeId;
const QString _mapUrl = QStringLiteral("http://ecn.t%1.tiles.virtualearth.net/tiles/%2%3.%4?g=%5&mkt=%6");
const QString _mapUrl = QStringLiteral("https://ecn.t%1.tiles.virtualearth.net/tiles/%2%3.%4?g=%5&mkt=%6");
const QString _versionBingMaps = QStringLiteral("2981");
static constexpr int kServerCount = 4;

/*QUrl m_url;
const QString m_scheme = QStringLiteral("http");
const QString m_host = QStringLiteral("ecn.t%1.tiles.virtualearth.net");
const QString m_path = QStringLiteral("tiles/%1%2.%3");
const QUrlQuery m_query = QStringLiteral("g=%1&mkt=%2");*/
};

class BingRoadMapProvider : public BingMapProvider
{
public:
BingRoadMapProvider()
: BingMapProvider(
QStringLiteral("Bing Road"),
QStringLiteral("r"),
QStringLiteral("png"),
AVERAGE_BING_STREET_MAP,
MapProvider::StreetMap) {}
};

class BingSatelliteMapProvider : public BingMapProvider
{
public:
BingSatelliteMapProvider()
: BingMapProvider(
QStringLiteral("Bing Satellite"),
QStringLiteral("a"),
QStringLiteral("jpg"),
AVERAGE_BING_SAT_MAP,
MapProvider::SatelliteMapDay) {}
};

class BingHybridMapProvider : public BingMapProvider
{
public:
BingHybridMapProvider()
: BingMapProvider(
QStringLiteral("Bing Hybrid"),
QStringLiteral("h"),
QStringLiteral("jpg"),
AVERAGE_BING_SAT_MAP,
MapProvider::HybridMap) {}
};
17 changes: 17 additions & 0 deletions src/QtLocationPlugin/Providers/ElevationMapProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ int CopernicusElevationProvider::lat2tileY(double lat, int z) const
return static_cast<int>(floor((lat + 90.0) / TerrainTileCopernicus::kTileSizeDegrees));
}

bool CopernicusElevationProvider::isValidTileCoordinate(int x, int y, int zoom) const
{
// Copernicus tiles a global 0.01° grid, not a 2^zoom web-mercator pyramid, so the
// base bound rejects every real tile. Bound by the provider's own grid extents.
const int maxX = long2tileX(180.0, zoom);
const int maxY = lat2tileY(90.0, zoom);
return (x >= 0) && (x <= maxX) && (y >= 0) && (y <= maxY);
}

QString CopernicusElevationProvider::_getURL(int x, int y, int zoom) const
{
Q_UNUSED(zoom)
Expand All @@ -38,6 +47,14 @@ QGCTileSet CopernicusElevationProvider::getTileCount(int zoom, double topleftLon
set.tileX1 = long2tileX(bottomRightLon, zoom);
set.tileY1 = lat2tileY(topleftLat, zoom);

// Guard against an inverted bbox: an unsigned subtraction with tileX1 < tileX0
// (or tileY1 < tileY0) would underflow to ~2^64 and report a bogus tile count.
if ((set.tileX1 < set.tileX0) || (set.tileY1 < set.tileY0)) {
set.tileCount = 0;
set.tileSize = 0;
return set;
}

set.tileCount = (static_cast<quint64>(set.tileX1) -
static_cast<quint64>(set.tileX0) + 1) *
(static_cast<quint64>(set.tileY1) -
Expand Down
34 changes: 13 additions & 21 deletions src/QtLocationPlugin/Providers/ElevationMapProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,13 @@
class ElevationProvider : public MapProvider
{
protected:
ElevationProvider(const QString &mapName, const QString &referrer, const QString &imageFormat, quint32 averageSize,
ElevationProvider(const QString& mapName, const QString& referrer, const QString& imageFormat, quint32 averageSize,
MapProvider::MapStyle mapType)
: MapProvider(
mapName,
referrer,
imageFormat,
averageSize,
mapType) {}
: MapProvider(mapName, referrer, imageFormat, averageSize, mapType)
{}

public:
bool isElevationProvider() const final { return true; }
virtual QByteArray serialize(const QByteArray &image) const = 0;
virtual QByteArray serialize(const QByteArray& image) const = 0;
};

/// \brief https://spacedata.copernicus.eu/collections/copernicus-digital-elevation-model
Expand All @@ -25,25 +20,22 @@ class CopernicusElevationProvider : public ElevationProvider
{
public:
CopernicusElevationProvider()
: ElevationProvider(
kProviderKey,
kProviderURL,
QStringLiteral("bin"),
kAvgElevSize,
MapProvider::TerrainMap) {}
: ElevationProvider(kProviderKey, kProviderURL, QStringLiteral("bin"), kAvgElevSize, MapProvider::TerrainMap)
{}

int long2tileX(double lon, int z) const final;
int lat2tileY(double lat, int z) const final;

QGCTileSet getTileCount(int zoom, double topleftLon,
double topleftLat, double bottomRightLon,
bool isValidTileCoordinate(int x, int y, int zoom) const final;

QGCTileSet getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon,
double bottomRightLat) const final;

QByteArray serialize(const QByteArray &image) const final;
QByteArray serialize(const QByteArray& image) const final;

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 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:
Expand Down
2 changes: 1 addition & 1 deletion src/QtLocationPlugin/Providers/EsriMapProvider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

QByteArray EsriMapProvider::getToken() const
{
return SettingsManager::instance()->appSettings()->esriToken()->rawValue().toString().toUtf8();
return factString(appSettings()->esriToken()).toUtf8();
}

QString EsriMapProvider::_getURL(int x, int y, int zoom) const
Expand Down
51 changes: 7 additions & 44 deletions src/QtLocationPlugin/Providers/EsriMapProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,18 @@

class EsriMapProvider : public MapProvider
{
protected:
EsriMapProvider(const QString &mapName, const QString &mapTypeId, quint32 averageSize, MapProvider::MapStyle mapType)
: MapProvider(
mapName,
QStringLiteral(""),
QStringLiteral(""),
averageSize,
mapType)
, _mapTypeId(mapTypeId) {}

public:
EsriMapProvider(const QString& mapName, const QString& mapTypeId, quint32 averageSize,
MapProvider::MapStyle mapType)
: MapProvider(mapName, QStringLiteral(""), QStringLiteral(""), averageSize, mapType), _mapTypeId(mapTypeId)
{}

QByteArray getToken() const final;

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

const QString _mapTypeId;
const QString _mapUrl = QStringLiteral("http://services.arcgisonline.com/ArcGIS/rest/services/%1/MapServer/tile/%2/%3/%4");
};

class EsriWorldStreetMapProvider : public EsriMapProvider
{
public:
EsriWorldStreetMapProvider()
: EsriMapProvider(
QStringLiteral("Esri World Street"),
QStringLiteral("World_Street_Map"),
QGC_AVERAGE_TILE_SIZE,
MapProvider::StreetMap) {}
};

class EsriWorldSatelliteMapProvider : public EsriMapProvider
{
public:
EsriWorldSatelliteMapProvider()
: EsriMapProvider(
QStringLiteral("Esri World Satellite"),
QStringLiteral("World_Imagery"),
QGC_AVERAGE_TILE_SIZE,
MapProvider::SatelliteMapDay) {}
};

class EsriTerrainMapProvider : public EsriMapProvider
{
public:
EsriTerrainMapProvider()
: EsriMapProvider(
QStringLiteral("Esri Terrain"),
QStringLiteral("World_Terrain_Base"),
QGC_AVERAGE_TILE_SIZE,
MapProvider::TerrainMap) {}
const QString _mapUrl =
QStringLiteral("https://services.arcgisonline.com/ArcGIS/rest/services/%1/MapServer/tile/%2/%3/%4");
};
Loading
Loading