QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCMapUrlEngine.cpp
Go to the documentation of this file.
1#include "QGCMapUrlEngine.h"
2
3#include <QtCore/QtMinMax>
4
5#include "BingMapProvider.h"
7#include "EsriMapProvider.h"
9#include "GoogleMapProvider.h"
10#include "MapboxMapProvider.h"
11#include "TianDiTuProvider.h"
12#include "QGCLoggingCategory.h"
13
14QGC_LOGGING_CATEGORY(QGCMapUrlEngineLog, "QtLocationPlugin.QGCMapUrlEngine")
15
16const QList<SharedMapProvider> UrlFactory::_providers = {
17#ifndef QGC_NO_GOOGLE_MAPS
18 std::make_shared<GoogleStreetMapProvider>(),
19 std::make_shared<GoogleSatelliteMapProvider>(),
20 std::make_shared<GoogleTerrainMapProvider>(),
21 std::make_shared<GoogleHybridMapProvider>(),
22 std::make_shared<GoogleLabelsMapProvider>(),
23#endif
24 std::make_shared<BingRoadMapProvider>(),
25 std::make_shared<BingSatelliteMapProvider>(),
26 std::make_shared<BingHybridMapProvider>(),
27
28 std::make_shared<TianDiTuRoadProvider>(),
29 std::make_shared<TianDiTuSatelliteProvider>(),
30 std::make_shared<StatkartTopoMapProvider>(),
31 std::make_shared<StatkartBaseMapProvider>(),
32 std::make_shared<SvalbardMapProvider>(),
33
34 std::make_shared<EniroMapProvider>(),
35
36 std::make_shared<EsriWorldStreetMapProvider>(),
37 std::make_shared<EsriWorldSatelliteMapProvider>(),
38 std::make_shared<EsriTerrainMapProvider>(),
39
40 std::make_shared<MapboxStreetMapProvider>(),
41 std::make_shared<MapboxLightMapProvider>(),
42 std::make_shared<MapboxDarkMapProvider>(),
43 std::make_shared<MapboxSatelliteMapProvider>(),
44 std::make_shared<MapboxHybridMapProvider>(),
45 std::make_shared<MapboxStreetsBasicMapProvider>(),
46 std::make_shared<MapboxOutdoorsMapProvider>(),
47 std::make_shared<MapboxBrightMapProvider>(),
48 std::make_shared<MapboxCustomMapProvider>(),
49
50 std::make_shared<MapQuestMapMapProvider>(),
51 std::make_shared<MapQuestSatMapProvider>(),
52
53 std::make_shared<VWorldStreetMapProvider>(),
54 std::make_shared<VWorldSatMapProvider>(),
55
56 std::make_shared<JapanStdMapProvider>(),
57 std::make_shared<JapanSeamlessMapProvider>(),
58 std::make_shared<JapanAnaglyphMapProvider>(),
59 std::make_shared<JapanSlopeMapProvider>(),
60 std::make_shared<JapanReliefMapProvider>(),
61
62 std::make_shared<LINZBasemapMapProvider>(),
63
64 std::make_shared<OpenStreetMapProvider>(),
65
66 std::make_shared<OpenAIPMapProvider>(),
67
68 std::make_shared<CustomURLMapProvider>(),
69
70 std::make_shared<CopernicusElevationProvider>()
71};
72
73QString UrlFactory::getImageFormat(int qtMapId, QByteArrayView image)
74{
75 const SharedMapProvider provider = getMapProviderFromQtMapId(qtMapId);
76 if (provider) {
77 return provider->getImageFormat(image);
78 }
79
80 return QString("");
81}
82
83QString UrlFactory::getImageFormat(QStringView type, QByteArrayView image)
84{
86 if (provider) {
87 return provider->getImageFormat(image);
88 }
89
90 return QString("");
91}
92
93QUrl UrlFactory::getTileURL(int qtMapId, int x, int y, int zoom)
94{
95 const SharedMapProvider provider = getMapProviderFromQtMapId(qtMapId);
96 if (provider) {
97 return provider->getTileURL(x, y, zoom);
98 }
99
100 return QUrl();
101}
102
103QUrl UrlFactory::getTileURL(QStringView type, int x, int y, int zoom)
104{
106 if (provider) {
107 return provider->getTileURL(x, y, zoom);
108 }
109
110 return QUrl();
111}
112
113quint32 UrlFactory::averageSizeForType(QStringView type)
114{
116 if (provider) {
117 return provider->getAverageSize();
118 }
119
121}
122
123bool UrlFactory::isElevation(int qtMapId)
124{
125 const SharedMapProvider provider = getMapProviderFromQtMapId(qtMapId);
126 if (provider) {
127 return provider->isElevationProvider();
128 }
129
130 return false;
131}
132
133int UrlFactory::long2tileX(QStringView mapType, double lon, int z)
134{
135 const SharedMapProvider provider = getMapProviderFromProviderType(mapType);
136 if (provider) {
137 return provider->long2tileX(lon, z);
138 }
139
140 return 0;
141}
142
143int UrlFactory::lat2tileY(QStringView mapType, double lat, int z)
144{
145 const SharedMapProvider provider = getMapProviderFromProviderType(mapType);
146 if (provider) {
147 return provider->lat2tileY(lat, z);
148 }
149
150 return 0;
151}
152
153QGCTileSet UrlFactory::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QStringView mapType)
154{
155 const SharedMapProvider provider = getMapProviderFromProviderType(mapType);
156 if (provider) {
157 // TODO: zoom = qBound(QGeoCameraCapabilities.minimumZoomLevel(), zoom, QGeoCameraCapabilities.maximumZoomLevel());
158 zoom = qBound(1, zoom, QGC_MAX_MAP_ZOOM);
159 return provider->getTileCount(zoom, topleftLon, topleftLat, bottomRightLon, bottomRightLat);
160 }
161
162 return QGCTileSet();
163}
164
166{
167 if (qtMapId == -1) {
168 return QString();
169 }
170
171 for (const SharedMapProvider &provider : _providers) {
172 if (provider->getMapId() == qtMapId) {
173 return provider->getMapName();
174 }
175 }
176
177 qCWarning(QGCMapUrlEngineLog) << "map id not found:" << qtMapId;
178 return QString();
179}
180
182{
183 if (qtMapId == -1) {
184 return nullptr;
185 }
186
187 for (const SharedMapProvider &provider : _providers) {
188 if (provider->getMapId() == qtMapId) {
189 return provider;
190 }
191 }
192
193 qCWarning(QGCMapUrlEngineLog) << "provider not found from id:" << qtMapId;
194 return nullptr;
195}
196
198{
199 if (type.isEmpty()) {
200 return nullptr;
201 }
202
203 for (const SharedMapProvider &provider : _providers) {
204 if (provider->getMapName() == type) {
205 return provider;
206 }
207 }
208
209 qCWarning(QGCMapUrlEngineLog) << "type not found:" << type;
210 return nullptr;
211}
212
214{
215 if (type.isEmpty()) {
216 return -1;
217 }
218
219 for (const SharedMapProvider &provider : _providers) {
220 if (provider->getMapName() == type) {
221 return provider->getMapId();
222 }
223 }
224
225 qCWarning(QGCMapUrlEngineLog) << "type not found:" << type;
226 return -1;
227}
228
230{
231 QStringList types;
232 for (const SharedMapProvider &provider : _providers) {
233 if (provider->isElevationProvider()) {
234 types.append(provider->getMapName());
235 }
236 }
237
238 return types;
239}
240
242{
243 QStringList types;
244 for (const SharedMapProvider &provider : _providers) {
245 types.append(provider->getMapName());
246 }
247
248 return types;
249}
250
252{
253 for (const SharedMapProvider &provider : _providers) {
254 const QString mapName = provider->getMapName();
255 if (hashFromProviderType(mapName) == hash) {
256 return mapName;
257 }
258 }
259
260 qCWarning(QGCMapUrlEngineLog) << "provider not found from hash:" << hash;
261 return QString("");
262}
263
265{
266 for (const SharedMapProvider &provider : _providers) {
267 if (provider->getMapName() == type) {
268 return provider->getMapId();
269 }
270 }
271
272 qCWarning(QGCMapUrlEngineLog) << "provider not found for type:" << type;
273 return -1;
274}
275
276QString UrlFactory::tileHashToType(QStringView tileHash)
277{
278 const int providerHash = tileHash.mid(0,10).toInt();
279 return providerTypeFromHash(providerHash);
280}
281
282QString UrlFactory::getTileHash(QStringView type, int x, int y, int z)
283{
284 const int hash = hashFromProviderType(type);
285 return QString::asprintf("%010d%08d%08d%03d", hash, x, y, z);
286}
static constexpr const quint32 QGC_AVERAGE_TILE_SIZE
Definition MapProvider.h:29
#define QGC_MAX_MAP_ZOOM
Definition MapProvider.h:28
#define QGC_LOGGING_CATEGORY(name, categoryStr)
std::shared_ptr< const MapProvider > SharedMapProvider
static QUrl getTileURL(QStringView type, int x, int y, int zoom)
static QString getTileHash(QStringView type, int x, int y, int z)
static QStringList getProviderTypes()
static QGCTileSet getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QStringView mapType)
static bool isElevation(int qtMapId)
static QString getProviderTypeFromQtMapId(int qtMapId)
static QString getImageFormat(QStringView type, QByteArrayView image)
static int lat2tileY(QStringView mapType, double lat, int z)
static QStringList getElevationProviderTypes()
static int hashFromProviderType(QStringView type)
static QString tileHashToType(QStringView tileHash)
static int long2tileX(QStringView mapType, double lon, int z)
static QString providerTypeFromHash(int hash)
static quint32 averageSizeForType(QStringView type)
static int getQtMapIdFromProviderType(QStringView type)
static std::shared_ptr< const MapProvider > getMapProviderFromProviderType(QStringView type)
static std::shared_ptr< const MapProvider > getMapProviderFromQtMapId(int qtMapId)