diff --git a/src/QtLocationPlugin/BingMapProvider.cpp b/src/QtLocationPlugin/BingMapProvider.cpp new file mode 100644 index 0000000..59a2813 --- /dev/null +++ b/src/QtLocationPlugin/BingMapProvider.cpp @@ -0,0 +1,51 @@ +#include "BingMapProvider.h" +#if defined(DEBUG_GOOGLE_MAPS) +#include +#include +#endif +#include "QGCMapEngine.h" + +BingMapProvider::BingMapProvider(quint32 averageSize, + QGeoMapType::MapStyle mapType, QObject* parent) + : MapProvider(QString("https://www.bing.com/maps/"), QString("png"), + averageSize, mapType, parent) {} + +BingMapProvider::~BingMapProvider() {} + +QString BingRoadMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + 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); +} + +QString +BingSatelliteMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + 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); +} + +QString BingHybridMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + QString key = _tileXYToQuadKey(x, y, zoom); + return QString("http://ecn.t%1.tiles.virtualearth.net/tiles/" + "h%2.jpeg?g=%3&mkt=%4") + .arg(_getServerNum(x, y, 4)) + .arg(key) + .arg(_versionBingMaps) + .arg(_language); +} + diff --git a/src/QtLocationPlugin/BingMapProvider.h b/src/QtLocationPlugin/BingMapProvider.h new file mode 100644 index 0000000..933cfeb --- /dev/null +++ b/src/QtLocationPlugin/BingMapProvider.h @@ -0,0 +1,74 @@ +#pragma once + +#include "MapProvider.h" + +#include +#include +#include +#include +#include +#include + +class BingMapProvider : public MapProvider { + Q_OBJECT + public: + BingMapProvider(quint32 averageSize, QGeoMapType::MapStyle mapType, + QObject* parent); + + ~BingMapProvider(); + + protected: + // Define the url to Request + virtual QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) = 0; + + const QString _versionBingMaps = "563"; +}; + +const quint32 AVERAGE_BING_STREET_MAP = 1297; +const quint32 AVERAGE_BING_SAT_MAP = 19597; + +// ----------------------------------------------------------- +// Bing Road Map + +class BingRoadMapProvider : public BingMapProvider { + Q_OBJECT + public: + BingRoadMapProvider(QObject* parent) + : BingMapProvider(AVERAGE_BING_STREET_MAP, QGeoMapType::StreetMap, + parent) {} + + protected: + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +// ----------------------------------------------------------- +// Bing Satellite Map + +class BingSatelliteMapProvider : public BingMapProvider { + Q_OBJECT + public: + BingSatelliteMapProvider(QObject* parent) + : BingMapProvider(AVERAGE_BING_SAT_MAP, QGeoMapType::SatelliteMapDay, + parent) {} + + protected: + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; + +// ----------------------------------------------------------- +// Bing Hybrid Map + +class BingHybridMapProvider : public BingMapProvider { + Q_OBJECT + public: + BingHybridMapProvider(QObject* parent) + : BingMapProvider(AVERAGE_BING_SAT_MAP, QGeoMapType::HybridMap, + parent) {} + + protected: + QString _getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager); +}; diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h index b92ab6d..b37baab 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 21a359c..7ce81a9 100644 --- a/src/QtLocationPlugin/QGCLocationPlugin.pri +++ b/src/QtLocationPlugin/QGCLocationPlugin.pri @@ -25,6 +25,7 @@ HEADERS += \ $$PWD/MapProvider.h \ $$PWD/GoogleMapProvider.h \ $$PWD/BingMapProvider.h \ + $$PWD/StatkartMapProvider.h \ SOURCES += \ $$PWD/QGCMapEngine.cpp \ @@ -40,6 +41,7 @@ SOURCES += \ $$PWD/MapProvider.cpp \ $$PWD/GoogleMapProvider.cpp \ $$PWD/BingMapProvider.cpp \ + $$PWD/StatkartMapProvider.cpp \ OTHER_FILES += \ $$PWD/qgc_maps_plugin.json diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index 071b41b..7bce34f 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -48,6 +48,8 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { _providersTable["Bing Road"] = new BingRoadMapProvider(this); _providersTable["Bing Satellite"] = new BingSatelliteMapProvider(this); _providersTable["Bing Hybrid"] = new BingHybridMapProvider(this); + + _providersTable["Statkart Topo"] = new StatkartMapProvider(this); } void UrlFactory::registerProvider(QString name, MapProvider* provider) { @@ -88,11 +90,6 @@ QString UrlFactory::getImageFormat(QString type, const QByteArray& image) { // format = "gif"; // else { // switch (type) { - // case GoogleMap: - // case GoogleLabels: - // case GoogleTerrain: - // case GoogleHybrid: - // case BingMap: // case StatkartTopo: // format = "png"; // break; diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h index 2ff5ee8..541a151 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.h +++ b/src/QtLocationPlugin/QGCMapUrlEngine.h @@ -18,6 +18,7 @@ #include "GoogleMapProvider.h" #include "BingMapProvider.h" +#include "StatkartMapProvider.h" #define MAX_MAP_ZOOM (20.0) diff --git a/src/QtLocationPlugin/StatkartMapProvider.cpp b/src/QtLocationPlugin/StatkartMapProvider.cpp new file mode 100644 index 0000000..ce7e44e --- /dev/null +++ b/src/QtLocationPlugin/StatkartMapProvider.cpp @@ -0,0 +1,23 @@ +#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() {} + +QString StatkartMapProvider::_getURL(int x, int y, int zoom, + QNetworkAccessManager* networkManager) { + Q_UNUSED(networkManager); + 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); +} + diff --git a/src/QtLocationPlugin/StatkartMapProvider.h b/src/QtLocationPlugin/StatkartMapProvider.h new file mode 100644 index 0000000..4c2cc25 --- /dev/null +++ b/src/QtLocationPlugin/StatkartMapProvider.h @@ -0,0 +1,23 @@ +#pragma once + +#include "MapProvider.h" + +#include +#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); +}; +