blob: 5cbde041a3b8ff5917fbdb892455f3cd00f992b0 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2017 Mapbox, Inc.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qgeomappingmanagerenginemapboxgl.h"
#include "qgeomapmapboxgl.h"
#include <QtCore/qstandardpaths.h>
#include <QtLocation/private/qabstractgeotilecache_p.h>
#include <QtLocation/private/qgeocameracapabilities_p.h>
#include <QtLocation/private/qgeomaptype_p.h>
#include <QDir>
QT_BEGIN_NAMESPACE
QGeoMappingManagerEngineMapboxGL::QGeoMappingManagerEngineMapboxGL(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString)
: QGeoMappingManagerEngine()
{
*error = QGeoServiceProvider::NoError;
errorString->clear();
QGeoCameraCapabilities cameraCaps;
cameraCaps.setMinimumZoomLevel(0.0);
cameraCaps.setMaximumZoomLevel(20.0);
cameraCaps.setTileSize(512);
cameraCaps.setSupportsBearing(true);
cameraCaps.setSupportsTilting(true);
cameraCaps.setMinimumTilt(0);
cameraCaps.setMaximumTilt(60);
cameraCaps.setMinimumFieldOfView(36.87);
cameraCaps.setMaximumFieldOfView(36.87);
setCameraCapabilities(cameraCaps);
QList<QGeoMapType> mapTypes;
int mapId = 0;
const QByteArray pluginName = "mapboxgl";
if (parameters.contains(QStringLiteral("mapboxgl.china"))) {
m_useChinaEndpoint = parameters.value(QStringLiteral("mapboxgl.china")).toBool();
}
QVariantMap metadata;
metadata["isHTTPS"] = true;
if (m_useChinaEndpoint) {
m_settings.setApiBaseUrl(QStringLiteral("https://api.mapbox.cn"));
mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-zh-v1"),
tr("China Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-zh-v1"),
tr("China Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-zh-v1"),
tr("China Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
} else {
mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-v10"),
tr("Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/basic-v9"),
tr("Basic"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/bright-v9"),
tr("Bright"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::TerrainMap, QStringLiteral("mapbox://styles/mapbox/outdoors-v10"),
tr("Outdoors"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, QStringLiteral("mapbox://styles/mapbox/satellite-v9"),
tr("Satellite"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::HybridMap, QStringLiteral("mapbox://styles/mapbox/satellite-streets-v10"),
tr("Satellite Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-v9"),
tr("Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-v9"),
tr("Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-day-v2"),
tr("Navigation Preview Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-night-v2"),
tr("Navigation Preview Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-day-v2"),
tr("Navigation Guidance Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-night-v2"),
tr("Navigation Guidance Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
}
if (parameters.contains(QStringLiteral("mapboxgl.mapping.additional_style_urls"))) {
const QString ids = parameters.value(QStringLiteral("mapboxgl.mapping.additional_style_urls")).toString();
const QStringList idList = ids.split(',', QString::SkipEmptyParts);
for (auto it = idList.crbegin(), end = idList.crend(); it != end; ++it) {
if ((*it).isEmpty())
continue;
if ((*it).startsWith(QStringLiteral("http:")))
metadata["isHTTPS"] = false;
else
metadata["isHTTPS"] = true;
mapTypes.prepend(QGeoMapType(QGeoMapType::CustomMap, *it,
tr("User provided style"), false, false, ++mapId, pluginName, cameraCaps, metadata));
}
}
setSupportedMapTypes(mapTypes);
if (parameters.contains(QStringLiteral("mapboxgl.access_token"))) {
m_settings.setAccessToken(parameters.value(QStringLiteral("mapboxgl.access_token")).toString());
}
bool memoryCache = false;
if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.memory"))) {
memoryCache = parameters.value(QStringLiteral("mapboxgl.mapping.cache.memory")).toBool();
m_settings.setCacheDatabasePath(QStringLiteral(":memory:"));
}
QString cacheDirectory;
if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.directory"))) {
cacheDirectory = parameters.value(QStringLiteral("mapboxgl.mapping.cache.directory")).toString();
} else {
cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + QStringLiteral("mapboxgl/");
}
if (!memoryCache && QDir::root().mkpath(cacheDirectory)) {
m_settings.setCacheDatabasePath(cacheDirectory + "/mapboxgl.db");
}
if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.size"))) {
bool ok = false;
int cacheSize = parameters.value(QStringLiteral("mapboxgl.mapping.cache.size")).toString().toInt(&ok);
if (ok)
m_settings.setCacheDatabaseMaximumSize(cacheSize);
}
if (parameters.contains(QStringLiteral("mapboxgl.mapping.use_fbo"))) {
m_useFBO = parameters.value(QStringLiteral("mapboxgl.mapping.use_fbo")).toBool();
}
if (parameters.contains(QStringLiteral("mapboxgl.mapping.items.insert_before"))) {
m_mapItemsBefore = parameters.value(QStringLiteral("mapboxgl.mapping.items.insert_before")).toString();
}
engineInitialized();
}
QGeoMappingManagerEngineMapboxGL::~QGeoMappingManagerEngineMapboxGL()
{
}
QGeoMap *QGeoMappingManagerEngineMapboxGL::createMap()
{
QGeoMapMapboxGL* map = new QGeoMapMapboxGL(this, 0);
map->setMapboxGLSettings(m_settings, m_useChinaEndpoint);
map->setUseFBO(m_useFBO);
map->setMapItemsBefore(m_mapItemsBefore);
return map;
}
QT_END_NAMESPACE