Select Git revision
MapProvider.cpp
MapProvider.cpp 3.80 KiB
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include "MapProvider.h"
MapProvider::MapProvider(const QString &referrer, const QString &imageFormat,
const quint32 averageSize, const QGeoMapType::MapStyle mapType, QObject* parent)
: QObject(parent)
, _referrer(referrer)
, _imageFormat(imageFormat)
, _averageSize(averageSize)
, _mapType(mapType)
{
const QStringList langs = QLocale::system().uiLanguages();
if (langs.length() > 0) {
_language = langs[0];
}
}
QNetworkRequest MapProvider::getTileURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) {
//-- Build URL
QNetworkRequest request;
const QString url = _getURL(x, y, zoom, networkManager);
if (url.isEmpty()) {
return request;
}
request.setUrl(QUrl(url));
request.setRawHeader(QByteArrayLiteral("Accept"), QByteArrayLiteral("*/*"));
request.setRawHeader(QByteArrayLiteral("Referrer"), _referrer.toUtf8());
request.setRawHeader(QByteArrayLiteral("User-Agent"), _userAgent);
return request;
}
QString MapProvider::getImageFormat(const QByteArray& image) const {
QString format;
if (image.size() > 2) {
if (image.startsWith(reinterpret_cast<const char*>(pngSignature)))
format = QStringLiteral("png");
else if (image.startsWith(reinterpret_cast<const char*>(jpegSignature)))
format = QStringLiteral("jpg");
else if (image.startsWith(reinterpret_cast<const char*>(gifSignature)))
format = QStringLiteral("gif");
else {
return _imageFormat;
}
}
return format;
}
QString MapProvider::_tileXYToQuadKey(const int tileX, const int tileY, const int levelOfDetail) const {
QString quadKey;
for (int i = levelOfDetail; i > 0; i--) {
char digit = '0';
const int mask = 1 << (i - 1);
if ((tileX & mask) != 0) {
digit++;
}
if ((tileY & mask) != 0) {
digit++;
digit++;
}