Browse Source

Use Hash table in QGeoTiledMappingManagerEngineQGC

QGC4.4
Pierre TILAK 6 years ago
parent
commit
cf560e2ce5
  1. 7
      src/QtLocationPlugin/GoogleMapProvider.cpp
  2. 67
      src/QtLocationPlugin/GoogleMapProvider.h
  3. 4
      src/QtLocationPlugin/MapProvider.cpp
  4. 37
      src/QtLocationPlugin/MapProvider.h
  5. 10
      src/QtLocationPlugin/QGCMapUrlEngine.cpp
  6. 6
      src/QtLocationPlugin/QGCMapUrlEngine.h
  7. 135
      src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp

7
src/QtLocationPlugin/GoogleMapProvider.cpp

@ -5,11 +5,10 @@ @@ -5,11 +5,10 @@
#endif
#include "QGCMapEngine.h"
#define AVERAGE_GOOGLE_STREET_MAP 4913
GoogleMapProvider::GoogleMapProvider(QObject* parent)
GoogleMapProvider::GoogleMapProvider(quint32 averageSize, QGeoMapType::MapStyle mapType ,QObject* parent)
: MapProvider(QString("https://www.google.com/maps/preview"),
QString("png"), quint32(AVERAGE_GOOGLE_STREET_MAP), parent),
QString("png"), averageSize, mapType, parent),
_googleVersionRetrieved(false), _googleReply(nullptr) {
// Google version strings
@ -127,7 +126,7 @@ void GoogleMapProvider::_tryCorrectGoogleVersions( @@ -127,7 +126,7 @@ void GoogleMapProvider::_tryCorrectGoogleVersions(
}
}
QString GoogleMapProvider::_getURL(int x, int y, int zoom,
QString GoogleStreetMapProvider::_getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager) {
// http://mt1.google.com/vt/lyrs=m
QString server = "mt";

67
src/QtLocationPlugin/GoogleMapProvider.h

@ -3,16 +3,17 @@ @@ -3,16 +3,17 @@
#include "MapProvider.h"
#include <QByteArray>
#include <QMutex>
#include <QNetworkProxy>
#include <QNetworkReply>
#include <QString>
#include <QPoint>
#include <QMutex>
#include <QString>
class GoogleMapProvider : public MapProvider {
Q_OBJECT
public:
GoogleMapProvider(QObject* parent);
GoogleMapProvider(quint32 averageSize, QGeoMapType::MapStyle mapType,
QObject* parent);
~GoogleMapProvider();
@ -25,8 +26,8 @@ class GoogleMapProvider : public MapProvider { @@ -25,8 +26,8 @@ class GoogleMapProvider : public MapProvider {
protected:
// Define the url to Request
QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager) ;
virtual QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager) = 0;
// Google Specific private methods
void _getSecGoogleWords(int x, int y, QString& sec1, QString& sec2);
@ -43,28 +44,78 @@ class GoogleMapProvider : public MapProvider { @@ -43,28 +44,78 @@ class GoogleMapProvider : public MapProvider {
QString _secGoogleWord;
};
// NoMap = 0,
// StreetMap,
// SatelliteMapDay,
// SatelliteMapNight,
// TerrainMap,
// HybridMap,
// TransitMap,
// GrayStreetMap,
// PedestrianMap,
// CarNavigationMap,
// CycleMap,
// CustomMap = 100
const unsigned int AVERAGE_GOOGLE_STREET_MAP = 4913;
const unsigned int AVERAGE_GOOGLE_SAT_MAP = 56887;
const unsigned int AVERAGE_GOOGLE_TERRAIN_MAP = 19391;
// -----------------------------------------------------------
// Google Street Map
class GoogleStreetMapProvider : public GoogleMapProvider {
Q_OBJECT
public:
GoogleStreetMapProvider(QObject* parent)
: GoogleMapProvider(AVERAGE_GOOGLE_STREET_MAP, QGeoMapType::StreetMap,
parent) {}
protected:
QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager);
};
// -----------------------------------------------------------
// Google Street Map
class GoogleSatelliteMapProvider : public GoogleMapProvider {
Q_OBJECT
public:
GoogleSatelliteMapProvider(QObject* parent):GoogleMapProvider(parent){}
GoogleSatelliteMapProvider(QObject* parent)
: GoogleMapProvider(AVERAGE_GOOGLE_SAT_MAP,
QGeoMapType::SatelliteMapDay, parent) {}
protected:
QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager);
};
// -----------------------------------------------------------
// Google Labels Map
class GoogleLabelsMapProvider : public GoogleMapProvider {
Q_OBJECT
public:
GoogleLabelsMapProvider(QObject* parent):GoogleMapProvider(parent){}
GoogleLabelsMapProvider(QObject* parent)
: GoogleMapProvider(AVERAGE_TILE_SIZE, QGeoMapType::CustomMap, parent) {
}
protected:
QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager);
};
// -----------------------------------------------------------
// Google Terrain Map
class GoogleTerrainMapProvider : public GoogleMapProvider {
Q_OBJECT
public:
GoogleTerrainMapProvider(QObject* parent):GoogleMapProvider(parent){}
GoogleTerrainMapProvider(QObject* parent)
: GoogleMapProvider(AVERAGE_GOOGLE_TERRAIN_MAP, QGeoMapType::TerrainMap,
parent) {}
protected:
QString _getURL(int x, int y, int zoom,
QNetworkAccessManager* networkManager);

4
src/QtLocationPlugin/MapProvider.cpp

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
#include "MapProvider.h"
MapProvider::MapProvider(QString referrer, QString imageFormat,
quint32 averageSize, QObject* parent)
quint32 averageSize, QGeoMapType::MapStyle mapType,QObject* parent)
: QObject(parent), _referrer(referrer), _imageFormat(imageFormat),
_averageSize(averageSize) {
_averageSize(averageSize), _mapType(mapType) {
QStringList langs = QLocale::system().uiLanguages();
if (langs.length() > 0) {
_language = langs[0];

37
src/QtLocationPlugin/MapProvider.h

@ -4,32 +4,45 @@ @@ -4,32 +4,45 @@
#include <QNetworkProxy>
#include <QNetworkReply>
#include <QString>
#include <QtLocation/private/qgeomaptype_p.h>
static const unsigned char pngSignature[] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00};
static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00};
static const unsigned char gifSignature[] = {0x47, 0x49, 0x46, 0x38, 0x00};
static const unsigned char pngSignature[] = {0x89, 0x50, 0x4E, 0x47, 0x0D,
0x0A, 0x1A, 0x0A, 0x00};
static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00};
static const unsigned char gifSignature[] = {0x47, 0x49, 0x46, 0x38, 0x00};
const unsigned int AVERAGE_BING_STREET_MAP = 1297;
const unsigned int AVERAGE_BING_SAT_MAP = 19597;
const unsigned int AVERAGE_MAPBOX_SAT_MAP = 15739;
const unsigned int AVERAGE_MAPBOX_STREET_MAP = 5648;
const unsigned int AVERAGE_TILE_SIZE = 13652;
const unsigned int AVERAGE_AIRMAP_ELEV_SIZE = 2786;
class MapProvider : public QObject {
Q_OBJECT
public:
MapProvider(QString referrer, QString imageFormat, quint32 averageSize,
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);
QGeoMapType::MapStyle getMapStyle(){return _mapType;}
protected:
QString _tileXYToQuadKey (int tileX, int tileY, int levelOfDetail);
int _getServerNum (int x, int y, int max);
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
virtual QString _getURL(int x, int y, int zoom,

10
src/QtLocationPlugin/QGCMapUrlEngine.cpp

@ -29,14 +29,6 @@ @@ -29,14 +29,6 @@
#include <QByteArray>
#define AVERAGE_GOOGLE_TERRAIN_MAP 19391
#define AVERAGE_BING_STREET_MAP 1297
#define AVERAGE_BING_SAT_MAP 19597
#define AVERAGE_GOOGLE_SAT_MAP 56887
#define AVERAGE_MAPBOX_SAT_MAP 15739
#define AVERAGE_MAPBOX_STREET_MAP 5648
#define AVERAGE_TILE_SIZE 13652
#define AVERAGE_AIRMAP_ELEV_SIZE 2786
//-----------------------------------------------------------------------------
UrlFactory::UrlFactory()
@ -46,7 +38,7 @@ UrlFactory::UrlFactory() @@ -46,7 +38,7 @@ UrlFactory::UrlFactory()
// BingMaps
//_versionBingMaps = "563";
#ifndef QGC_NO_GOOGLE_MAPS
_providersTable["GoogleStreet"] = new GoogleMapProvider(this);
_providersTable["GoogleStreet"] = new GoogleStreetMapProvider(this);
_providersTable["GoogleSatellite"] = new GoogleSatelliteMapProvider(this);
#endif
_curMapProvider = _providersTable["GoogleStreet"];

6
src/QtLocationPlugin/QGCMapUrlEngine.h

@ -85,18 +85,16 @@ public: @@ -85,18 +85,16 @@ public:
static quint32 averageSizeForType (MapType type);
//private:
// QString _getURL (MapType type, int x, int y, int zoom, QNetworkAccessManager* networkManager);
QHash<QString, MapProvider*> getProviderTable(){return _providersTable;}
private:
int _timeout;
QHash<QString, MapProvider*> _providersTable;
// BingMaps
//QString _versionBingMaps;
MapProvider* _curMapProvider;
QHash<QString, MapProvider*> _providersTable;
};

135
src/QtLocationPlugin/QGeoTiledMappingManagerEngineQGC.cpp

@ -100,71 +100,82 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian @@ -100,71 +100,82 @@ QGeoTiledMappingManagerEngineQGC::QGeoTiledMappingManagerEngineQGC(const QVarian
* Google and Bing don't seem kosher at all. This was based on original code from OpenPilot and heavily modified to be used in QGC.
*/
QList<QGeoMapType> mapList;
QHashIterator<QString, MapProvider*> i(getQGCMapEngine()->urlFactory()->getProviderTable());
int id = 0;
while(i.hasNext()){
i.next();
id++;
mapList.append(QGCGEOMAPTYPE(i.value()->getMapStyle(), i.key(), i.key(), false, false, id));
}
setSupportedMapTypes(mapList);
//-- IMPORTANT
// Changes here must reflect those in QGCMapEngine.cpp
setSupportedMapTypes({
#ifndef QGC_NO_GOOGLE_MAPS
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Google Street Map", "Google street map", false, false, UrlFactory::GoogleMap),
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Google Satellite Map", "Google satellite map", false, false, UrlFactory::GoogleSatellite),
QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Google Terrain Map", "Google terrain map", false, false, UrlFactory::GoogleTerrain),
#endif
/* TODO:
* Proper google hybrid maps requires collecting two separate bitmaps and overlaying them.
*
* mapTypes << QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Google Hybrid Map", "Google hybrid map", false, false, UrlFactory::GoogleHybrid),
*
*/
// Bing
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Bing Street Map", "Bing street map", false, false, UrlFactory::BingMap),
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Bing Satellite Map", "Bing satellite map", false, false, UrlFactory::BingSatellite),
QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Bing Hybrid Map", "Bing hybrid map", false, false, UrlFactory::BingHybrid),
// Statkart
QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Statkart Terrain Map", "Statkart Terrain Map", false, false, UrlFactory::StatkartTopo),
// Eniro
QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Eniro Terrain Map", "Eniro Terrain Map", false, false, UrlFactory::EniroTopo),
// Esri
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Esri Street Map", "ArcGIS Online World Street Map", true, false, UrlFactory::EsriWorldStreet),
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Esri Satellite Map", "ArcGIS Online World Imagery", true, false, UrlFactory::EsriWorldSatellite),
QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Esri Terrain Map", "World Terrain Base", false, false, UrlFactory::EsriTerrain),
// VWorld
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "VWorld Satellite Map", "VWorld Satellite Map", false, false, UrlFactory::VWorldSatellite),
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "VWorld Street Map", "VWorld Street Map", false, false, UrlFactory::VWorldStreet),
/* See: https://wiki.openstreetmap.org/wiki/Tile_usage_policy
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Open Street Map", "Open Street map", false, false, UrlFactory::OpenStreetMap),
*/
// MapQuest
/*
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "MapQuest Street Map", "MapQuest street map", false, false, UrlFactory::MapQuestMap),
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "MapQuest Satellite Map", "MapQuest satellite map", false, false, UrlFactory::MapQuestSat),
*/
/*
* These are OK as you need your own token for accessing it. Out-of-the box, QGC does not even offer these unless you enter a proper Mapbox token.
*/
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Street Map", "Mapbox Street Map", false, false, UrlFactory::MapboxStreets),
QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Mapbox Satellite Map", "Mapbox Satellite Map", false, false, UrlFactory::MapboxSatellite),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox High Contrast Map", "Mapbox High Contrast Map", false, false, UrlFactory::MapboxHighContrast),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Light Map", "Mapbox Light Map", false, false, UrlFactory::MapboxLight),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Dark Map", "Mapbox Dark Map", false, false, UrlFactory::MapboxDark),
QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Mapbox Hybrid Map", "Mapbox Hybrid Map", false, false, UrlFactory::MapboxHybrid),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Wheat Paste Map", "Mapbox Wheat Paste Map", false, false, UrlFactory::MapboxWheatPaste),
QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Streets Basic Map", "Mapbox Streets Basic Map", false, false, UrlFactory::MapboxStreetsBasic),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Comic Map", "Mapbox Comic Map", false, false, UrlFactory::MapboxComic),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Outdoors Map", "Mapbox Outdoors Map", false, false, UrlFactory::MapboxOutdoors),
QGCGEOMAPTYPE(QGeoMapType::CycleMap, "Mapbox Run, Byke and Hike Map", "Mapbox Run, Byke and Hike Map", false, false, UrlFactory::MapboxRunBikeHike),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pencil Map", "Mapbox Pencil Map", false, false, UrlFactory::MapboxPencil),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pirates Map", "Mapbox Pirates Map", false, false, UrlFactory::MapboxPirates),
QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Emerald Map", "Mapbox Emerald Map", false, false, UrlFactory::MapboxEmerald),
});
// setSupportedMapTypes({
//#ifndef QGC_NO_GOOGLE_MAPS
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Google Street Map", "Google street map", false, false, UrlFactory::GoogleMap),
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Google Satellite Map", "Google satellite map", false, false, UrlFactory::GoogleSatellite),
// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Google Terrain Map", "Google terrain map", false, false, UrlFactory::GoogleTerrain),
//#endif
//
// /* TODO:
// * Proper google hybrid maps requires collecting two separate bitmaps and overlaying them.
// *
// * mapTypes << QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Google Hybrid Map", "Google hybrid map", false, false, UrlFactory::GoogleHybrid),
// *
// */
//
// // Bing
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Bing Street Map", "Bing street map", false, false, UrlFactory::BingMap),
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Bing Satellite Map", "Bing satellite map", false, false, UrlFactory::BingSatellite),
// QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Bing Hybrid Map", "Bing hybrid map", false, false, UrlFactory::BingHybrid),
//
// // Statkart
// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Statkart Terrain Map", "Statkart Terrain Map", false, false, UrlFactory::StatkartTopo),
// // Eniro
// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Eniro Terrain Map", "Eniro Terrain Map", false, false, UrlFactory::EniroTopo),
//
// // Esri
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Esri Street Map", "ArcGIS Online World Street Map", true, false, UrlFactory::EsriWorldStreet),
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Esri Satellite Map", "ArcGIS Online World Imagery", true, false, UrlFactory::EsriWorldSatellite),
// QGCGEOMAPTYPE(QGeoMapType::TerrainMap, "Esri Terrain Map", "World Terrain Base", false, false, UrlFactory::EsriTerrain),
//
// // VWorld
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "VWorld Satellite Map", "VWorld Satellite Map", false, false, UrlFactory::VWorldSatellite),
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "VWorld Street Map", "VWorld Street Map", false, false, UrlFactory::VWorldStreet),
//
// /* See: https://wiki.openstreetmap.org/wiki/Tile_usage_policy
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Open Street Map", "Open Street map", false, false, UrlFactory::OpenStreetMap),
// */
//
// // MapQuest
// /*
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "MapQuest Street Map", "MapQuest street map", false, false, UrlFactory::MapQuestMap),
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "MapQuest Satellite Map", "MapQuest satellite map", false, false, UrlFactory::MapQuestSat),
// */
//
// /*
// * These are OK as you need your own token for accessing it. Out-of-the box, QGC does not even offer these unless you enter a proper Mapbox token.
// */
//
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Street Map", "Mapbox Street Map", false, false, UrlFactory::MapboxStreets),
// QGCGEOMAPTYPE(QGeoMapType::SatelliteMapDay, "Mapbox Satellite Map", "Mapbox Satellite Map", false, false, UrlFactory::MapboxSatellite),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox High Contrast Map", "Mapbox High Contrast Map", false, false, UrlFactory::MapboxHighContrast),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Light Map", "Mapbox Light Map", false, false, UrlFactory::MapboxLight),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Dark Map", "Mapbox Dark Map", false, false, UrlFactory::MapboxDark),
// QGCGEOMAPTYPE(QGeoMapType::HybridMap, "Mapbox Hybrid Map", "Mapbox Hybrid Map", false, false, UrlFactory::MapboxHybrid),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Wheat Paste Map", "Mapbox Wheat Paste Map", false, false, UrlFactory::MapboxWheatPaste),
// QGCGEOMAPTYPE(QGeoMapType::StreetMap, "Mapbox Streets Basic Map", "Mapbox Streets Basic Map", false, false, UrlFactory::MapboxStreetsBasic),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Comic Map", "Mapbox Comic Map", false, false, UrlFactory::MapboxComic),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Outdoors Map", "Mapbox Outdoors Map", false, false, UrlFactory::MapboxOutdoors),
// QGCGEOMAPTYPE(QGeoMapType::CycleMap, "Mapbox Run, Byke and Hike Map", "Mapbox Run, Byke and Hike Map", false, false, UrlFactory::MapboxRunBikeHike),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pencil Map", "Mapbox Pencil Map", false, false, UrlFactory::MapboxPencil),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Pirates Map", "Mapbox Pirates Map", false, false, UrlFactory::MapboxPirates),
// QGCGEOMAPTYPE(QGeoMapType::CustomMap, "Mapbox Emerald Map", "Mapbox Emerald Map", false, false, UrlFactory::MapboxEmerald),
// });
//-- Users (QML code) can define a different user agent
if (parameters.contains(QStringLiteral("useragent"))) {

Loading…
Cancel
Save