diff --git a/src/QtLocationPlugin/EsriMapProvider.cpp b/src/QtLocationPlugin/EsriMapProvider.cpp new file mode 100644 index 0000000000000000000000000000000000000000..86a29c8f1b5bbb3a717b3de62ac82b927cae2c03 --- /dev/null +++ b/src/QtLocationPlugin/EsriMapProvider.cpp @@ -0,0 +1,61 @@ +#include "EsriMapProvider.h" +#include "QGCApplication.h" +#include "QGCMapEngine.h" +#include "SettingsManager.h" + +QNetworkRequest +EsriMapProvider::getTileURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + //-- Build URL + QNetworkRequest request; + QString url = _getURL(x, y, zoom, networkManager); + if (url.isEmpty()) { + return request; + } + request.setUrl(QUrl(url)); + request.setRawHeader("Accept", "*/*"); + 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; +} + +QString +EsriWorldStreetMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + return QString("http://services.arcgisonline.com/ArcGIS/rest/services/" + "World_Street_Map/MapServer/tile/%1/%2/%3") + .arg(zoom) + .arg(y) + .arg(x); +} + +QString +EsriWorldSatelliteMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + return QString("http://server.arcgisonline.com/ArcGIS/rest/" + "services/World_Imagery/MapServer/tile/%1/%2/%3") + .arg(zoom) + .arg(y) + .arg(x); +} + +QString EsriTerrainMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + return QString("http://server.arcgisonline.com/ArcGIS/rest/services/" + "World_Terrain_Base/MapServer/tile/%1/%2/%3") + .arg(zoom) + .arg(y) + .arg(x); +} diff --git a/src/QtLocationPlugin/EsriMapProvider.h b/src/QtLocationPlugin/EsriMapProvider.h new file mode 100644 index 0000000000000000000000000000000000000000..bc703cc19638f7643a51d3675510dd2b7e60e9cb --- /dev/null +++ b/src/QtLocationPlugin/EsriMapProvider.h @@ -0,0 +1,49 @@ +#pragma once + +#include "MapProvider.h" + +#include +#include +#include +#include +#include +#include + +class EsriMapProvider : public MapProvider { + Q_OBJECT + public: + using MapProvider::MapProvider; + + QNetworkRequest getTileURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +class EsriWorldStreetMapProvider : public EsriMapProvider { + Q_OBJECT + public: + EsriWorldStreetMapProvider(QObject* parent) + : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE, + QGeoMapType::StreetMap, parent) {} + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +class EsriWorldSatelliteMapProvider : public EsriMapProvider { + Q_OBJECT + public: + EsriWorldSatelliteMapProvider(QObject* parent) + : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE, + QGeoMapType::SatelliteMapDay, parent) {} + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +class EsriTerrainMapProvider : public EsriMapProvider { + Q_OBJECT + public: + EsriTerrainMapProvider(QObject* parent) + : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE, + QGeoMapType::TerrainMap, parent) {} + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; diff --git a/src/QtLocationPlugin/StatkartMapProvider.cpp b/src/QtLocationPlugin/GenericMapProvider.cpp similarity index 50% rename from src/QtLocationPlugin/StatkartMapProvider.cpp rename to src/QtLocationPlugin/GenericMapProvider.cpp index ce7e44ee73be8cca01c7b68c58689cd9db92fa43..6dfbdc5e67dddcedb5153dd2634cf3cc8c315701 100644 --- a/src/QtLocationPlugin/StatkartMapProvider.cpp +++ b/src/QtLocationPlugin/GenericMapProvider.cpp @@ -1,15 +1,5 @@ -#include "StatkartMapProvider.h" -#if defined(DEBUG_GOOGLE_MAPS) -#include -#include -#endif #include "QGCMapEngine.h" - -StatkartMapProvider::StatkartMapProvider(QObject* parent) - : MapProvider(QString("https://www.norgeskart.no/"), QString("png"), - AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {} - -StatkartMapProvider::~StatkartMapProvider() {} +#include "GenericMapProvider.h" QString StatkartMapProvider::_getURL(int x, int y, int zoom, QNetworkAccessManager* networkManager) { @@ -21,3 +11,12 @@ QString StatkartMapProvider::_getURL(int x, int y, int zoom, .arg(y); } +QString EniroMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + return QString("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/" + "%2/%3.png") + .arg(zoom) + .arg(x) + .arg((1 << zoom) - 1 - y); +} diff --git a/src/QtLocationPlugin/GenericMapProvider.h b/src/QtLocationPlugin/GenericMapProvider.h new file mode 100644 index 0000000000000000000000000000000000000000..7750420d303dd81ceaa767271b13a7c364139cbc --- /dev/null +++ b/src/QtLocationPlugin/GenericMapProvider.h @@ -0,0 +1,32 @@ +#pragma once + +#include "MapProvider.h" + +#include +#include +#include +#include +#include +#include + +class StatkartMapProvider : public MapProvider { + Q_OBJECT + public: + StatkartMapProvider(QObject* parent) + : MapProvider(QString("https://www.norgeskart.no/"), QString("png"), + AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {} + + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +class EniroMapProvider : public MapProvider { + Q_OBJECT + public: + EniroMapProvider(QObject* parent) + : MapProvider(QString("https://www.eniro.se/"), QString("png"), + AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {} + + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h index b37baab09a062dce8340ce797e78eb53e34c606a..b92ab6d318570a021d363357dcecf7fed82a50d5 100644 --- a/src/QtLocationPlugin/MapProvider.h +++ b/src/QtLocationPlugin/MapProvider.h @@ -11,37 +11,37 @@ 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; +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 public: - MapProvider(QString referrer, QString imageFormat, quint32 averageSize, - QGeoMapType::MapStyle _mapType = QGeoMapType::CustomMap, - QObject* parent = nullptr); + MapProvider( + QString referrer, QString imageFormat, quint32 averageSize, + QGeoMapType::MapStyle _mapType = QGeoMapType::CustomMap, QObject* parent = nullptr); QNetworkRequest getTileURL(int x, int y, int zoom, QNetworkAccessManager* networkManager); QString getImageFormat(const QByteArray& image); - quint32 getAverageSize() { return _averageSize; } + quint32 getAverageSize(){return _averageSize;} - QGeoMapType::MapStyle getMapStyle() { return _mapType; } + QGeoMapType::MapStyle getMapStyle(){return _mapType;} protected: QString _tileXYToQuadKey(int tileX, int tileY, int levelOfDetail); int _getServerNum(int x, int y, int max); // Define Referrer for Request RawHeader - QString _referrer; - QString _imageFormat; - quint32 _averageSize; - QByteArray _userAgent; - QString _language; + QString _referrer; + QString _imageFormat; + quint32 _averageSize; + QByteArray _userAgent; + QString _language; QGeoMapType::MapStyle _mapType; // Define the url to Request diff --git a/src/QtLocationPlugin/QGCLocationPlugin.pri b/src/QtLocationPlugin/QGCLocationPlugin.pri index 7ce81a96d51c633383edef875f7fdaf5f9013ce9..b72b5a32eb3e4676d7488d76c2cb58144715ad38 100644 --- a/src/QtLocationPlugin/QGCLocationPlugin.pri +++ b/src/QtLocationPlugin/QGCLocationPlugin.pri @@ -25,7 +25,8 @@ HEADERS += \ $$PWD/MapProvider.h \ $$PWD/GoogleMapProvider.h \ $$PWD/BingMapProvider.h \ - $$PWD/StatkartMapProvider.h \ + $$PWD/GenericMapProvider.h \ + $$PWD/EsriMapProvider.h \ SOURCES += \ $$PWD/QGCMapEngine.cpp \ @@ -41,7 +42,8 @@ SOURCES += \ $$PWD/MapProvider.cpp \ $$PWD/GoogleMapProvider.cpp \ $$PWD/BingMapProvider.cpp \ - $$PWD/StatkartMapProvider.cpp \ + $$PWD/GenericMapProvider.cpp \ + $$PWD/EsriMapProvider.cpp \ OTHER_FILES += \ $$PWD/qgc_maps_plugin.json diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index 7bce34ffcea4fa6d719510fe9a4ff746651e702e..64bff2e64e9e715786fd7a924569daabf45311cb 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -37,19 +37,27 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { // BingMaps //_versionBingMaps = "563"; - // Warning : in _providersTable, keys needs to follow this format : "Provider Type" + // Warning : in _providersTable, keys needs to follow this format : + // "Provider Type" #ifndef QGC_NO_GOOGLE_MAPS _providersTable["Google Street Map"] = new GoogleStreetMapProvider(this); - _providersTable["Google Satellite"] = new GoogleSatelliteMapProvider(this); - _providersTable["Google Terrain"] = new GoogleTerrainMapProvider(this); - _providersTable["Google Labels"] = new GoogleTerrainMapProvider(this); + _providersTable["Google Satellite"] = new GoogleSatelliteMapProvider(this); + _providersTable["Google Terrain"] = new GoogleTerrainMapProvider(this); + _providersTable["Google Labels"] = new GoogleTerrainMapProvider(this); #endif _providersTable["Bing Road"] = new BingRoadMapProvider(this); _providersTable["Bing Satellite"] = new BingSatelliteMapProvider(this); _providersTable["Bing Hybrid"] = new BingHybridMapProvider(this); - _providersTable["Statkart Topo"] = new StatkartMapProvider(this); + _providersTable["Statkart Topo"] = new StatkartMapProvider(this); + + _providersTable["Eniro Topo"] = new EniroMapProvider(this); + + // To be add later on Token entry ! + //_providersTable["Esri World Street"] = new EsriWorldStreetMapProvider(this); + //_providersTable["Esri World Satellite"] = new EsriWorldSatelliteMapProvider(this); + //_providersTable["Esri Terrain"] = new EsriTerrainMapProvider(this); } void UrlFactory::registerProvider(QString name, MapProvider* provider) { @@ -219,7 +227,6 @@ UrlFactory::_getURL(QString type, int x, int y, int zoom, QNetworkAccessManager* break; case EniroTopo: { - return QString("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/%2/%3.png").arg(zoom).arg(x).arg((1< -#include -#include -#include -#include -#include - -class StatkartMapProvider : public MapProvider { - - Q_OBJECT - public: - StatkartMapProvider(QObject* parent); - ~StatkartMapProvider(); - - protected: - QString _getURL(int x, int y, int zoom, - QNetworkAccessManager* networkManager); -}; -