Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
geotiledmappingmanagerengine_esri.cpp
Go to the documentation of this file.
1// Copyright (C) 2013-2018 Esri <contracts@esri.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
7
8#include <QtLocation/private/qgeocameracapabilities_p.h>
9#include <QtLocation/private/qgeomaptype_p.h>
10#include <QtLocation/private/qgeotiledmap_p.h>
11#include <QtLocation/private/qgeofiletilecache_p.h>
12
13#include <QFileInfo>
14#include <QDir>
15#include <QUrl>
16#include <QFile>
17#include <QJsonDocument>
18#include <QJsonObject>
19
21
22static const QString kPrefixEsri(QStringLiteral("esri."));
23static const QString kParamUserAgent(kPrefixEsri + QStringLiteral("useragent"));
24static const QString kParamToken(kPrefixEsri + QStringLiteral("token"));
25static const QString kPrefixMapping(kPrefixEsri + QStringLiteral("mapping."));
26static const QString kParamMinimumZoomLevel(kPrefixMapping + QStringLiteral("minimumZoomLevel"));
27static const QString kParamMaximumZoomLevel(kPrefixMapping + QStringLiteral("maximumZoomLevel"));
28
29static const QString kPropMapSources(QStringLiteral("mapSources"));
30static const QString kPropStyle(QStringLiteral("style"));
31static const QString kPropName(QStringLiteral("name"));
32static const QString kPropDescription(QStringLiteral("description"));
33static const QString kPropMobile(QStringLiteral("mobile"));
34static const QString kPropNight(QStringLiteral("night"));
35static const QString kPropUrl(QStringLiteral("url"));
36static const QString kPropMapId(QStringLiteral("mapId"));
37static const QString kPropCopyright(QStringLiteral("copyrightText"));
38
39GeoTiledMappingManagerEngineEsri::GeoTiledMappingManagerEngineEsri(const QVariantMap &parameters,
40 QGeoServiceProvider::Error *error,
41 QString *errorString) :
42 QGeoTiledMappingManagerEngine()
43{
44 QGeoCameraCapabilities cameraCaps;
45
46 double minimumZoomLevel = 0;
47 double maximumZoomLevel = 19;
48
49 if (parameters.contains(kParamMinimumZoomLevel))
50 minimumZoomLevel = parameters[kParamMinimumZoomLevel].toDouble();
51
52 if (parameters.contains(kParamMaximumZoomLevel))
53 maximumZoomLevel = parameters[kParamMaximumZoomLevel].toDouble();
54
55 cameraCaps.setMinimumZoomLevel(minimumZoomLevel);
56 cameraCaps.setMaximumZoomLevel(maximumZoomLevel);
57 cameraCaps.setSupportsBearing(true);
58 cameraCaps.setSupportsTilting(true);
59 cameraCaps.setMinimumTilt(0);
60 cameraCaps.setMaximumTilt(80);
61 cameraCaps.setMinimumFieldOfView(20.0);
62 cameraCaps.setMaximumFieldOfView(120.0);
63 cameraCaps.setOverzoomEnabled(true);
64 setCameraCapabilities(cameraCaps);
65
66 setTileSize(QSize(256, 256));
67
68 if (!initializeMapSources(error, errorString, cameraCaps))
69 return;
70
71 QList<QGeoMapType> mapTypes;
72
73 for (GeoMapSource *mapSource : m_mapSources) {
74 mapTypes << QGeoMapType(
75 mapSource->style(),
76 mapSource->name(),
77 mapSource->description(),
78 mapSource->mobile(),
79 mapSource->night(),
80 mapSource->mapId(),
81 "esri",
82 cameraCaps);
83 }
84
85 setSupportedMapTypes(mapTypes);
86
87 GeoTileFetcherEsri *tileFetcher = new GeoTileFetcherEsri(this);
88
89 if (parameters.contains(kParamUserAgent))
90 tileFetcher->setUserAgent(parameters.value(kParamUserAgent).toString().toLatin1());
91
92 if (parameters.contains(kParamToken))
93 tileFetcher->setToken(parameters.value(kParamToken).toString());
94
95 setTileFetcher(tileFetcher);
96
97 /* TILE CACHE */
98 QString cacheDirectory;
99 if (parameters.contains(QStringLiteral("esri.mapping.cache.directory"))) {
100 cacheDirectory = parameters.value(QStringLiteral("esri.mapping.cache.directory")).toString();
101 } else {
102 // managerName() is not yet set, we have to hardcode the plugin name below
103 cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + QLatin1String("esri");
104 }
105 QGeoFileTileCache *tileCache = new QGeoFileTileCache(cacheDirectory);
106
107 /*
108 * Disk cache setup -- defaults to ByteSize (old behavior)
109 */
110 if (parameters.contains(QStringLiteral("esri.mapping.cache.disk.cost_strategy"))) {
111 QString cacheStrategy = parameters.value(QStringLiteral("esri.mapping.cache.disk.cost_strategy")).toString().toLower();
112 if (cacheStrategy == QLatin1String("bytesize"))
113 tileCache->setCostStrategyDisk(QGeoFileTileCache::ByteSize);
114 else
115 tileCache->setCostStrategyDisk(QGeoFileTileCache::Unitary);
116 } else {
117 tileCache->setCostStrategyDisk(QGeoFileTileCache::ByteSize);
118 }
119 if (parameters.contains(QStringLiteral("esri.mapping.cache.disk.size"))) {
120 bool ok = false;
121 int cacheSize = parameters.value(QStringLiteral("esri.mapping.cache.disk.size")).toString().toInt(&ok);
122 if (ok)
123 tileCache->setMaxDiskUsage(cacheSize);
124 }
125
126 /*
127 * Memory cache setup -- defaults to ByteSize (old behavior)
128 */
129 if (parameters.contains(QStringLiteral("esri.mapping.cache.memory.cost_strategy"))) {
130 QString cacheStrategy = parameters.value(QStringLiteral("esri.mapping.cache.memory.cost_strategy")).toString().toLower();
131 if (cacheStrategy == QLatin1String("bytesize"))
132 tileCache->setCostStrategyMemory(QGeoFileTileCache::ByteSize);
133 else
134 tileCache->setCostStrategyMemory(QGeoFileTileCache::Unitary);
135 } else {
136 tileCache->setCostStrategyMemory(QGeoFileTileCache::ByteSize);
137 }
138 if (parameters.contains(QStringLiteral("esri.mapping.cache.memory.size"))) {
139 bool ok = false;
140 int cacheSize = parameters.value(QStringLiteral("esri.mapping.cache.memory.size")).toString().toInt(&ok);
141 if (ok)
142 tileCache->setMaxMemoryUsage(cacheSize);
143 }
144
145 /*
146 * Texture cache setup -- defaults to ByteSize (old behavior)
147 */
148 if (parameters.contains(QStringLiteral("esri.mapping.cache.texture.cost_strategy"))) {
149 QString cacheStrategy = parameters.value(QStringLiteral("esri.mapping.cache.texture.cost_strategy")).toString().toLower();
150 if (cacheStrategy == QLatin1String("bytesize"))
151 tileCache->setCostStrategyTexture(QGeoFileTileCache::ByteSize);
152 else
153 tileCache->setCostStrategyTexture(QGeoFileTileCache::Unitary);
154 } else {
155 tileCache->setCostStrategyTexture(QGeoFileTileCache::ByteSize);
156 }
157 if (parameters.contains(QStringLiteral("esri.mapping.cache.texture.size"))) {
158 bool ok = false;
159 int cacheSize = parameters.value(QStringLiteral("esri.mapping.cache.texture.size")).toString().toInt(&ok);
160 if (ok)
161 tileCache->setExtraTextureUsage(cacheSize);
162 }
163
164 /* PREFETCHING */
165 if (parameters.contains(QStringLiteral("esri.mapping.prefetching_style"))) {
166 const QString prefetchingMode = parameters.value(QStringLiteral("esri.mapping.prefetching_style")).toString();
167 if (prefetchingMode == QStringLiteral("TwoNeighbourLayers"))
168 m_prefetchStyle = QGeoTiledMap::PrefetchTwoNeighbourLayers;
169 else if (prefetchingMode == QStringLiteral("OneNeighbourLayer"))
170 m_prefetchStyle = QGeoTiledMap::PrefetchNeighbourLayer;
171 else if (prefetchingMode == QStringLiteral("NoPrefetching"))
172 m_prefetchStyle = QGeoTiledMap::NoPrefetching;
173 }
174
175 setTileCache(tileCache);
176 *error = QGeoServiceProvider::NoError;
177 errorString->clear();
178}
179
181{
182 qDeleteAll(m_mapSources);
183}
184
186{
187 QGeoTiledMap *map = new GeoTiledMapEsri(this);
188 map->setPrefetchStyle(m_prefetchStyle);
189 return map;
190}
191
192// ${z} = Zoom
193// ${x} = X
194// ${y} = Y
195// ${token} = Token
196
197// template =
198// 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{{z}}/{{y}}/{{x}}.png'
199
200bool GeoTiledMappingManagerEngineEsri::initializeMapSources(QGeoServiceProvider::Error *error,
201 QString *errorString,
202 const QGeoCameraCapabilities &cameraCaps)
203{
204 QFile mapsFile(":/esri/maps.json");
205
206 if (!mapsFile.open(QIODevice::ReadOnly)) {
207 *error = QGeoServiceProvider::NotSupportedError;
208 *errorString = Q_FUNC_INFO + QStringLiteral("Unable to open: ") + mapsFile.fileName();
209
210 return false;
211 }
212
213 QByteArray mapsData = mapsFile.readAll();
214 mapsFile.close();
215
216 QJsonParseError parseError;
217
218 QJsonDocument mapsDocument = QJsonDocument::fromJson(mapsData, &parseError);
219
220 if (!mapsDocument.isObject()) {
221 *error = QGeoServiceProvider::NotSupportedError;
222 *errorString = QString("%1JSON error: %2, offset: %3, details: %4")
223 .arg(Q_FUNC_INFO)
224 .arg((int)parseError.error)
225 .arg(parseError.offset)
226 .arg(parseError.errorString());
227 return false;
228 }
229
230 QVariantMap maps = mapsDocument.object().toVariantMap();
231
232 QVariantList mapSources = maps["mapSources"].toList();
233
234 for (const QVariant &mapSourceElement : mapSources) {
235 QVariantMap mapSource = mapSourceElement.toMap();
236
237 int mapId = m_mapSources.count() + 1;
238
239 m_mapSources << new GeoMapSource(
240 GeoMapSource::mapStyle(mapSource[kPropStyle].toString()),
241 mapSource[kPropName].toString(),
242 mapSource[kPropDescription].toString(),
243 mapSource[kPropMobile].toBool(),
244 mapSource[kPropMapId].toBool(),
245 mapId,
246 GeoMapSource::toFormat(mapSource[kPropUrl].toString()),
247 mapSource[kPropCopyright].toString(),
248 cameraCaps
249 );
250 }
251
252 return true;
253}
254
255GeoMapSource *GeoTiledMappingManagerEngineEsri::mapSource(int mapId) const
256{
257 for (GeoMapSource *mapSource : mapSources()) {
258 if (mapSource->mapId() == mapId)
259 return mapSource;
260 }
261
262 return nullptr;
263}
264
265QT_END_NAMESPACE
static const QString kParamMaximumZoomLevel(kPrefixMapping+QStringLiteral("maximumZoomLevel"))
static const QString kPropCopyright(QStringLiteral("copyrightText"))
static const QString kPropMapSources(QStringLiteral("mapSources"))
static const QString kParamUserAgent(kPrefixEsri+QStringLiteral("useragent"))
static const QString kPropNight(QStringLiteral("night"))
static const QString kParamToken(kPrefixEsri+QStringLiteral("token"))
static const QString kPropName(QStringLiteral("name"))
static QT_BEGIN_NAMESPACE const QString kPrefixEsri(QStringLiteral("esri."))
static const QString kParamMinimumZoomLevel(kPrefixMapping+QStringLiteral("minimumZoomLevel"))
static const QString kPropMapId(QStringLiteral("mapId"))
static const QString kPrefixMapping(kPrefixEsri+QStringLiteral("mapping."))
static const QString kPropMobile(QStringLiteral("mobile"))
static const QString kPropStyle(QStringLiteral("style"))
static const QString kPropUrl(QStringLiteral("url"))
static const QString kPropDescription(QStringLiteral("description"))