20QGeoTiledMap::QGeoTiledMap(QGeoTiledMappingManagerEngine *engine, QObject *parent)
21 : QGeoMap(*
new QGeoTiledMapPrivate(engine), parent)
25 d->m_tileRequests =
new QGeoTileRequestManager(
this, engine);
27 QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
28 this,&QGeoTiledMap::handleTileVersionChanged);
29 QObject::connect(
this, &QGeoMap::cameraCapabilitiesChanged,
this,
30 [d](
const QGeoCameraCapabilities &oldCameraCapabilities) {
31 d->onCameraCapabilitiesChanged(oldCameraCapabilities);
35QGeoTiledMap::QGeoTiledMap(QGeoTiledMapPrivate &dd, QGeoTiledMappingManagerEngine *engine, QObject *parent)
40 d->m_tileRequests =
new QGeoTileRequestManager(
this, engine);
42 QObject::connect(engine,&QGeoTiledMappingManagerEngine::tileVersionChanged,
43 this,&QGeoTiledMap::handleTileVersionChanged);
44 QObject::connect(
this, &QGeoMap::cameraCapabilitiesChanged,
this,
45 [d](
const QGeoCameraCapabilities &oldCameraCapabilities) {
46 d->onCameraCapabilitiesChanged(oldCameraCapabilities);
149QGeoTiledMapPrivate::QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine)
150 : QGeoMapPrivate(engine,
new QGeoProjectionWebMercator),
151 m_cache(engine->tileCache()),
152 m_visibleTiles(
new QGeoCameraTiles()),
153 m_prefetchTiles(
new QGeoCameraTiles()),
154 m_mapScene(
new QGeoTiledMapScene()),
155 m_tileRequests(
nullptr),
156 m_maxZoomLevel(
static_cast<
int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()))),
157 m_minZoomLevel(
static_cast<
int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()))),
158 m_prefetchStyle(QGeoTiledMap::PrefetchTwoNeighbourLayers)
160 int tileSize = m_cameraCapabilities.tileSize();
161 QString pluginString(engine->managerName() + QLatin1Char(
'_') + QString::number(engine->managerVersion()));
162 m_visibleTiles->setTileSize(tileSize);
163 m_prefetchTiles->setTileSize(tileSize);
164 m_visibleTiles->setPluginString(pluginString);
165 m_prefetchTiles->setPluginString(pluginString);
166 m_mapScene->setTileSize(tileSize);
181void QGeoTiledMapPrivate::prefetchTiles()
183 if (m_tileRequests && m_prefetchStyle != QGeoTiledMap::NoPrefetching) {
185 QSet<QGeoTileSpec> tiles;
186 QGeoCameraData camera = m_visibleTiles->cameraData();
187 int currentIntZoom =
static_cast<
int>(std::floor(camera.zoomLevel()));
189 m_prefetchTiles->setCameraData(camera);
191 tiles = m_prefetchTiles->createTiles();
193 switch (m_prefetchStyle) {
195 case QGeoTiledMap::PrefetchNeighbourLayer: {
196 double zoomFraction = camera.zoomLevel() - currentIntZoom;
197 int nearestNeighbourLayer = zoomFraction > 0.5 ? currentIntZoom + 1 : currentIntZoom - 1;
198 if (nearestNeighbourLayer <= m_maxZoomLevel && nearestNeighbourLayer >= m_minZoomLevel) {
199 camera.setZoomLevel(nearestNeighbourLayer);
202 double neighbourScale = (1.0 + zoomFraction)/2.0;
203 m_prefetchTiles->setCameraData(camera);
205 tiles += m_prefetchTiles->createTiles();
210 case QGeoTiledMap::PrefetchTwoNeighbourLayers: {
213 if (currentIntZoom > m_minZoomLevel) {
214 camera.setZoomLevel(currentIntZoom - 1);
215 m_prefetchTiles->setCameraData(camera);
216 m_prefetchTiles->setViewExpansion(0.5);
217 tiles += m_prefetchTiles->createTiles();
220 if (currentIntZoom < m_maxZoomLevel) {
221 camera.setZoomLevel(currentIntZoom + 1);
222 m_prefetchTiles->setCameraData(camera);
223 m_prefetchTiles->setViewExpansion(1.0);
224 tiles += m_prefetchTiles->createTiles();
233 m_tileRequests->requestTiles(tiles - m_mapScene->texturedTiles());
243void QGeoTiledMapPrivate::onCameraCapabilitiesChanged(
const QGeoCameraCapabilities &oldCameraCapabilities)
246 if (oldCameraCapabilities.minimumZoomLevel() != m_cameraCapabilities.minimumZoomLevel())
247 m_minZoomLevel =
static_cast<
int>(std::ceil(m_cameraCapabilities.minimumZoomLevel()));
248 if (oldCameraCapabilities.maximumZoomLevel() != m_cameraCapabilities.maximumZoomLevel())
249 m_maxZoomLevel =
static_cast<
int>(std::ceil(m_cameraCapabilities.maximumZoomLevel()));
252 if (oldCameraCapabilities.tileSize() != m_cameraCapabilities.tileSize()) {
253 m_visibleTiles->setTileSize(oldCameraCapabilities.tileSize());
254 m_prefetchTiles->setTileSize(oldCameraCapabilities.tileSize());
255 m_mapScene->setTileSize(oldCameraCapabilities.tileSize());
259void QGeoTiledMapPrivate::changeCameraData(
const QGeoCameraData &cameraData)
263 QGeoCameraData cam = cameraData;
267 double zoomLevel = cameraData.zoomLevel();
268 if (m_visibleTiles->tileSize() != 256)
269 zoomLevel = std::log(std::pow(2.0, zoomLevel) * 256.0 / m_visibleTiles->tileSize()) * (1.0 / std::log(2.0));
270 cam.setZoomLevel(zoomLevel);
275 int izl =
static_cast<
int>(std::floor(cam.zoomLevel()));
276 float delta = cam.zoomLevel() - izl;
284 if (qAbs(delta) < 0.01) {
285 cam.setZoomLevel(izl);
288 m_visibleTiles->setCameraData(cam);
289 m_mapScene->setCameraData(cam);
295void QGeoTiledMapPrivate::updateScene()
299 const QSet<QGeoTileSpec>& tiles = m_visibleTiles->createTiles();
300 bool newTilesIntroduced = !m_mapScene->visibleTiles().contains(tiles);
301 m_mapScene->setVisibleTiles(tiles);
303 if (newTilesIntroduced && m_copyrightVisible)
304 q->evaluateCopyrights(tiles);
307 QMap<QGeoTileSpec, QSharedPointer<QGeoTileTexture> > cachedTiles =
308 m_tileRequests->requestTiles(m_visibleTiles->createTiles() - m_mapScene->texturedTiles());
310 for (
auto it = cachedTiles.cbegin(); it != cachedTiles.cend(); ++it)
311 m_mapScene->addTile(it.key(), it.value());
313 if (!cachedTiles.isEmpty())
314 emit q->sgNodeChanged();
317void QGeoTiledMapPrivate::setVisibleArea(
const QRectF &visibleArea)
320 const QRectF va = clampVisibleArea(visibleArea);
321 if (va == m_visibleArea)
325 m_geoProjection->setVisibleArea(va);
327 m_visibleTiles->setVisibleArea(va);
328 m_prefetchTiles->setVisibleArea(va);
329 m_mapScene->setVisibleArea(va);
331 if (m_copyrightVisible)
332 q->evaluateCopyrights(m_mapScene->visibleTiles());
342void QGeoTiledMapPrivate::changeActiveMapType(
const QGeoMapType &mapType)
344 m_visibleTiles->setTileSize(m_cameraCapabilities.tileSize());
345 m_prefetchTiles->setTileSize(m_cameraCapabilities.tileSize());
346 m_mapScene->setTileSize(m_cameraCapabilities.tileSize());
347 m_visibleTiles->setMapType(mapType);
348 m_prefetchTiles->setMapType(mapType);
349 changeCameraData(m_cameraData);
367void QGeoTiledMapPrivate::changeViewportSize(
const QSize& size)
371 m_visibleTiles->setScreenSize(size);
372 m_prefetchTiles->setScreenSize(size);
373 m_mapScene->setScreenSize(size);
376 if (!size.isEmpty() && m_cache) {
378 int texCacheSize = (size.width() + m_visibleTiles->tileSize() * 2) *
379 (size.height() + m_visibleTiles->tileSize() * 2) * 4;
386 int newSize = qMax(m_cache->minTextureUsage(), texCacheSize);
387 m_cache->setMinTextureUsage(newSize);
390 if (m_copyrightVisible)
391 q->evaluateCopyrights(m_mapScene->visibleTiles());
395void QGeoTiledMapPrivate::updateTile(
const QGeoTileSpec &spec)
399 if (m_visibleTiles->createTiles().contains(spec)){
400 QSharedPointer<QGeoTileTexture> tex = m_tileRequests->tileTexture(spec);
401 if (!tex.isNull() && !tex->image.isNull()) {
402 m_mapScene->addTile(spec, tex);
403 emit q->sgNodeChanged();