QVariant cameraInterpolator(const QGeoCameraData &start, const QGeoCameraData &end, qreal progress) { QGeoCameraData result = start; QGeoCoordinate from = start.center(); QGeoCoordinate to = end.center(); if (from == to) { if (progress < 0.5) { result.setCenter(from); } else { result.setCenter(to); } } else { QGeoCoordinate coordinateResult = QGeoProjection::coordinateInterpolation(from, to, progress); result.setCenter(coordinateResult); } double sf = 1.0 - progress; double ef = progress; result.setBearing(sf * start.bearing() + ef * end.bearing()); result.setTilt(sf * start.tilt() + ef * end.tilt()); result.setRoll(sf * start.roll() + ef * end.roll()); result.setZoomLevel(sf * start.zoomLevel() + ef * end.zoomLevel()); return QVariant::fromValue(result); }
void QGeoMapController::setZoom(qreal zoom) { QGeoCameraData cd = map_->cameraData(); if (zoom == cd.zoomLevel()) return; cd.setZoomLevel(zoom); map_->setCameraData(cd); }
void QGeoTiledMapDataPrivate::changeCameraData(const QGeoCameraData &oldCameraData) { double lat = oldCameraData.center().latitude(); if (mapScene_->verticalLock()) { QGeoCoordinate coord = map_->cameraData().center(); coord.setLatitude(lat); map_->cameraData().setCenter(coord); } // For zoomlevel, "snap" 0.05 either side of a whole number. // This is so that when we turn off bilinear scaling, we're // snapped to the exact pixel size of the tiles QGeoCameraData cam = map_->cameraData(); int izl = static_cast<int>(std::floor(cam.zoomLevel())); float delta = cam.zoomLevel() - izl; if (delta > 0.5) { izl++; delta -= 1.0; } if (qAbs(delta) < 0.05) { cam.setZoomLevel(izl); } cameraTiles_->setCamera(cam); mapScene_->setCameraData(cam); mapScene_->setVisibleTiles(cameraTiles_->tiles()); if (tileRequests_) { // don't request tiles that are already built and textured QList<QSharedPointer<QGeoTileTexture> > cachedTiles = tileRequests_->requestTiles(cameraTiles_->tiles() - mapScene_->texturedTiles()); foreach (const QSharedPointer<QGeoTileTexture> &tex, cachedTiles) { mapScene_->addTile(tex->spec, tex); } if (!cachedTiles.isEmpty()) map_->update(); }