Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qgeotiledmappingmanagerengineosm.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Aaron McCarthy <mccarthy.aaron@gmail.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include "qgeotiledmaposm.h"
8
9#include <QtLocation/private/qgeocameracapabilities_p.h>
10#include <QtLocation/private/qgeomaptype_p.h>
11#include <QtLocation/private/qgeotiledmap_p.h>
12#include <QtLocation/private/qgeofiletilecache_p.h>
13
14#include <QtNetwork/QNetworkAccessManager>
15#include <QtNetwork/QNetworkDiskCache>
16
18
21{
22 QGeoCameraCapabilities cameraCaps;
23 cameraCaps.setMinimumZoomLevel(0.0);
24 cameraCaps.setMaximumZoomLevel(19.0);
25 cameraCaps.setSupportsBearing(true);
26 cameraCaps.setSupportsTilting(true);
27 cameraCaps.setMinimumTilt(0);
28 cameraCaps.setMaximumTilt(80);
29 cameraCaps.setMinimumFieldOfView(20.0);
30 cameraCaps.setMaximumFieldOfView(120.0);
31 cameraCaps.setOverzoomEnabled(true);
32 setCameraCapabilities(cameraCaps);
33
34 setTileSize(QSize(256, 256));
35
36 const QByteArray pluginName = "osm";
37 if (parameters.contains(QStringLiteral("osm.mapping.cache.directory"))) {
38 m_cacheDirectory = parameters.value(QStringLiteral("osm.mapping.cache.directory")).toString();
39 } else {
40 // managerName() is not yet set, we have to hardcode the plugin name below
42 }
43 QNetworkAccessManager *nmCached = new QNetworkAccessManager(this);
45 diskCache->setCacheDirectory(m_cacheDirectory + QLatin1String("/providers"));
46 diskCache->setMaximumCacheSize(100000000000); // enough to prevent diskCache to fiddle with tile cache. it's anyway used only for providers.
47 nmCached->setCache(diskCache);
48
49 QNetworkAccessManager *nm = new QNetworkAccessManager(); // Gets owned by QGeoTileFetcherOsm
50 QString domain = QStringLiteral("http://maps-redirect.qt.io/osm/5.8/");
51 if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.address"))) {
52 QString customAddress = parameters.value(QStringLiteral("osm.mapping.providersrepository.address")).toString();
53 // Allowing some malformed addresses
54 if (customAddress.indexOf(QStringLiteral(":")) < 0) // defaulting to http:// if no prefix is found
55 customAddress = QStringLiteral("http://") + customAddress;
56 if (customAddress[customAddress.length()-1] != QLatin1Char('/'))
57 customAddress += QLatin1Char('/');
58 if (QUrl(customAddress).isValid())
59 domain = customAddress;
60 else
61 qWarning() << "Invalid custom providers repository address: " << customAddress;
62 }
63
64 bool highdpi = false;
65 if (parameters.contains(QStringLiteral("osm.mapping.highdpi_tiles"))) {
66 const QString param = parameters.value(QStringLiteral("osm.mapping.highdpi_tiles")).toString().toLower();
67 if (param == "true")
68 highdpi = true;
69 }
70
71 /* TileProviders setup */
72 QList<TileProvider *> providers_street;
73 QList<TileProvider *> providers_satellite;
74 QList<TileProvider *> providers_cycle;
75 QList<TileProvider *> providers_transit;
76 QList<TileProvider *> providers_nighttransit;
77 QList<TileProvider *> providers_terrain;
78 QList<TileProvider *> providers_hiking;
79 if (highdpi) {
80 providers_street.push_back(new TileProvider(domain + "street-hires", true));
81 providers_satellite.push_back(new TileProvider(domain + "satellite-hires", true));
82 providers_cycle.push_back(new TileProvider(domain + "cycle-hires", true));
83 providers_transit.push_back(new TileProvider(domain + "transit-hires", true));
84 providers_nighttransit.push_back(new TileProvider(domain + "night-transit-hires", true));
85 providers_terrain.push_back(new TileProvider(domain + "terrain-hires", true));
86 providers_hiking.push_back(new TileProvider(domain + "hiking-hires", true));
87 }
88 providers_street.push_back(new TileProvider(domain + "street"));
89 providers_satellite.push_back(new TileProvider(domain + "satellite"));
90 providers_cycle.push_back(new TileProvider(domain + "cycle"));
91 providers_transit.push_back(new TileProvider(domain + "transit"));
92 providers_nighttransit.push_back(new TileProvider(domain + "night-transit"));
93 providers_terrain.push_back(new TileProvider(domain + "terrain"));
94 providers_hiking.push_back(new TileProvider(domain + "hiking"));
95 // Backups
96 const QDateTime defaultTs = QDateTime::fromString(QStringLiteral("2016-06-01T00:00:00"), Qt::ISODate);
97 providers_street.push_back(
98 new TileProvider(QStringLiteral("http://c.tile.openstreetmap.org/%z/%x/%y.png"),
99 QStringLiteral("png"),
100 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap.org</a>"),
101 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")));
102 providers_street.back()->setTimestamp(defaultTs);
103
104 // No available open access satellite backup with satisfactory level of details at the present.
105
106 providers_cycle.push_back(
107 new TileProvider(QStringLiteral("http://c.tile.opencyclemap.org/cycle/%z/%x/%y.png"),
108 QStringLiteral("png"),
109 QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"),
110 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")));
111 providers_cycle.back()->setTimestamp(defaultTs);
112
113 providers_transit.push_back(
114 new TileProvider(QStringLiteral("http://c.tile2.opencyclemap.org/transport/%z/%x/%y.png"),
115 QStringLiteral("png"),
116 QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"),
117 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")));
118 providers_transit.back()->setTimestamp(defaultTs);
119
120 providers_nighttransit.push_back(
121 new TileProvider(QStringLiteral("http://a.tile.thunderforest.com/transport-dark/%z/%x/%y.png"),
122 QStringLiteral("png"),
123 QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"),
124 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")) );
125 providers_nighttransit.back()->setTimestamp(defaultTs);
126
127 providers_terrain.push_back(
128 new TileProvider(QStringLiteral("http://a.tile.thunderforest.com/landscape/%z/%x/%y.png"),
129 QStringLiteral("png"),
130 QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"),
131 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")));
132 providers_terrain.back()->setTimestamp(defaultTs);
133
134 providers_hiking.push_back(
135 new TileProvider(QStringLiteral("http://a.tile.thunderforest.com/outdoors/%z/%x/%y.png"),
136 QStringLiteral("png"),
137 QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"),
138 QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors")));
139 providers_hiking.back()->setTimestamp(defaultTs);
140
141
142 /* QGeoTileProviderOsms setup */
143 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
144 QGeoMapType(QGeoMapType::StreetMap, tr("Street Map"), tr("Street map view in daylight mode"), false, false, 1, pluginName, cameraCaps),
145 providers_street, cameraCaps ));
146 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
147 QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in daylight mode"), false, false, 2, pluginName, cameraCaps),
148 providers_satellite, cameraCaps ));
149 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
150 QGeoMapType(QGeoMapType::CycleMap, tr("Cycle Map"), tr("Cycle map view in daylight mode"), false, false, 3, pluginName, cameraCaps),
151 providers_cycle, cameraCaps ));
152 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
153 QGeoMapType(QGeoMapType::TransitMap, tr("Transit Map"), tr("Public transit map view in daylight mode"), false, false, 4, pluginName, cameraCaps),
154 providers_transit, cameraCaps ));
155 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
156 QGeoMapType(QGeoMapType::TransitMap, tr("Night Transit Map"), tr("Public transit map view in night mode"), false, true, 5, pluginName, cameraCaps),
157 providers_nighttransit, cameraCaps ));
158 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
159 QGeoMapType(QGeoMapType::TerrainMap, tr("Terrain Map"), tr("Terrain map view"), false, false, 6, pluginName, cameraCaps),
160 providers_terrain, cameraCaps ));
161 m_providers.push_back( new QGeoTileProviderOsm( nmCached,
162 QGeoMapType(QGeoMapType::PedestrianMap, tr("Hiking Map"), tr("Hiking map view"), false, false, 7, pluginName, cameraCaps),
163 providers_hiking, cameraCaps ));
164
165 if (parameters.contains(QStringLiteral("osm.mapping.custom.host"))
166 || parameters.contains(QStringLiteral("osm.mapping.host"))) {
167 // Adding a custom provider
168 QString tmsServer;
169 if (parameters.contains(QStringLiteral("osm.mapping.host")))
170 tmsServer = parameters.value(QStringLiteral("osm.mapping.host")).toString();
171 if (parameters.contains(QStringLiteral("osm.mapping.custom.host"))) // priority to the new one
172 tmsServer = parameters.value(QStringLiteral("osm.mapping.custom.host")).toString();
173
174 QString mapCopyright;
175 QString dataCopyright;
176 if (parameters.contains(QStringLiteral("osm.mapping.custom.mapcopyright")))
177 mapCopyright = parameters.value(QStringLiteral("osm.mapping.custom.mapcopyright")).toString();
178 if (parameters.contains(QStringLiteral("osm.mapping.custom.datacopyright")))
179 dataCopyright = parameters.value(QStringLiteral("osm.mapping.custom.datacopyright")).toString();
180
181 if (parameters.contains(QStringLiteral("osm.mapping.copyright")))
182 m_customCopyright = parameters.value(QStringLiteral("osm.mapping.copyright")).toString();
183
184 if (!tmsServer.endsWith(".png"))
185 tmsServer += QStringLiteral("%z/%x/%y.png");
186 m_providers.push_back(
187 new QGeoTileProviderOsm( nmCached,
188 QGeoMapType(QGeoMapType::CustomMap, tr("Custom URL Map"), tr("Custom url map view set via urlprefix parameter"), false, false, 8, pluginName, cameraCaps),
189 { new TileProvider(tmsServer,
190 QStringLiteral("png"),
191 mapCopyright,
192 dataCopyright) }, cameraCaps
193 ));
194
195 m_providers.last()->disableRedirection();
196 }
197
198 bool disableRedirection = false;
199 if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.disabled")))
200 disableRedirection = parameters.value(QStringLiteral("osm.mapping.providersrepository.disabled")).toBool();
201
202 for (QGeoTileProviderOsm * provider: std::as_const(m_providers)) {
203 // Providers are parented inside QGeoFileTileCacheOsm, as they are used in its destructor.
204 if (disableRedirection) {
205 provider->disableRedirection();
206 } else {
211 }
212 }
214
215
216 /* TILE CACHE */
217 if (parameters.contains(QStringLiteral("osm.mapping.offline.directory")))
218 m_offlineDirectory = parameters.value(QStringLiteral("osm.mapping.offline.directory")).toString();
219 QGeoFileTileCacheOsm *tileCache = new QGeoFileTileCacheOsm(m_providers, m_offlineDirectory, m_cacheDirectory);
220
221 /*
222 * Disk cache setup -- defaults to ByteSize (old behavior)
223 */
224 if (parameters.contains(QStringLiteral("osm.mapping.cache.disk.cost_strategy"))) {
225 QString cacheStrategy = parameters.value(QStringLiteral("osm.mapping.cache.disk.cost_strategy")).toString().toLower();
226 if (cacheStrategy == QLatin1String("bytesize"))
228 else
230 } else {
232 }
233 if (parameters.contains(QStringLiteral("osm.mapping.cache.disk.size"))) {
234 bool ok = false;
235 int cacheSize = parameters.value(QStringLiteral("osm.mapping.cache.disk.size")).toString().toInt(&ok);
236 if (ok)
238 }
239
240 /*
241 * Memory cache setup -- defaults to ByteSize (old behavior)
242 */
243 if (parameters.contains(QStringLiteral("osm.mapping.cache.memory.cost_strategy"))) {
244 QString cacheStrategy = parameters.value(QStringLiteral("osm.mapping.cache.memory.cost_strategy")).toString().toLower();
245 if (cacheStrategy == QLatin1String("bytesize"))
247 else
249 } else {
251 }
252 if (parameters.contains(QStringLiteral("osm.mapping.cache.memory.size"))) {
253 bool ok = false;
254 int cacheSize = parameters.value(QStringLiteral("osm.mapping.cache.memory.size")).toString().toInt(&ok);
255 if (ok)
257 }
258
259 /*
260 * Texture cache setup -- defaults to ByteSize (old behavior)
261 */
262 if (parameters.contains(QStringLiteral("osm.mapping.cache.texture.cost_strategy"))) {
263 QString cacheStrategy = parameters.value(QStringLiteral("osm.mapping.cache.texture.cost_strategy")).toString().toLower();
264 if (cacheStrategy == QLatin1String("bytesize"))
266 else
268 } else {
270 }
271 if (parameters.contains(QStringLiteral("osm.mapping.cache.texture.size"))) {
272 bool ok = false;
273 int cacheSize = parameters.value(QStringLiteral("osm.mapping.cache.texture.size")).toString().toInt(&ok);
274 if (ok)
276 }
277
278
280
281
282 /* TILE FETCHER */
283 QGeoTileFetcherOsm *tileFetcher = new QGeoTileFetcherOsm(m_providers, nm, this);
284 if (parameters.contains(QStringLiteral("osm.useragent"))) {
285 const QByteArray ua = parameters.value(QStringLiteral("osm.useragent")).toString().toLatin1();
286 tileFetcher->setUserAgent(ua);
287 }
289
290 /* PREFETCHING */
291 if (parameters.contains(QStringLiteral("osm.mapping.prefetching_style"))) {
292 const QString prefetchingMode = parameters.value(QStringLiteral("osm.mapping.prefetching_style")).toString();
293 if (prefetchingMode == QStringLiteral("TwoNeighbourLayers"))
295 else if (prefetchingMode == QStringLiteral("OneNeighbourLayer"))
297 else if (prefetchingMode == QStringLiteral("NoPrefetching"))
299 }
300
302 errorString->clear();
303}
304
306{
307}
308
310{
311 QGeoTiledMap *map = new QGeoTiledMapOsm(this);
312 connect(qobject_cast<QGeoFileTileCacheOsm *>(tileCache()), &QGeoFileTileCacheOsm::mapDataUpdated
314 map->setPrefetchStyle(m_prefetchStyle);
315 return map;
316}
317
319{
320 return m_providers;
321}
322
324{
325 return m_customCopyright;
326}
327
329{
330 if (!provider->isResolved())
331 return;
333}
334
336{
337 if (!provider->isResolved())
338 return;
340}
341
343{
344 QList<QGeoMapType> mapTypes;
345 for (QGeoTileProviderOsm * provider : m_providers) {
346 // assume provider are ok until they have been resolved invalid
347 if (!provider->isResolved() || provider->isValid())
348 mapTypes << provider->mapType();
349 }
350 const QList<QGeoMapType> currentlySupportedMapTypes = supportedMapTypes();
351 if (currentlySupportedMapTypes != mapTypes)
352 // See map type implementations in QGeoTiledMapOsm and QGeoTileFetcherOsm.
353 setSupportedMapTypes(mapTypes);
354}
355
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\reentrant
Definition qdatetime.h:257
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.
void mapDataUpdated(int mapId)
void setCameraCapabilities(const QGeoCameraCapabilities &capabilities)
QList< QGeoMapType > supportedMapTypes() const
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 resolutionFinished(const QGeoTileProviderOsm *provider)
void resolutionError(const QGeoTileProviderOsm *provider)
virtual void clearScene(int mapId)
QGeoTiledMappingManagerEngineOsm(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString)
const QList< QGeoTileProviderOsm * > & providers()
void onProviderResolutionFinished(const QGeoTileProviderOsm *provider)
void onProviderResolutionError(const QGeoTileProviderOsm *provider)
void setTileFetcher(QGeoTileFetcher *fetcher)
Sets the tile fetcher.
void setTileCache(QAbstractGeoTileCache *cache)
Sets the tile cache.
Definition qlist.h:74
T & last()
Definition qlist.h:631
reference back()
Definition qlist.h:686
void push_back(parameter_type t)
Definition qlist.h:672
T value(const Key &key, const T &defaultValue=T()) const
Definition qmap.h:356
bool contains(const Key &key) const
Definition qmap.h:340
The QNetworkAccessManager class allows the application to send network requests and receive replies.
void setCache(QAbstractNetworkCache *cache)
The QNetworkDiskCache class provides a very basic disk cache.
void setCacheDirectory(const QString &cacheDir)
Sets the directory where cached files will be stored to cacheDir.
void setMaximumCacheSize(qint64 size)
Sets the maximum size of the disk cache to be size.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
\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
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5350
QString toLower() const &
Definition qstring.h:368
static QString static QString qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition qstring.cpp:4420
qsizetype length() const
Returns the number of characters in this string.
Definition qstring.h:187
\inmodule QtCore
Definition qurl.h:94
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]
Combined button and popup list for selecting options.
@ ISODate
DBusConnection const char DBusError * error
static const QDateTime defaultTs
#define qWarning
Definition qlogging.h:162
GLenum const GLint * param
static quint64 cacheSize()
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
#define tr(X)
QNetworkDiskCache * diskCache
\inmodule QtCore \reentrant
Definition qchar.h:17
QT_BEGIN_NAMESPACE bool toBool(const QString &str)
Definition utils.h:14