16static void setSSL(QGeoMapType &mapType,
bool isHTTPS)
18 QVariantMap metadata = mapType.metadata();
19 metadata[
"isHTTPS"] = isHTTPS;
21 mapType = QGeoMapType(mapType.style(), mapType.name(), mapType.description(), mapType.mobile(),
22 mapType.night(), mapType.mapId(), mapType.pluginName(), mapType.cameraCapabilities(),
222 m_cameraCapabilities.setMinimumZoomLevel(minimumZoomLevel());
223 m_cameraCapabilities.setMaximumZoomLevel(maximumZoomLevel());
225 m_mapType = QGeoMapType(m_mapType.style(), m_mapType.name(), m_mapType.description(), m_mapType.mobile(),
226 m_mapType.night(), m_mapType.mapId(), m_mapType.pluginName(), m_cameraCapabilities,
227 m_mapType.metadata());
268TileProvider::TileProvider(
const QUrl &urlRedirector,
bool highDpi)
269: m_status(Idle), m_urlRedirector(urlRedirector), m_nm(
nullptr), m_timestamp(defaultTs), m_highDpi(highDpi)
271 if (!m_urlRedirector.isValid())
275TileProvider::TileProvider(
const QString &urlTemplate,
276 const QString &format,
277 const QString ©RightMap,
278 const QString ©RightData,
280 int minimumZoomLevel,
281 int maximumZoomLevel)
282: m_status(Invalid), m_nm(
nullptr), m_urlTemplate(urlTemplate),
283 m_format(format), m_copyRightMap(copyRightMap), m_copyRightData(copyRightData),
284 m_minimumZoomLevel(minimumZoomLevel), m_maximumZoomLevel(maximumZoomLevel), m_timestamp(defaultTs), m_highDpi(highDpi)
293void TileProvider::resolveProvider()
304 m_status = Resolving;
308 QNetworkRequest request;
309 request.setHeader(QNetworkRequest::UserAgentHeader, QByteArrayLiteral(
"QGeoTileFetcherOsm"));
310 request.setUrl(m_urlRedirector);
311 request.setAttribute(QNetworkRequest::BackgroundRequestAttribute,
true);
312 request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
313 QNetworkReply *reply = m_nm->get(request);
314 connect(reply, &QNetworkReply::finished,
315 this, &TileProvider::onNetworkReplyFinished);
316 connect(reply, &QNetworkReply::errorOccurred,
317 this, &TileProvider::onNetworkReplyError);
320void TileProvider::handleError(QNetworkReply::NetworkError error)
323 case QNetworkReply::ConnectionRefusedError:
324 case QNetworkReply::TooManyRedirectsError:
325 case QNetworkReply::InsecureRedirectError:
326 case QNetworkReply::ContentAccessDenied:
327 case QNetworkReply::ContentOperationNotPermittedError:
328 case QNetworkReply::ContentNotFoundError:
329 case QNetworkReply::AuthenticationRequiredError:
330 case QNetworkReply::ContentGoneError:
331 case QNetworkReply::OperationNotImplementedError:
332 case QNetworkReply::ServiceUnavailableError:
343void TileProvider::onNetworkReplyFinished()
345 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
346 reply->deleteLater();
356 emit resolutionFinished(
this);
360 QObject errorEmitter;
361 QMetaObject::Connection errorEmitterConnection =
362 connect(&errorEmitter, &QObject::destroyed,
this, [
this](){
this->resolutionError(
this); });
364 if (reply->error() != QNetworkReply::NoError) {
365 handleError(reply->error());
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
420 QJsonParseError error;
421 QJsonDocument d = QJsonDocument::fromJson(reply->readAll(), &error);
422 if (error.error != QJsonParseError::NoError) {
423 qWarning() <<
"QGeoTileProviderOsm: Error parsing redirection data: "<<error.errorString() <<
"at "<<m_urlRedirector;
427 qWarning() <<
"QGeoTileProviderOsm: Invalid redirection data" <<
"at "<<m_urlRedirector;
430 const QJsonObject json = d.object();
431 const QJsonValue urlTemplate = json.value(QLatin1String(
"UrlTemplate"));
432 const QJsonValue imageFormat = json.value(QLatin1String(
"ImageFormat"));
433 const QJsonValue copyRightMap = json.value(QLatin1String(
"MapCopyRight"));
434 const QJsonValue copyRightData = json.value(QLatin1String(
"DataCopyRight"));
435 if ( urlTemplate == QJsonValue::Undefined
436 || imageFormat == QJsonValue::Undefined
437 || copyRightMap == QJsonValue::Undefined
438 || copyRightData == QJsonValue::Undefined
439 || !urlTemplate.isString()
440 || !imageFormat.isString()
441 || !copyRightMap.isString()
442 || !copyRightData.isString()) {
443 qWarning() <<
"QGeoTileProviderOsm: Incomplete redirection data" <<
"at "<<m_urlRedirector;
447 m_urlTemplate = urlTemplate.toString();
448 m_format = imageFormat.toString();
449 m_copyRightMap = copyRightMap.toString();
450 m_copyRightData = copyRightData.toString();
452 const QJsonValue enabled = json.value(QLatin1String(
"Enabled"));
453 if (enabled.isBool() && ! enabled.toBool()) {
454 qWarning() <<
"QGeoTileProviderOsm: Tileserver disabled" <<
"at "<<m_urlRedirector;
458 const QJsonValue copyRightStyle = json.value(QLatin1String(
"StyleCopyRight"));
459 if (copyRightStyle != QJsonValue::Undefined && copyRightStyle.isString())
460 m_copyRightStyle = copyRightStyle.toString();
462 m_minimumZoomLevel = 0;
463 m_maximumZoomLevel = 20;
464 const QJsonValue minZoom = json.value(QLatin1String(
"MinimumZoomLevel"));
465 if (minZoom.isDouble())
466 m_minimumZoomLevel = qBound(0,
int(minZoom.toDouble()),
maxValidZoom);
467 const QJsonValue maxZoom = json.value(QLatin1String(
"MaximumZoomLevel"));
468 if (maxZoom.isDouble())
469 m_maximumZoomLevel = qBound(0,
int(maxZoom.toDouble()),
maxValidZoom);
471 const QJsonValue ts = json.value(QLatin1String(
"Timestamp"));
473 m_timestamp = QDateTime::fromString(ts.toString(), Qt::ISODate);
477 QObject::disconnect(errorEmitterConnection);
478 emit resolutionFinished(
this);
492void TileProvider::setupProvider()
494 if (m_urlTemplate.isEmpty())
497 if (m_format.isEmpty())
500 if (m_minimumZoomLevel < 0 || m_minimumZoomLevel > 30)
503 if (m_maximumZoomLevel < 0 || m_maximumZoomLevel > 30 || m_maximumZoomLevel < m_minimumZoomLevel)
508 offset[0] = m_urlTemplate.indexOf(QLatin1String(
"%x"));
512 offset[1] = m_urlTemplate.indexOf(QLatin1String(
"%y"));
516 offset[2] = m_urlTemplate.indexOf(QLatin1String(
"%z"));
520 int sortedOffsets[3];
521 std::copy(offset, offset + 3, sortedOffsets);
522 sort2(sortedOffsets[0]
,sortedOffsets[1]
);
523 sort2(sortedOffsets[1]
,sortedOffsets[2]
);
524 sort2(sortedOffsets[0]
,sortedOffsets[1]
);
526 int min = sortedOffsets[0];
527 int max = sortedOffsets[2];
528 int mid = sortedOffsets[1];
531 for (
int i=0; i<3; i++) {
532 if (offset[0] == sortedOffsets[i])
534 else if (offset[1] == sortedOffsets[i])
540 m_urlPrefix = m_urlTemplate.mid(0 , min);
541 m_urlSuffix = m_urlTemplate.mid(max + 2, m_urlTemplate.size() - max - 2);
543 paramsSep[0] = m_urlTemplate.mid(min + 2, mid - min - 2);
544 paramsSep[1] = m_urlTemplate.mid(mid + 2, max - mid - 2);
618QUrl TileProvider::tileAddress(
int x,
int y,
int z)
const
620 if (z < m_minimumZoomLevel || z > m_maximumZoomLevel)
622 int params[3] = { x, y, z};
625 url += QString::number(params[paramsLUT[0]]);
627 url += QString::number(params[paramsLUT[1]]);
629 url += QString::number(params[paramsLUT[2]]);