From 5ba799844e7f9a9f7cf7c8b82e054db5c3fb6ff6 Mon Sep 17 00:00:00 2001 From: Pierre TILAK Date: Wed, 18 Sep 2019 17:06:03 +1200 Subject: [PATCH] Airmap Elevation working again --- src/QtLocationPlugin/ElevationMapProvider.cpp | 5 +-- src/QtLocationPlugin/ElevationMapProvider.h | 6 ++- src/QtLocationPlugin/MapProvider.h | 4 +- src/QtLocationPlugin/QGCMapEngine.cpp | 39 ++++++++++++------- src/QtLocationPlugin/QGCMapUrlEngine.cpp | 12 +----- src/QtLocationPlugin/QGCMapUrlEngine.h | 1 + .../QMLControl/OfflineMap.qml | 2 +- .../QMLControl/QGCMapEngineManager.cc | 1 - src/Terrain/TerrainQuery.cc | 12 ++++-- 9 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/QtLocationPlugin/ElevationMapProvider.cpp b/src/QtLocationPlugin/ElevationMapProvider.cpp index ce2155c99..a2e383329 100644 --- a/src/QtLocationPlugin/ElevationMapProvider.cpp +++ b/src/QtLocationPlugin/ElevationMapProvider.cpp @@ -10,17 +10,16 @@ ElevationProvider::ElevationProvider(QString imageFormat, quint32 averageSize, QObject* parent) : MapProvider(QString("https://api.airmap.com/"), imageFormat, averageSize, mapType, parent) {} - ElevationProvider::~ElevationProvider() {} //----------------------------------------------------------------------------- -int ElevationProvider::long2tileX(double lon, int z) { +int AirmapElevationProvider::long2tileX(double lon, int z) { Q_UNUSED(z); return static_cast(floor((lon + 180.0) / srtm1TileSize)); } //----------------------------------------------------------------------------- -int ElevationProvider::lat2tileY(double lat, int z) { +int AirmapElevationProvider::lat2tileY(double lat, int z) { Q_UNUSED(z); return static_cast(floor((lat + 90.0) / srtm1TileSize)); } diff --git a/src/QtLocationPlugin/ElevationMapProvider.h b/src/QtLocationPlugin/ElevationMapProvider.h index 600ee0b96..09b082729 100644 --- a/src/QtLocationPlugin/ElevationMapProvider.h +++ b/src/QtLocationPlugin/ElevationMapProvider.h @@ -21,8 +21,6 @@ class ElevationProvider : public MapProvider { ~ElevationProvider(); - int long2tileX(double lon, int z); - int lat2tileY(double lat, int z); protected: // Define the url to Request @@ -40,6 +38,10 @@ class AirmapElevationProvider : public ElevationProvider { : ElevationProvider(QString("bin"), AVERAGE_AIRMAP_ELEV_SIZE, QGeoMapType::StreetMap, parent) {} + int long2tileX(double lon, int z); + int lat2tileY(double lat, int z); + + protected: QString _getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h index 6825ec11e..bdf769fd0 100644 --- a/src/QtLocationPlugin/MapProvider.h +++ b/src/QtLocationPlugin/MapProvider.h @@ -29,9 +29,9 @@ class MapProvider : public QObject { QGeoMapType::MapStyle getMapStyle(){return _mapType;} - int long2tileX(double lon, int z); + virtual int long2tileX(double lon, int z); - int lat2tileY(double lat, int z); + virtual int lat2tileY(double lat, int z); protected: QString _tileXYToQuadKey(int tileX, int tileY, int levelOfDetail); diff --git a/src/QtLocationPlugin/QGCMapEngine.cpp b/src/QtLocationPlugin/QGCMapEngine.cpp index 818da2a37..498842fb9 100644 --- a/src/QtLocationPlugin/QGCMapEngine.cpp +++ b/src/QtLocationPlugin/QGCMapEngine.cpp @@ -236,28 +236,37 @@ QGCMapEngine::hashToType(const QString& hash) } //----------------------------------------------------------------------------- -QGCFetchTileTask* + QGCFetchTileTask* QGCMapEngine::createFetchTileTask(QString type, int x, int y, int z) { - QString hash = getTileHash(type, x, y, z); - QGCFetchTileTask* task = new QGCFetchTileTask(hash); - return task; + QString hash = getTileHash(type, x, y, z); + QGCFetchTileTask* task = new QGCFetchTileTask(hash); + return task; } //----------------------------------------------------------------------------- -QGCTileSet + QGCTileSet QGCMapEngine::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QString mapType) { - if(zoom < 1) zoom = 1; - if(zoom > MAX_MAP_ZOOM) zoom = MAX_MAP_ZOOM; - QGCTileSet set; - 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; + if(zoom < 1) zoom = 1; + if(zoom > MAX_MAP_ZOOM) zoom = MAX_MAP_ZOOM; + QGCTileSet set; + if(mapType != "Airmap Elevation"){ + 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); + }else{ + set.tileX0 = getQGCMapEngine()->urlFactory()->long2tileX(mapType, topleftLon, zoom); + set.tileY0 = getQGCMapEngine()->urlFactory()->lat2tileY(mapType, bottomRightLat, zoom); + set.tileX1 = getQGCMapEngine()->urlFactory()->long2tileX(mapType, bottomRightLon, zoom); + set.tileY1 = getQGCMapEngine()->urlFactory()->lat2tileY(mapType, topleftLat, zoom); + + } + set.tileCount = (static_cast(set.tileX1) - static_cast(set.tileX0) + 1) * (static_cast(set.tileY1) - static_cast(set.tileY0) + 1); + qDebug() << "getTileCount : " << set.tileCount; + set.tileSize = getQGCMapEngine()->urlFactory()->averageSizeForType(mapType) * set.tileCount; + return set; } diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index 20c9f20ab..d0156eff0 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -72,6 +72,8 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { _providersTable["VWorld Street Map"] = new VWorldStreetMapProvider(this); _providersTable["VWorld Satellite Map"] = new VWorldSatMapProvider(this); + + _providersTable["Airmap Elevation"] = new AirmapElevationProvider(this); } void UrlFactory::registerProvider(QString name, MapProvider* provider) { @@ -121,16 +123,6 @@ QNetworkRequest UrlFactory::getTileURL(QString type, int x, int y, int zoom, qCDebug(QGCMapUrlEngineLog) << "getTileURL : map not registered :" << type; return QNetworkRequest(QUrl()); } -#if 0 - case AirmapElevation: - { - } - break; - - -//----------------------------------------------------------------------------- - -#endif //----------------------------------------------------------------------------- quint32 UrlFactory::averageSizeForType(QString type) { diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h index 74e70546d..960a5c971 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.h +++ b/src/QtLocationPlugin/QGCMapUrlEngine.h @@ -22,6 +22,7 @@ #include "GenericMapProvider.h" #include "EsriMapProvider.h" #include "MapboxMapProvider.h" +#include "ElevationMapProvider.h" #define MAX_MAP_ZOOM (20.0) diff --git a/src/QtLocationPlugin/QMLControl/OfflineMap.qml b/src/QtLocationPlugin/QMLControl/OfflineMap.qml index 0a11eeb85..63e67cb68 100644 --- a/src/QtLocationPlugin/QMLControl/OfflineMap.qml +++ b/src/QtLocationPlugin/QMLControl/OfflineMap.qml @@ -463,7 +463,7 @@ Item { Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: !_defaultSet && mapType !== "Airmap Elevation Data" + visible: !_defaultSet && mapType !== "Airmap Elevation" QGCLabel { text: qsTr("Zoom Levels:"); width: infoView._labelWidth; } QGCLabel { text: offlineMapView._currentSelection ? (offlineMapView._currentSelection.minZoom + " - " + offlineMapView._currentSelection.maxZoom) : ""; horizontalAlignment: Text.AlignRight; width: infoView._valueWidth; } } diff --git a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc index 304d83582..31c4e27ae 100644 --- a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc +++ b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc @@ -233,7 +233,6 @@ QGCMapEngineManager::mapTypeList(QString provider) { // Extract type name from MapName ( format : "Provider Type") QStringList mapList = getQGCMapEngine()->getMapNameList(); - qDebug()<< "mapTypeList : " << provider; mapList = mapList.filter(QRegularExpression(provider)); mapList.replaceInStrings(QRegExp("^([^\\ ]*) (.*)$"),"\\2"); mapList.removeDuplicates(); diff --git a/src/Terrain/TerrainQuery.cc b/src/Terrain/TerrainQuery.cc index b178b171e..39646f715 100644 --- a/src/Terrain/TerrainQuery.cc +++ b/src/Terrain/TerrainQuery.cc @@ -426,13 +426,13 @@ bool TerrainTileManager::_getAltitudesForCoordinates(const QList } } else { if (_state != State::Downloading) { - QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL("AirmapElevation", getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation",coordinate.longitude(), 1), getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1, &_networkManager); + QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL("Airmap Elevation", 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(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")); + spec.setMapId(getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation")); QGeoTiledMapReplyQGC* reply = new QGeoTiledMapReplyQGC(&_networkManager, request, spec); connect(reply, &QGeoTiledMapReplyQGC::terrainDone, this, &TerrainTileManager::_terrainDone); _state = State::Downloading; @@ -473,7 +473,7 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N // remove from download queue QGeoTileSpec spec = reply->tileSpec(); - QString hash = QGCMapEngine::getTileHash("AirmapElevation", spec.x(), spec.y(), spec.zoom()); + QString hash = QGCMapEngine::getTileHash("Airmap Elevation", spec.x(), spec.y(), spec.zoom()); // handle potential errors if (error != QNetworkReply::NoError) { @@ -539,7 +539,11 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N QString TerrainTileManager::_getTileHash(const QGeoCoordinate& coordinate) { - QString ret = QGCMapEngine::getTileHash("AirmapElevation", getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation", coordinate.longitude(), 1), getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1); + QString ret = QGCMapEngine::getTileHash( + "Airmap Elevation", + 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