From abe232e0d8073021bbee69a1cf077adcaf582b72 Mon Sep 17 00:00:00 2001 From: Pierre TILAK Date: Wed, 18 Sep 2019 14:20:35 +1200 Subject: [PATCH] Add Elevation, lat2tile in MapProvider --- src/MissionManager/MissionController.cc | 4 +- src/QtLocationPlugin/ElevationMapProvider.cpp | 40 +++ src/QtLocationPlugin/ElevationMapProvider.h | 47 +++ src/QtLocationPlugin/MapProvider.cpp | 12 + src/QtLocationPlugin/MapProvider.h | 7 +- src/QtLocationPlugin/MapboxMapProvider.h | 3 + src/QtLocationPlugin/QGCLocationPlugin.pri | 2 + src/QtLocationPlugin/QGCMapEngine.cpp | 47 +-- src/QtLocationPlugin/QGCMapEngine.h | 9 +- src/QtLocationPlugin/QGCMapTileSet.cpp | 2 +- src/QtLocationPlugin/QGCMapUrlEngine.cpp | 315 +----------------- src/QtLocationPlugin/QGCMapUrlEngine.h | 19 +- src/QtLocationPlugin/QGeoMapReplyQGC.cpp | 10 +- .../QGeoTiledMappingManagerEngineQGC.cpp | 4 +- .../QMLControl/QGCMapEngineManager.cc | 8 +- src/Terrain/TerrainQuery.cc | 8 +- 16 files changed, 148 insertions(+), 389 deletions(-) create mode 100644 src/QtLocationPlugin/ElevationMapProvider.cpp create mode 100644 src/QtLocationPlugin/ElevationMapProvider.h diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 33c137852..375b51801 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -412,8 +412,8 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate // If the ComplexMissionItem is inserted first, add a TakeOff SimpleMissionItem if (_visualItems->count() == 1 && (_controllerVehicle->fixedWing() || _controllerVehicle->vtol() || _controllerVehicle->multiRotor())) { - insertSimpleMissionItem(mapCenterCoordinate, i); - i++; + insertSimpleMissionItem(mapCenterCoordinate, visualItemIndex); + visualItemIndex++; } int sequenceNumber = _nextSequenceNumber(); diff --git a/src/QtLocationPlugin/ElevationMapProvider.cpp b/src/QtLocationPlugin/ElevationMapProvider.cpp new file mode 100644 index 000000000..ce2155c99 --- /dev/null +++ b/src/QtLocationPlugin/ElevationMapProvider.cpp @@ -0,0 +1,40 @@ +#include "ElevationMapProvider.h" +#if defined(DEBUG_GOOGLE_MAPS) +#include +#include +#endif +#include "QGCMapEngine.h" + +ElevationProvider::ElevationProvider(QString imageFormat, quint32 averageSize, + QGeoMapType::MapStyle mapType, + QObject* parent) + : MapProvider(QString("https://api.airmap.com/"), imageFormat, averageSize, + mapType, parent) {} + +ElevationProvider::~ElevationProvider() {} + +//----------------------------------------------------------------------------- +int ElevationProvider::long2tileX(double lon, int z) { + Q_UNUSED(z); + return static_cast(floor((lon + 180.0) / srtm1TileSize)); +} + +//----------------------------------------------------------------------------- +int ElevationProvider::lat2tileY(double lat, int z) { + Q_UNUSED(z); + return static_cast(floor((lat + 90.0) / srtm1TileSize)); +} + +QString +AirmapElevationProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + Q_UNUSED(zoom); + return QString("https://api.airmap.com/elevation/v1/ele/" + "carpet?points=%1,%2,%3,%4") + .arg(static_cast(y) * srtm1TileSize - 90.0) + .arg(static_cast(x) * srtm1TileSize - 180.0) + .arg(static_cast(y + 1) * srtm1TileSize - 90.0) + .arg(static_cast(x + 1) * srtm1TileSize - 180.0); +} + diff --git a/src/QtLocationPlugin/ElevationMapProvider.h b/src/QtLocationPlugin/ElevationMapProvider.h new file mode 100644 index 000000000..600ee0b96 --- /dev/null +++ b/src/QtLocationPlugin/ElevationMapProvider.h @@ -0,0 +1,47 @@ +#pragma once + +#include "MapProvider.h" + +#include +#include +#include +#include +#include +#include + +const quint32 AVERAGE_AIRMAP_ELEV_SIZE = 2786; +//----------------------------------------------------------------------------- +const double srtm1TileSize = 0.01; + +class ElevationProvider : public MapProvider { + Q_OBJECT + public: + ElevationProvider(QString imageFormat, quint32 averageSize, + QGeoMapType::MapStyle mapType, QObject* parent); + + ~ElevationProvider(); + + int long2tileX(double lon, int z); + int lat2tileY(double lat, int z); + + protected: + // Define the url to Request + virtual QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) = 0; +}; + +// ----------------------------------------------------------- +// Airmap Elevation + +class AirmapElevationProvider : public ElevationProvider { + Q_OBJECT + public: + AirmapElevationProvider(QObject* parent) + : ElevationProvider(QString("bin"), AVERAGE_AIRMAP_ELEV_SIZE, + QGeoMapType::StreetMap, parent) {} + + protected: + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + diff --git a/src/QtLocationPlugin/MapProvider.cpp b/src/QtLocationPlugin/MapProvider.cpp index a6ba45bda..e0eda12df 100644 --- a/src/QtLocationPlugin/MapProvider.cpp +++ b/src/QtLocationPlugin/MapProvider.cpp @@ -61,3 +61,15 @@ QString MapProvider::_tileXYToQuadKey(int tileX, int tileY, int levelOfDetail) { int MapProvider::_getServerNum(int x, int y, int max) { return (x + 2 * y) % max; } + +int MapProvider::long2tileX(double lon, int z) { + return static_cast(floor((lon + 180.0) / 360.0 * pow(2.0, z))); +} + +//----------------------------------------------------------------------------- +int MapProvider::lat2tileY(double lat, int z) { + return static_cast(floor( + (1.0 - + log(tan(lat * M_PI / 180.0) + 1.0 / cos(lat * M_PI / 180.0)) / M_PI) / + 2.0 * pow(2.0, z))); +} diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h index b92ab6d31..6825ec11e 100644 --- a/src/QtLocationPlugin/MapProvider.h +++ b/src/QtLocationPlugin/MapProvider.h @@ -11,10 +11,7 @@ static const unsigned char pngSignature[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00}; static const unsigned char gifSignature[] = {0x47, 0x49, 0x46, 0x38, 0x00}; -const quint32 AVERAGE_MAPBOX_SAT_MAP = 15739; -const quint32 AVERAGE_MAPBOX_STREET_MAP = 5648; const quint32 AVERAGE_TILE_SIZE = 13652; -const quint32 AVERAGE_AIRMAP_ELEV_SIZE = 2786; class MapProvider : public QObject { Q_OBJECT @@ -32,6 +29,10 @@ class MapProvider : public QObject { QGeoMapType::MapStyle getMapStyle(){return _mapType;} + int long2tileX(double lon, int z); + + int lat2tileY(double lat, int z); + protected: QString _tileXYToQuadKey(int tileX, int tileY, int levelOfDetail); int _getServerNum(int x, int y, int max); diff --git a/src/QtLocationPlugin/MapboxMapProvider.h b/src/QtLocationPlugin/MapboxMapProvider.h index 403774354..9b31e308d 100644 --- a/src/QtLocationPlugin/MapboxMapProvider.h +++ b/src/QtLocationPlugin/MapboxMapProvider.h @@ -9,6 +9,9 @@ #include #include +const quint32 AVERAGE_MAPBOX_SAT_MAP = 15739; +const quint32 AVERAGE_MAPBOX_STREET_MAP = 5648; + class MapboxMapProvider : public MapProvider { Q_OBJECT public: diff --git a/src/QtLocationPlugin/QGCLocationPlugin.pri b/src/QtLocationPlugin/QGCLocationPlugin.pri index dc7f33e01..b12ade44b 100644 --- a/src/QtLocationPlugin/QGCLocationPlugin.pri +++ b/src/QtLocationPlugin/QGCLocationPlugin.pri @@ -23,6 +23,7 @@ HEADERS += \ $$PWD/QGeoTileFetcherQGC.h \ $$PWD/QGeoTiledMappingManagerEngineQGC.h \ $$PWD/MapProvider.h \ + $$PWD/ElevationMapProvider.h \ $$PWD/GoogleMapProvider.h \ $$PWD/BingMapProvider.h \ $$PWD/GenericMapProvider.h \ @@ -41,6 +42,7 @@ SOURCES += \ $$PWD/QGeoTileFetcherQGC.cpp \ $$PWD/QGeoTiledMappingManagerEngineQGC.cpp \ $$PWD/MapProvider.cpp \ + $$PWD/ElevationMapProvider.cpp \ $$PWD/GoogleMapProvider.cpp \ $$PWD/BingMapProvider.cpp \ $$PWD/GenericMapProvider.cpp \ diff --git a/src/QtLocationPlugin/QGCMapEngine.cpp b/src/QtLocationPlugin/QGCMapEngine.cpp index 385b13e7c..818da2a37 100644 --- a/src/QtLocationPlugin/QGCMapEngine.cpp +++ b/src/QtLocationPlugin/QGCMapEngine.cpp @@ -56,9 +56,6 @@ getQGCMapEngine() return kMapEngine; } -//----------------------------------------------------------------------------- -const double QGCMapEngine::srtm1TileSize = 0.01; - //----------------------------------------------------------------------------- void destroyMapEngine() @@ -254,51 +251,15 @@ QGCMapEngine::getTileCount(int zoom, double topleftLon, double topleftLat, doubl if(zoom < 1) zoom = 1; if(zoom > MAX_MAP_ZOOM) zoom = MAX_MAP_ZOOM; QGCTileSet set; - if (mapType != "AirmapElevation") { - set.tileX0 = long2tileX(topleftLon, zoom); - set.tileY0 = lat2tileY(topleftLat, zoom); - set.tileX1 = long2tileX(bottomRightLon, zoom); - set.tileY1 = lat2tileY(bottomRightLat, zoom); - } else { - set.tileX0 = long2elevationTileX(topleftLon, zoom); - set.tileY0 = lat2elevationTileY(bottomRightLat, zoom); - set.tileX1 = long2elevationTileX(bottomRightLon, zoom); - set.tileY1 = lat2elevationTileY(topleftLat, zoom); - } + set.tileX0 = getQGCMapEngine()->urlFactory()->long2tileX(mapType, topleftLon, zoom); + set.tileY0 = getQGCMapEngine()->urlFactory()->lat2tileY(mapType, topleftLat, zoom); + set.tileX1 = getQGCMapEngine()->urlFactory()->long2tileX(mapType, bottomRightLon, zoom); + set.tileY1 = getQGCMapEngine()->urlFactory()->lat2tileY(mapType, bottomRightLat, zoom); set.tileCount = (static_cast(set.tileX1) - static_cast(set.tileX0) + 1) * (static_cast(set.tileY1) - static_cast(set.tileY0) + 1); set.tileSize = getQGCMapEngine()->urlFactory()->averageSizeForType(mapType) * set.tileCount; return set; } -//----------------------------------------------------------------------------- -int -QGCMapEngine::long2tileX(double lon, int z) -{ - return static_cast(floor((lon + 180.0) / 360.0 * pow(2.0, z))); -} - -//----------------------------------------------------------------------------- -int -QGCMapEngine::lat2tileY(double lat, int z) -{ - return static_cast(floor((1.0 - log( tan(lat * M_PI/180.0) + 1.0 / cos(lat * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, z))); -} - -//----------------------------------------------------------------------------- -int -QGCMapEngine::long2elevationTileX(double lon, int z) -{ - Q_UNUSED(z); - return static_cast(floor((lon + 180.0) / srtm1TileSize)); -} - -//----------------------------------------------------------------------------- -int -QGCMapEngine::lat2elevationTileY(double lat, int z) -{ - Q_UNUSED(z); - return static_cast(floor((lat + 90.0) / srtm1TileSize)); -} //----------------------------------------------------------------------------- QStringList diff --git a/src/QtLocationPlugin/QGCMapEngine.h b/src/QtLocationPlugin/QGCMapEngine.h index 4b34c2ddc..643b8da0c 100644 --- a/src/QtLocationPlugin/QGCMapEngine.h +++ b/src/QtLocationPlugin/QGCMapEngine.h @@ -92,20 +92,13 @@ public: //-- Tile Math static QGCTileSet getTileCount (int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QString mapType); - static int long2tileX (double lon, int z); - static int lat2tileY (double lat, int z); - static int long2elevationTileX (double lon, int z); - static int lat2elevationTileY (double lat, int z); static QString getTileHash (QString type, int x, int y, int z); - static QString getTypeFromName (const QString &name); + static QString getTypeFromName (const QString &name); static QString bigSizeToString (quint64 size); static QString storageFreeSizeToString(quint64 size_MB); static QString numberToString (quint64 number); static int concurrentDownloads (QString type); - /// size of an elevation tile in degree - static const double srtm1TileSize; - private slots: void _updateTotals (quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize); void _pruned (); diff --git a/src/QtLocationPlugin/QGCMapTileSet.cpp b/src/QtLocationPlugin/QGCMapTileSet.cpp index 66700ea20..340cbb53d 100644 --- a/src/QtLocationPlugin/QGCMapTileSet.cpp +++ b/src/QtLocationPlugin/QGCMapTileSet.cpp @@ -280,7 +280,7 @@ QGCCachedTileSet::_networkReplyFinished() qCDebug(QGCCachedTileSetLog) << "Tile fetched" << hash; QByteArray image = reply->readAll(); QString type = getQGCMapEngine()->hashToType(hash); - if (type == "AirmapElevation" ) { + if (type == "Airmap Elevation" ) { image = TerrainTile::serialize(image); } QString format = getQGCMapEngine()->urlFactory()->getImageFormat(type, image); diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index b4d4c0bf4..20c9f20ab 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -35,9 +35,6 @@ QGC_LOGGING_CATEGORY(QGCMapUrlEngineLog, "QGCMapUrlEngineLog") //----------------------------------------------------------------------------- UrlFactory::UrlFactory() : _timeout(5 * 1000) { - // BingMaps - //_versionBingMaps = "563"; - // Warning : in _providersTable, keys needs to follow this format : // "Provider Type" #ifndef QGC_NO_GOOGLE_MAPS @@ -102,65 +99,6 @@ QString UrlFactory::getImageFormat(QString type, const QByteArray& image) { qCDebug(QGCMapUrlEngineLog) << "getImageFormat : Map not registered :" << type; return ""; } - // QString format; - // if(image.size() > 2) - //{ - // if (image.startsWith(reinterpret_cast(pngSignature))) - // format = "png"; - // else if (image.startsWith(reinterpret_cast(jpegSignature))) - // format = "jpg"; - // else if (image.startsWith(reinterpret_cast(gifSignature))) - // format = "gif"; - // else { - // switch (type) { - // case StatkartTopo: - // format = "png"; - // break; - // case EniroTopo: - // format = "png"; - // break; - // /* - // case MapQuestMap: - // case MapQuestSat: - // case OpenStreetMap: - // */ - // case MapboxStreets: - // case MapboxLight: - // case MapboxDark: - // case MapboxSatellite: - // case MapboxHybrid: - // case MapboxWheatPaste: - // case MapboxStreetsBasic: - // case MapboxComic: - // case MapboxOutdoors: - // case MapboxRunBikeHike: - // case MapboxPencil: - // case MapboxPirates: - // case MapboxEmerald: - // case MapboxHighContrast: - // case GoogleSatellite: - // case BingSatellite: - // case BingHybrid: - // format = "jpg"; - // break; - // case AirmapElevation: - // format = "bin"; - // break; - // case VWorldStreet : - // format = "png"; - // break; - // case VWorldSatellite : - // format = "jpg"; - // break; - // default: - // qWarning("UrlFactory::getImageFormat() Unknown map id %d", - // type); break; - // } - // } - //} - // return format; } QNetworkRequest UrlFactory::getTileURL(int id, int x, int y, int zoom, QNetworkAccessManager* networkManager) { @@ -182,251 +120,13 @@ QNetworkRequest UrlFactory::getTileURL(QString type, int x, int y, int zoom, } qCDebug(QGCMapUrlEngineLog) << "getTileURL : map not registered :" << type; return QNetworkRequest(QUrl()); - ////-- Build URL - // QNetworkRequest request; - // QString url = _getURL(type, x, y, zoom, networkManager); - // if(url.isEmpty()) { - // return request; - //} - // request.setUrl(QUrl(url)); - // request.setRawHeader("Accept", "*/*"); - // switch (type) { - // case StatkartTopo: - // request.setRawHeader("Referrer", "https://www.norgeskart.no/"); - // break; - // case EniroTopo: - // request.setRawHeader("Referrer", "https://www.eniro.se/"); - // break; - // /* - // case OpenStreetMapSurfer: - // case OpenStreetMapSurferTerrain: - // request.setRawHeader("Referrer", "http://www.mapsurfer.net/"); - // break; - // case OpenStreetMap: - // case OpenStreetOsm: - // request.setRawHeader("Referrer", - // "https://www.openstreetmap.org/"); break; - // */ - - // case EsriWorldStreet: - // case EsriWorldSatellite: - // case EsriTerrain: { - // QByteArray token = - // qgcApp()->toolbox()->settingsManager()->appSettings()->esriToken()->rawValue().toString().toLatin1(); - // request.setRawHeader("User-Agent", QByteArrayLiteral("Qt - // Location based application")); - // request.setRawHeader("User-Token", token); - // } - // return request; - - // case AirmapElevation: - // request.setRawHeader("Referrer", "https://api.airmap.com/"); - // break; - - // default: - // break; - //} - // request.setRawHeader("User-Agent", _userAgent); - // return request; } - -//----------------------------------------------------------------------------- #if 0 -QString -UrlFactory::_getURL(QString type, int x, int y, int zoom, QNetworkAccessManager* networkManager) -{ - switch (type) { - (networkManager); - case StatkartTopo: - { - return QString("http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom=%1&x=%2&y=%3").arg(zoom).arg(x).arg(y); - } - break; - case EniroTopo: - { - } - break; - /* - case OpenStreetMap: - { - char letter = "abc"[_getServerNum(x, y, 3)]; - return QString("https://%1.tile.openstreetmap.org/%2/%3/%4.png").arg(letter).arg(zoom).arg(x).arg(y); - } - break; - case OpenStreetOsm: - { - char letter = "abc"[_getServerNum(x, y, 3)]; - return QString("http://%1.tah.openstreetmap.org/Tiles/tile/%2/%3/%4.png").arg(letter).arg(zoom).arg(x).arg(y); - } - break; - case OpenStreetMapSurfer: - { - // http://tiles1.mapsurfer.net/tms_r.ashx?x=37378&y=20826&z=16 - return QString("http://tiles1.mapsurfer.net/tms_r.ashx?x=%1&y=%2&z=%3").arg(x).arg(y).arg(zoom); - } - break; - case OpenStreetMapSurferTerrain: - { - // http://tiles2.mapsurfer.net/tms_t.ashx?x=9346&y=5209&z=14 - return QString("http://tiles2.mapsurfer.net/tms_t.ashx?x=%1&y=%2&z=%3").arg(x).arg(y).arg(zoom); - } - break; - */ - case BingMap: - { - } - break; - case BingSatellite: - { - } - break; - case BingHybrid: - { - } - /* - case MapQuestMap: - { - char letter = "1234"[_getServerNum(x, y, 4)]; - return QString("http://otile%1.mqcdn.com/tiles/1.0.0/map/%2/%3/%4.jpg").arg(letter).arg(zoom).arg(x).arg(y); - } - break; - case MapQuestSat: - { - char letter = "1234"[_getServerNum(x, y, 4)]; - return QString("http://otile%1.mqcdn.com/tiles/1.0.0/sat/%2/%3/%4.jpg").arg(letter).arg(zoom).arg(x).arg(y); - } - break; - */ - case EsriWorldStreet: - - case MapboxStreets: - case MapboxLight: - case MapboxDark: - case MapboxSatellite: - case MapboxHybrid: - case MapboxWheatPaste: - case MapboxStreetsBasic: - case MapboxComic: - case MapboxOutdoors: - case MapboxRunBikeHike: - case MapboxPencil: - case MapboxPirates: - case MapboxEmerald: - case MapboxHighContrast: - { - QString mapBoxToken = qgcApp()->toolbox()->settingsManager()->appSettings()->mapboxToken()->rawValue().toString(); - if(!mapBoxToken.isEmpty()) { - QString server = "https://api.mapbox.com/v4/"; - switch(type) { - case MapboxStreets: - server += "mapbox.streets"; - break; - case MapboxLight: - server += "mapbox.light"; - break; - case MapboxDark: - server += "mapbox.dark"; - break; - case MapboxSatellite: - server += "mapbox.satellite"; - break; - case MapboxHybrid: - server += "mapbox.streets-satellite"; - break; - case MapboxWheatPaste: - server += "mapbox.wheatpaste"; - break; - case MapboxStreetsBasic: - server += "mapbox.streets-basic"; - break; - case MapboxComic: - server += "mapbox.comic"; - break; - case MapboxOutdoors: - server += "mapbox.outdoors"; - break; - case MapboxRunBikeHike: - server += "mapbox.run-bike-hike"; - break; - case MapboxPencil: - server += "mapbox.pencil"; - break; - case MapboxPirates: - server += "mapbox.pirates"; - break; - case MapboxEmerald: - server += "mapbox.emerald"; - break; - case MapboxHighContrast: - server += "mapbox.high-contrast"; - break; - default: - return {}; - } - server += QString("/%1/%2/%3.jpg80?access_token=%4").arg(zoom).arg(x).arg(y).arg(mapBoxToken); - return server; - } - } - break; case AirmapElevation: { - return QString("https://api.airmap.com/elevation/v1/ele/carpet?points=%1,%2,%3,%4").arg(static_cast(y)*QGCMapEngine::srtm1TileSize - 90.0).arg( - static_cast(x)*QGCMapEngine::srtm1TileSize - 180.0).arg( - static_cast(y + 1)*QGCMapEngine::srtm1TileSize - 90.0).arg( - static_cast(x + 1)*QGCMapEngine::srtm1TileSize - 180.0); } break; - case VWorldStreet : - { - int gap = zoom - 6; - int x_min = 53 * pow(2, gap); - int x_max = 55 * pow(2, gap) + (2*gap - 1); - int y_min = 22 * pow(2, gap); - int y_max = 26 * pow(2, gap) + (2*gap - 1); - - if ( zoom > 19 ) { - return {}; - } - else if ( zoom > 5 && x >= x_min && x <= x_max && y >= y_min && y <= y_max ) { - return QString("http://xdworld.vworld.kr:8080/2d/Base/service/%1/%2/%3.png").arg(zoom).arg(x).arg(y); - } - else { - QString key = _tileXYToQuadKey(x, y, zoom); - return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/r%2.png?g=%3&mkt=%4").arg(_getServerNum(x, y, 4)).arg(key).arg(_versionBingMaps).arg(_language); - } - - - } - break; - - case VWorldSatellite : - { - int gap = zoom - 6; - int x_min = 53 * pow(2, gap); - int x_max = 55 * pow(2, gap) + (2*gap - 1); - int y_min = 22 * pow(2, gap); - int y_max = 26 * pow(2, gap) + (2*gap - 1); - - if ( zoom > 19 ) { - return {}; - } - else if ( zoom > 5 && x >= x_min && x <= x_max && y >= y_min && y <= y_max ) { - return QString("http://xdworld.vworld.kr:8080/2d/Satellite/service/%1/%2/%3.jpeg").arg(zoom).arg(x).arg(y); - } - else { - QString key = _tileXYToQuadKey(x, y, zoom); - return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/a%2.jpeg?g=%3&mkt=%4").arg(_getServerNum(x, y, 4)).arg(key).arg(_versionBingMaps).arg(_language); - } - } - break; - default: - qWarning("Unknown map id %d\n", type); - break; - } - return {}; -} - //----------------------------------------------------------------------------- @@ -466,3 +166,18 @@ QString UrlFactory::getTypeFromId(int id) { // There is still a low probability for abs to // generate similar hash for different types int UrlFactory::getIdFromType(QString type) { return abs(qHash(type)); } + +//----------------------------------------------------------------------------- +int +UrlFactory::long2tileX(QString mapType, double lon, int z) +{ + return _providersTable[mapType]->long2tileX(lon, z); +} + +//----------------------------------------------------------------------------- +int +UrlFactory::lat2tileY(QString mapType, double lat, int z) +{ + return _providersTable[mapType]->lat2tileY(lat, z); +} + diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h index 80dd4c6c5..74e70546d 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.h +++ b/src/QtLocationPlugin/QGCMapUrlEngine.h @@ -28,18 +28,6 @@ class UrlFactory : public QObject { Q_OBJECT public: -// -// /* -// MapQuestMap = 700, -// MapQuestSat = 701, -// */ -// -// VWorldMap = 800, -// VWorldSatellite = 801, -// VWorldStreet = 802, -// -// AirmapElevation = 8001 -// }; UrlFactory (); ~UrlFactory (); @@ -52,6 +40,9 @@ public: quint32 averageSizeForType (QString type); + int long2tileX(QString mapType, double lon, int z); + int lat2tileY(QString mapType, double lat, int z); + QHash getProviderTable(){return _providersTable;} int getIdFromType(QString type); @@ -62,10 +53,6 @@ private: QHash _providersTable; void registerProvider(QString Name, MapProvider* provider); - // BingMaps - //QString _versionBingMaps; - - }; #endif diff --git a/src/QtLocationPlugin/QGeoMapReplyQGC.cpp b/src/QtLocationPlugin/QGeoMapReplyQGC.cpp index 710387d1c..e6098b8fc 100644 --- a/src/QtLocationPlugin/QGeoMapReplyQGC.cpp +++ b/src/QtLocationPlugin/QGeoMapReplyQGC.cpp @@ -124,12 +124,12 @@ QGeoTiledMapReplyQGC::networkReplyFinished() QByteArray a = _reply->readAll(); QString format = getQGCMapEngine()->urlFactory()->getImageFormat(tileSpec().mapId(), a); //-- Test for a specialized, elevation data (not map tile) - int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("AirmapElevation"); + int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation"); if (tileSpec().mapId() == AirmapElevationId) { a = TerrainTile::serialize(a); //-- Cache it if valid if(!a.isEmpty()) { - getQGCMapEngine()->cacheTile("AirmapElevation", tileSpec().x(), tileSpec().y(), tileSpec().zoom(), a, format); + getQGCMapEngine()->cacheTile("Airmap Elevation", tileSpec().x(), tileSpec().y(), tileSpec().zoom(), a, format); } emit terrainDone(a, QNetworkReply::NoError); } else { @@ -153,7 +153,7 @@ QGeoTiledMapReplyQGC::networkReplyError(QNetworkReply::NetworkError error) return; } //-- Test for a specialized, elevation data (not map tile) - int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("AirmapElevation"); + int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation"); if (tileSpec().mapId() == AirmapElevationId) { emit terrainDone(QByteArray(), error); } else { @@ -172,7 +172,7 @@ void QGeoTiledMapReplyQGC::cacheError(QGCMapTask::TaskType type, QString /*errorString*/) { if(!getQGCMapEngine()->isInternetActive()) { - int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("AirmapElevation"); + int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation"); if (tileSpec().mapId() == AirmapElevationId) { emit terrainDone(QByteArray(), QNetworkReply::NetworkSessionFailedError); } else { @@ -210,7 +210,7 @@ void QGeoTiledMapReplyQGC::cacheReply(QGCCacheTile* tile) { //-- Test for a specialized, elevation data (not map tile) - int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("AirmapElevation"); + int AirmapElevationId = getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation"); if (tileSpec().mapId() == AirmapElevationId) { emit terrainDone(tile->img(), QNetworkReply::NoError); } else { diff --git a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp index 030e4edc5..996cf98d5 100644 --- a/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp +++ b/src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp @@ -106,12 +106,10 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian while(i.hasNext()){ i.next(); - qDebug()<< "Add MapProvider" <getMapStyle() << i.key()<urlFactory()->getIdFromType(i.key()); mapList.append(QGCGEOMAPTYPE(i.value()->getMapStyle(), i.key(), i.key(), false, false, getQGCMapEngine()->urlFactory()->getIdFromType(i.key()) )); } setSupportedMapTypes(mapList); - qDebug() << "End Adding Provider"; - + //-- Users (QML code) can define a different user agent if (parameters.contains(QStringLiteral("useragent"))) { getQGCMapEngine()->setUserAgent(parameters.value(QStringLiteral("useragent")).toString().toLatin1()); diff --git a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc index 0b4de9fc6..304d83582 100644 --- a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc +++ b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc @@ -84,7 +84,7 @@ QGCMapEngineManager::updateForCurrentView(double lon0, double lat0, double lon1, _imageSet += set; } if (_fetchElevation) { - QGCTileSet set = QGCMapEngine::getTileCount(1, lon0, lat0, lon1, lat1, "AirmapElevation"); + QGCTileSet set = QGCMapEngine::getTileCount(1, lon0, lat0, lon1, lat1, "Airmap Elevation"); _elevationSet += set; } @@ -159,9 +159,9 @@ QGCMapEngineManager::startDownload(const QString& name, const QString& mapType) } else { qWarning() << "QGCMapEngineManager::startDownload() No Tiles to save"; } - if (mapType != "Airmap Elevation Data" && _fetchElevation) { + if (mapType != "Airmap Elevation" && _fetchElevation) { QGCCachedTileSet* set = new QGCCachedTileSet(name + " Elevation"); - set->setMapTypeStr("Airmap Elevation Data"); + set->setMapTypeStr("Airmap Elevation"); set->setTopleftLat(_topleftLat); set->setTopleftLon(_topleftLon); set->setBottomRightLat(_bottomRightLat); @@ -170,7 +170,7 @@ QGCMapEngineManager::startDownload(const QString& name, const QString& mapType) set->setMaxZoom(1); set->setTotalTileSize(_elevationSet.tileSize); set->setTotalTileCount(static_cast(_elevationSet.tileCount)); - set->setType("AirmapElevation"); + set->setType("Airmap Elevation"); QGCCreateTileSetTask* task = new QGCCreateTileSetTask(set); //-- Create Tile Set (it will also create a list of tiles to download) connect(task, &QGCCreateTileSetTask::tileSetSaved, this, &QGCMapEngineManager::_tileSetSaved); diff --git a/src/Terrain/TerrainQuery.cc b/src/Terrain/TerrainQuery.cc index 297d61924..b178b171e 100644 --- a/src/Terrain/TerrainQuery.cc +++ b/src/Terrain/TerrainQuery.cc @@ -426,11 +426,11 @@ bool TerrainTileManager::_getAltitudesForCoordinates(const QList } } else { if (_state != State::Downloading) { - QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL("AirmapElevation", QGCMapEngine::long2elevationTileX(coordinate.longitude(), 1), QGCMapEngine::lat2elevationTileY(coordinate.latitude(), 1), 1, &_networkManager); + QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL("AirmapElevation", getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation",coordinate.longitude(), 1), getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1, &_networkManager); qCDebug(TerrainQueryLog) << "TerrainTileManager::_getAltitudesForCoordinates query from database" << request.url(); QGeoTileSpec spec; - spec.setX(QGCMapEngine::long2elevationTileX(coordinate.longitude(), 1)); - spec.setY(QGCMapEngine::lat2elevationTileY(coordinate.latitude(), 1)); + spec.setX(getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation", coordinate.longitude(), 1)); + spec.setY(getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1)); spec.setZoom(1); spec.setMapId(getQGCMapEngine()->urlFactory()->getIdFromType("AirmapElevation")); QGeoTiledMapReplyQGC* reply = new QGeoTiledMapReplyQGC(&_networkManager, request, spec); @@ -539,7 +539,7 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N QString TerrainTileManager::_getTileHash(const QGeoCoordinate& coordinate) { - QString ret = QGCMapEngine::getTileHash("AirmapElevation", QGCMapEngine::long2elevationTileX(coordinate.longitude(), 1), QGCMapEngine::lat2elevationTileY(coordinate.latitude(), 1), 1); + QString ret = QGCMapEngine::getTileHash("AirmapElevation", getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation", coordinate.longitude(), 1), getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1); qCDebug(TerrainQueryVerboseLog) << "Computing unique tile hash for " << coordinate << ret; return ret; -- 2.22.0