Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
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
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
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
qsizetype count() const noexcept
Definition qlist.h:398
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:357
bool contains(const Key &key) const
Definition qmap.h:341
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QByteArray toLatin1() const &
Definition qstring.h:630
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:731
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
Definition qstring.cpp:8870
QString toLower() const &
Definition qstring.h:435
\inmodule QtCore
Definition qvariant.h:65
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