1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Copyright (C) 2017 Mapbox, Inc.
5 ** Contact: http://www.qt.io/licensing/
6 **
7 ** This file is part of the QtLocation module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL3$
10 ** Commercial License Usage
11 ** Licensees holding valid commercial Qt licenses may use this file in
12 ** accordance with the commercial license agreement provided with the
13 ** Software or, alternatively, in accordance with the terms contained in
14 ** a written agreement between you and The Qt Company. For licensing terms
15 ** and conditions see http://www.qt.io/terms-conditions. For further
16 ** information use the contact form at http://www.qt.io/contact-us.
17 **
18 ** GNU Lesser General Public License Usage
19 ** Alternatively, this file may be used under the terms of the GNU Lesser
20 ** General Public License version 3 as published by the Free Software
21 ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
22 ** packaging of this file. Please review the following information to
23 ** ensure the GNU Lesser General Public License version 3 requirements
24 ** will be met: https://www.gnu.org/licenses/lgpl.html.
25 **
26 ** GNU General Public License Usage
27 ** Alternatively, this file may be used under the terms of the GNU
28 ** General Public License version 2.0 or later as published by the Free
29 ** Software Foundation and appearing in the file LICENSE.GPL included in
30 ** the packaging of this file. Please review the following information to
31 ** ensure the GNU General Public License version 2.0 requirements will be
32 ** met: http://www.gnu.org/licenses/gpl-2.0.html.
33 **
34 ** $QT_END_LICENSE$
35 **
36 ****************************************************************************/
37
38 #include "qgeomappingmanagerenginemapboxgl.h"
39 #include "qgeomapmapboxgl.h"
40
41 #include <QtCore/qstandardpaths.h>
42 #include <QtLocation/private/qabstractgeotilecache_p.h>
43 #include <QtLocation/private/qgeocameracapabilities_p.h>
44 #include <QtLocation/private/qgeomaptype_p.h>
45
46 #include <QDir>
47
48 QT_BEGIN_NAMESPACE
49
QGeoMappingManagerEngineMapboxGL(const QVariantMap & parameters,QGeoServiceProvider::Error * error,QString * errorString)50 QGeoMappingManagerEngineMapboxGL::QGeoMappingManagerEngineMapboxGL(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString)
51 : QGeoMappingManagerEngine()
52 {
53 *error = QGeoServiceProvider::NoError;
54 errorString->clear();
55
56 QGeoCameraCapabilities cameraCaps;
57 cameraCaps.setMinimumZoomLevel(0.0);
58 cameraCaps.setMaximumZoomLevel(20.0);
59 cameraCaps.setTileSize(512);
60 cameraCaps.setSupportsBearing(true);
61 cameraCaps.setSupportsTilting(true);
62 cameraCaps.setMinimumTilt(0);
63 cameraCaps.setMaximumTilt(60);
64 cameraCaps.setMinimumFieldOfView(36.87);
65 cameraCaps.setMaximumFieldOfView(36.87);
66 setCameraCapabilities(cameraCaps);
67
68 QList<QGeoMapType> mapTypes;
69 int mapId = 0;
70 const QByteArray pluginName = "mapboxgl";
71
72 if (parameters.contains(QStringLiteral("mapboxgl.china"))) {
73 m_useChinaEndpoint = parameters.value(QStringLiteral("mapboxgl.china")).toBool();
74 }
75
76 if (parameters.contains(QStringLiteral("mapboxgl.api_base_url"))) {
77 const QString apiBaseUrl = parameters.value(QStringLiteral("mapboxgl.api_base_url")).toString();
78 m_settings.setApiBaseUrl(apiBaseUrl);
79 }
80
81 QVariantMap metadata;
82 metadata["isHTTPS"] = true;
83
84 if (m_useChinaEndpoint) {
85 m_settings.setApiBaseUrl(QStringLiteral("https://api.mapbox.cn"));
86
87 mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-zh-v1"),
88 tr("China Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
89 mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-zh-v1"),
90 tr("China Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
91 mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-zh-v1"),
92 tr("China Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
93 } else {
94 mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-v10"),
95 tr("Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
96 mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/basic-v9"),
97 tr("Basic"), false, false, ++mapId, pluginName, cameraCaps, metadata);
98 mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/bright-v9"),
99 tr("Bright"), false, false, ++mapId, pluginName, cameraCaps, metadata);
100 mapTypes << QGeoMapType(QGeoMapType::TerrainMap, QStringLiteral("mapbox://styles/mapbox/outdoors-v10"),
101 tr("Outdoors"), false, false, ++mapId, pluginName, cameraCaps, metadata);
102 mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, QStringLiteral("mapbox://styles/mapbox/satellite-v9"),
103 tr("Satellite"), false, false, ++mapId, pluginName, cameraCaps, metadata);
104 mapTypes << QGeoMapType(QGeoMapType::HybridMap, QStringLiteral("mapbox://styles/mapbox/satellite-streets-v10"),
105 tr("Satellite Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
106 mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-v9"),
107 tr("Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
108 mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-v9"),
109 tr("Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
110 mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-day-v2"),
111 tr("Navigation Preview Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
112 mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-night-v2"),
113 tr("Navigation Preview Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
114 mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-day-v2"),
115 tr("Navigation Guidance Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
116 mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-night-v2"),
117 tr("Navigation Guidance Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
118 }
119
120 if (parameters.contains(QStringLiteral("mapboxgl.mapping.additional_style_urls"))) {
121 const QString ids = parameters.value(QStringLiteral("mapboxgl.mapping.additional_style_urls")).toString();
122 const QStringList idList = ids.split(',', Qt::SkipEmptyParts);
123
124 for (auto it = idList.crbegin(), end = idList.crend(); it != end; ++it) {
125 if ((*it).isEmpty())
126 continue;
127 if ((*it).startsWith(QStringLiteral("http:")))
128 metadata["isHTTPS"] = false;
129 else
130 metadata["isHTTPS"] = true;
131
132 mapTypes.prepend(QGeoMapType(QGeoMapType::CustomMap, *it,
133 tr("User provided style"), false, false, ++mapId, pluginName, cameraCaps, metadata));
134 }
135 }
136
137 setSupportedMapTypes(mapTypes);
138
139 if (parameters.contains(QStringLiteral("mapboxgl.access_token"))) {
140 m_settings.setAccessToken(parameters.value(QStringLiteral("mapboxgl.access_token")).toString());
141 }
142
143 bool memoryCache = false;
144 if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.memory"))) {
145 memoryCache = parameters.value(QStringLiteral("mapboxgl.mapping.cache.memory")).toBool();
146 m_settings.setCacheDatabasePath(QStringLiteral(":memory:"));
147 }
148
149 QString cacheDirectory;
150 if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.directory"))) {
151 cacheDirectory = parameters.value(QStringLiteral("mapboxgl.mapping.cache.directory")).toString();
152 } else {
153 cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + QStringLiteral("mapboxgl/");
154 }
155
156 if (!memoryCache && QDir::root().mkpath(cacheDirectory)) {
157 m_settings.setCacheDatabasePath(cacheDirectory + "/mapboxgl.db");
158 }
159
160 if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.size"))) {
161 bool ok = false;
162 int cacheSize = parameters.value(QStringLiteral("mapboxgl.mapping.cache.size")).toString().toInt(&ok);
163
164 if (ok)
165 m_settings.setCacheDatabaseMaximumSize(cacheSize);
166 }
167
168 if (parameters.contains(QStringLiteral("mapboxgl.mapping.use_fbo"))) {
169 m_useFBO = parameters.value(QStringLiteral("mapboxgl.mapping.use_fbo")).toBool();
170 }
171
172 if (parameters.contains(QStringLiteral("mapboxgl.mapping.items.insert_before"))) {
173 m_mapItemsBefore = parameters.value(QStringLiteral("mapboxgl.mapping.items.insert_before")).toString();
174 }
175
176 engineInitialized();
177 }
178
~QGeoMappingManagerEngineMapboxGL()179 QGeoMappingManagerEngineMapboxGL::~QGeoMappingManagerEngineMapboxGL()
180 {
181 }
182
createMap()183 QGeoMap *QGeoMappingManagerEngineMapboxGL::createMap()
184 {
185 QGeoMapMapboxGL* map = new QGeoMapMapboxGL(this, 0);
186 map->setMapboxGLSettings(m_settings, m_useChinaEndpoint);
187 map->setUseFBO(m_useFBO);
188 map->setMapItemsBefore(m_mapItemsBefore);
189
190 return map;
191 }
192
193 QT_END_NAMESPACE
194