Qt 6.x
The Qt SDK
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
5#include "geotiledmap_esri.h"
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."));
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
41 QString *errorString) :
43{
44 QGeoCameraCapabilities cameraCaps;
45
46 double minimumZoomLevel = 0;
47 double maximumZoomLevel = 19;
48
50 minimumZoomLevel = parameters[kParamMinimumZoomLevel].toDouble();
51
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(
76 mapSource->name(),
81 "esri",
82 cameraCaps);
83 }
84
85 setSupportedMapTypes(mapTypes);
86
88
91
94
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
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"))
114 else
116 } else {
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)
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"))
133 else
135 } else {
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)
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"))
152 else
154 } else {
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)
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"))
169 else if (prefetchingMode == QStringLiteral("OneNeighbourLayer"))
171 else if (prefetchingMode == QStringLiteral("NoPrefetching"))
173 }
174
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)) {
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()) {
222 *errorString = QString("%1JSON error: %2, offset: %3, details: %4")
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(
245 mapId,
248 cameraCaps
249 );
250 }
251
252 return true;
253}
254
256{
258 if (mapSource->mapId() == mapId)
259 return mapSource;
260 }
261
262 return nullptr;
263}
264
static QGeoMapType::MapStyle mapStyle(const QString &styleString)
static QString toFormat(const QString &url)
GeoTiledMappingManagerEngineEsri(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString)
const QList< GeoMapSource * > & mapSources() const
virtual void setMaxDiskUsage(int diskUsage)
static QString baseLocationCacheDirectory()
virtual void setMaxMemoryUsage(int memoryUsage)
virtual void setCostStrategyDisk(CostStrategy costStrategy)=0
virtual void setCostStrategyMemory(CostStrategy costStrategy)=0
virtual void setCostStrategyTexture(CostStrategy costStrategy)=0
virtual void setExtraTextureUsage(int textureUsage)=0
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qfile.h:93
void setSupportsBearing(bool supportsBearing)
Sets whether the associated plugin can render a map when the camera has an arbitrary bearing to suppo...
void setMaximumZoomLevel(double maximumZoomLevel)
void setMaximumTilt(double maximumTilt)
void setMaximumFieldOfView(double maximumFieldOfView)
void setMinimumFieldOfView(double minimumFieldOfView)
void setOverzoomEnabled(bool overzoomEnabled)
Sets whether overzooming is supported by the associated plugin.
void setMinimumTilt(double minimumTilt)
void setMinimumZoomLevel(double minimumZoomLevel)
void setSupportsTilting(bool supportsTilting)
Sets whether the associated plugin can render a map when the camera is tilted to supportsTilting.
QML_STRUCTURED_VALUEMapStyle style
int mapId() const
QString description
void setCameraCapabilities(const QGeoCameraCapabilities &capabilities)
void setSupportedMapTypes(const QList< QGeoMapType > &supportedMapTypes)
Sets the list of map types supported by this engine to mapTypes.
QVariantMap parameters() const
Error
Describes an error related to the loading and setup of a service provider plugin.
void setTileFetcher(QGeoTileFetcher *fetcher)
Sets the tile fetcher.
void setTileCache(QAbstractGeoTileCache *cache)
Sets the tile cache.
\inmodule QtCore\reentrant
QJsonObject object() const
Returns the QJsonObject contained in the document.
bool isObject() const
Returns true if the document contains an object.
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
QVariantMap toVariantMap() const
Converts this object to a QVariantMap.
Definition qlist.h:74
qsizetype count() const noexcept
Definition qlist.h:387
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:356
bool contains(const Key &key) const
Definition qmap.h:340
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
QByteArray toLatin1() const &
Definition qstring.h:559
int toInt(bool *ok=nullptr, int base=10) const
Returns the string converted to an int using base base, which is 10 by default and must be between 2 ...
Definition qstring.h:660
void clear()
Clears the contents of the string and makes it null.
Definition qstring.h:1107
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
Definition qstring.cpp:8606
QString toLower() const &
Definition qstring.h:368
\inmodule QtCore
Definition qvariant.h:64
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
QMap< QString, QString > map
[6]
qDeleteAll(list.begin(), list.end())
static const QString kParamUserAgent(kPrefixEsri+QStringLiteral("useragent"))
static const QString kParamToken(kPrefixEsri+QStringLiteral("token"))
static const QString kParamMaximumZoomLevel(kPrefixMapping+QStringLiteral("maximumZoomLevel"))
static const QString kPropNight(QStringLiteral("night"))
static const QString kPropMapId(QStringLiteral("mapId"))
static const QString kPropName(QStringLiteral("name"))
static const QString kPropDescription(QStringLiteral("description"))
static const QString kParamUserAgent(kPrefixEsri+QStringLiteral("useragent"))
static const QString kPropStyle(QStringLiteral("style"))
static const QString kPropUrl(QStringLiteral("url"))
static const QString kPropMobile(QStringLiteral("mobile"))
static const QString kParamToken(kPrefixEsri+QStringLiteral("token"))
static const QString kPropCopyright(QStringLiteral("copyrightText"))
static QT_BEGIN_NAMESPACE const QString kPrefixEsri(QStringLiteral("esri."))
static const QString kParamMinimumZoomLevel(kPrefixMapping+QStringLiteral("minimumZoomLevel"))
static const QString kPrefixMapping(kPrefixEsri+QStringLiteral("mapping."))
static const QString kPropMapSources(QStringLiteral("mapSources"))
Combined button and popup list for selecting options.
Q_MULTIMEDIA_EXPORT QString errorString(HRESULT hr)
#define Q_FUNC_INFO
DBusConnection const char DBusError * error
static quint64 cacheSize()
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
char * toString(const MyType &t)
[31]
\inmodule QtCore\reentrant
ParseError error
QString errorString() const
\variable QJsonParseError::error
QT_BEGIN_NAMESPACE bool toBool(const QString &str)
Definition utils.h:14