19QGeoTiledMap::QGeoTiledMap(QGeoTiledMappingManagerEngine *engine, QObject *parent)
20 : QGeoMap(*
new QGeoTiledMapPrivate(engine), parent)
24 d->m_tileRequests =
new QGeoTileRequestManager(
this, engine);
26 QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
27 this,&QGeoTiledMap::handleTileVersionChanged);
28 QObject::connect(
this, &QGeoMap::cameraCapabilitiesChanged,
this,
29 [d](
const QGeoCameraCapabilities &oldCameraCapabilities) {
30 d->onCameraCapabilitiesChanged(oldCameraCapabilities);
34QGeoTiledMap::QGeoTiledMap(QGeoTiledMapPrivate &dd, QGeoTiledMappingManagerEngine *engine, QObject *parent)
39 d->m_tileRequests =
new QGeoTileRequestManager(
this, engine);
41 QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
42 this,&QGeoTiledMap::handleTileVersionChanged);
43 QObject::connect(
this, &QGeoMap::cameraCapabilitiesChanged,
this,
44 [d](
const QGeoCameraCapabilities &oldCameraCapabilities) {
45 d->onCameraCapabilitiesChanged(oldCameraCapabilities);
148QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine)
149 : QGeoMapPrivate(engine,
new QGeoProjectionWebMercator),
150 m_cache(engine->tileCache()),
151 m_visibleTiles(
new QGeoCameraTiles()),
152 m_prefetchTiles(
new QGeoCameraTiles()),
153 m_mapScene(
new QGeoTiledMapScene()),
154 m_tileRequests(
nullptr),
155 m_maxZoomLevel(
static_cast<
int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()))),
156 m_minZoomLevel(
static_cast<
int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()))),
157 m_prefetchStyle(QGeoTiledMap::PrefetchTwoNeighbourLayers)
159 int tileSize = m_cameraCapabilities.tileSize();
160 QString pluginString(engine->managerName() + QLatin1Char(
'_') + QString::number(engine->managerVersion()));
161 m_visibleTiles->setTileSize(tileSize);
162 m_prefetchTiles->setTileSize(tileSize);
163 m_visibleTiles->setPluginString(pluginString);
164 m_prefetchTiles->setPluginString(pluginString);
165 m_mapScene->setTileSize(tileSize);
180void QGeoTiledMapPrivate::prefetchTiles()
182 if (m_tileRequests && m_prefetchStyle != QGeoTiledMap::NoPrefetching) {
184 QSet<QGeoTileSpec> tiles;
185 QGeoCameraData camera = m_visibleTiles->cameraData();
186 int currentIntZoom =
static_cast<
int>(std::floor(camera.zoomLevel()));
188 m_prefetchTiles->setCameraData(camera);
190 tiles = m_prefetchTiles->createTiles();
192 switch (m_prefetchStyle) {
194 case QGeoTiledMap::PrefetchNeighbourLayer: {
195 double zoomFraction = camera.zoomLevel() - currentIntZoom;
196 int nearestNeighbourLayer = zoomFraction > 0.5 ? currentIntZoom + 1 : currentIntZoom - 1;
197 if (nearestNeighbourLayer <= m_maxZoomLevel && nearestNeighbourLayer >= m_minZoomLevel) {
198 camera.setZoomLevel(nearestNeighbourLayer);
201 double neighbourScale = (1.0 + zoomFraction)/2.0;
202 m_prefetchTiles->setCameraData(camera);
204 tiles += m_prefetchTiles->createTiles();
209 case QGeoTiledMap::PrefetchTwoNeighbourLayers: {
212 if (currentIntZoom > m_minZoomLevel) {
213 camera.setZoomLevel(currentIntZoom - 1);
214 m_prefetchTiles->setCameraData(camera);
215 m_prefetchTiles->setViewExpansion(0.5);
216 tiles += m_prefetchTiles->createTiles();
219 if (currentIntZoom < m_maxZoomLevel) {
220 camera.setZoomLevel(currentIntZoom + 1);
221 m_prefetchTiles->setCameraData(camera);
222 m_prefetchTiles->setViewExpansion(1.0);
223 tiles += m_prefetchTiles->createTiles();
232 m_tileRequests->requestTiles(tiles - m_mapScene->texturedTiles());
242void QGeoTiledMapPrivate::onCameraCapabilitiesChanged(
const QGeoCameraCapabilities &oldCameraCapabilities)
245 if (oldCameraCapabilities.minimumZoomLevel() != m_cameraCapabilities.minimumZoomLevel())
246 m_minZoomLevel =
static_cast<
int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()));
247 if (oldCameraCapabilities.maximumZoomLevel() != m_cameraCapabilities.maximumZoomLevel())
248 m_maxZoomLevel =
static_cast<
int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()));
251 if (oldCameraCapabilities.tileSize() != m_cameraCapabilities.tileSize()) {
252 m_visibleTiles->setTileSize(oldCameraCapabilities.tileSize());
253 m_prefetchTiles->setTileSize(oldCameraCapabilities.tileSize());
254 m_mapScene->setTileSize(oldCameraCapabilities.tileSize());
258void QGeoTiledMapPrivate::changeCameraData(
const QGeoCameraData &cameraData)
262 QGeoCameraData cam = cameraData;
266 double zoomLevel = cameraData.zoomLevel();
267 if (m_visibleTiles->tileSize() != 256)
268 zoomLevel = std::log(std::pow(2.0, zoomLevel) * 256.0 / m_visibleTiles->tileSize()) * (1.0 / std::log(2.0));
269 cam.setZoomLevel(zoomLevel);
274 int izl =
static_cast<
int>(std::floor(cam.zoomLevel()));
275 float delta = cam.zoomLevel() - izl;
283 if (qAbs(delta) < 0.01) {
284 cam.setZoomLevel(izl);
287 m_visibleTiles->setCameraData(cam);
288 m_mapScene->setCameraData(cam);
294void QGeoTiledMapPrivate::updateScene()
298 const QSet<QGeoTileSpec>& tiles = m_visibleTiles->createTiles();
299 bool newTilesIntroduced = !m_mapScene->visibleTiles().contains(tiles);
300 m_mapScene->setVisibleTiles(tiles);
302 if (newTilesIntroduced && m_copyrightVisible)
303 q->evaluateCopyrights(tiles);
306 QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > cachedTiles =
307 m_tileRequests->requestTiles(m_visibleTiles->createTiles() - m_mapScene->texturedTiles());
309 for (
auto it = cachedTiles.cbegin(); it != cachedTiles.cend(); ++it)
310 m_mapScene->addTile(it.key(), it.value());
312 if (!cachedTiles.isEmpty())
313 emit q->sgNodeChanged();
316void QGeoTiledMapPrivate::setVisibleArea(
const QRectF &visibleArea)
319 const QRectF va = clampVisibleArea(visibleArea);
320 if (va == m_visibleArea)
324 m_geoProjection->setVisibleArea(va);
326 m_visibleTiles->setVisibleArea(va);
327 m_prefetchTiles->setVisibleArea(va);
328 m_mapScene->setVisibleArea(va);
330 if (m_copyrightVisible)
331 q->evaluateCopyrights(m_mapScene->visibleTiles());
341void QGeoTiledMapPrivate::changeActiveMapType(
const QGeoMapType &mapType)
343 m_visibleTiles->setTileSize(m_cameraCapabilities.tileSize());
344 m_prefetchTiles->setTileSize(m_cameraCapabilities.tileSize());
345 m_mapScene->setTileSize(m_cameraCapabilities.tileSize());
346 m_visibleTiles->setMapType(mapType);
347 m_prefetchTiles->setMapType(mapType);
348 changeCameraData(m_cameraData);
366void QGeoTiledMapPrivate::changeViewportSize(
const QSize& size)
370 m_visibleTiles->setScreenSize(size);
371 m_prefetchTiles->setScreenSize(size);
372 m_mapScene->setScreenSize(size);
375 if (!size.isEmpty() && m_cache) {
377 int texCacheSize = (size.width() + m_visibleTiles->tileSize() * 2) *
378 (size.height() + m_visibleTiles->tileSize() * 2) * 4;
385 int newSize = qMax(m_cache->minTextureUsage(), texCacheSize);
386 m_cache->setMinTextureUsage(newSize);
389 if (m_copyrightVisible)
390 q->evaluateCopyrights(m_mapScene->visibleTiles());
394void QGeoTiledMapPrivate::updateTile(
const QGeoTileSpec &spec)
398 if (m_visibleTiles->createTiles().contains(spec)){
399 QSharedPointer<QGeoTileTexture> tex = m_tileRequests->tileTexture(spec);
400 if (!tex.isNull() && !tex->image.isNull()) {
401 m_mapScene->addTile(spec, tex);
402 emit q->sgNodeChanged();