#include <QDebug>
+#include "coordinates/scenecoordinate.h"
#include "mapcommon.h"
-#include "mapengine.h"
#include "maptile.h"
#include "mapscene.h"
-const int MAP_MIN_PIXEL_Y = 0;
-const int MAP_MAX_PIXEL_Y = MAX_TILES_PER_SIDE * TILE_SIZE_Y - 1;
-
MapScene::MapScene(QObject *parent)
: QGraphicsScene(parent)
, m_isRemoveStackedTilesRunning(false)
+ , m_zoomLevel(0)
, m_tilesSceneRect(QRect(0, 0, 0, 0))
+ , m_viewTilesGrid(QRect(0, 0, 0, 0))
{
qDebug() << __PRETTY_FUNCTION__;
setBackgroundBrush(Qt::lightGray);
- setSceneRect(QRect(QPoint(MAP_SCENE_MIN_PIXEL_X, MAP_MIN_PIXEL_Y),
- QPoint(MAP_SCENE_MAX_PIXEL_X, MAP_MAX_PIXEL_Y)));
+ setSceneRect(QRect(QPoint(MAP_SCENE_MIN_PIXEL_X, OSM_MAP_MIN_PIXEL_Y),
+ QPoint(MAP_SCENE_MAX_PIXEL_X, OSM_MAP_MAX_PIXEL_Y)));
}
void MapScene::addTile(int tileZoomLevel, QPoint tileNumber, const QPixmap &image, int viewZoomLevel)
{
-// qWarning() << __PRETTY_FUNCTION__ << "x:" << tileNumber.x() << "y:" << tileNumber.y();
+ qDebug() << __PRETTY_FUNCTION__;
// tile might already be in the scene if expired tile was returned from the cache to be
// temporarily shown while downloading the fresh one.
- QString hashKey = MapEngine::tilePath(tileZoomLevel, tileNumber.x(), tileNumber.y());
+ QString hashKey = MapTile::tilePath(tileZoomLevel, tileNumber.x(), tileNumber.y());
MapTile *oldTile = tileInScene(hashKey);
if (oldTile)
removeTile(oldTile);
m_mapTilesInScene.insert(hashKey, tile);
addItem(tile);
- qWarning() << __PRETTY_FUNCTION__ << "tiles:" << m_mapTilesInScene.count();
+ qDebug() << __PRETTY_FUNCTION__ << "tiles count:" << m_mapTilesInScene.count();
enqueueRemoveStackedTiles(tile);
removeOtherLevelTiles();
}
}
+qreal MapScene::horizontalResolutionAtLatitude(double latitude)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ const int SHIFT = 200;
+
+ GeoCoordinate from = GeoCoordinate(latitude, 0);
+
+ SceneCoordinate fromScene = SceneCoordinate(from);
+ SceneCoordinate toScene(fromScene.x() + SHIFT, fromScene.y());
+ GeoCoordinate to(toScene);
+
+ qreal distance = from.distanceTo(to);
+
+ return (distance / SHIFT);
+}
+
void MapScene::moveIntersectingItemsHorizontally(QRect from, int distance)
{
qDebug() << __PRETTY_FUNCTION__;
void MapScene::removeOtherLevelTiles()
{
-// qWarning() << __PRETTY_FUNCTION__;
+ qDebug() << __PRETTY_FUNCTION__;
for (int x = m_viewTilesGrid.left(); x <= m_viewTilesGrid.right(); x++) {
for (int y = m_viewTilesGrid.top(); y <= m_viewTilesGrid.bottom(); y++) {
-// qWarning() << __PRETTY_FUNCTION__ << "x:" << x << "y:" << y;
- if (!m_mapTilesInScene.contains(MapEngine::tilePath(m_zoomLevel, x, y)))
+ if (!m_mapTilesInScene.contains(MapTile::tilePath(m_zoomLevel, x, y)))
return;
}
}
-// qWarning() << __PRETTY_FUNCTION__ << "all current grid tiles are in the scene";
-
foreach(MapTile *tile, m_mapTilesInScene) {
if (tile->zoomLevel() != m_zoomLevel) {
removeTile(tile);
- qWarning() << __PRETTY_FUNCTION__ << "removed other level tile -------------";
+ qDebug() << __PRETTY_FUNCTION__ << "removed other level tile";
}
}
-
-// qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
}
void MapScene::removeOutOfViewTiles(QRect tilesGrid, int zoomLevel)
// if view is near east limit of the map, then there is duplicate tiles also on the opposite
// side of the world which are removed from allTiles
- if (tilesGrid.right() > (MapEngine::tileMaxIndex(zoomLevel) - tilesGridWidthHalf + GRID_PADDING)) {
+ if (tilesGrid.right() > ((MapTile::lastTileIndex(zoomLevel)
+ - tilesGridWidthHalf
+ + MAP_GRID_PADDING))) {
QRect oppositeRect = m_tilesSceneRect;
- oppositeRect.translate(-MAP_PIXELS_X, 0);
+ oppositeRect.translate(-OSM_MAP_PIXELS_X, 0);
QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
foreach (QGraphicsItem *item, oppositeItems)
allItems.removeOne(item);
// if view is near west limit of the map, then there is duplicate tiles also on the opposite
// side of the world which are removed from allTiles
- if (tilesGrid.left() < (tilesGridWidthHalf - GRID_PADDING)) {
+ if (tilesGrid.left() < (tilesGridWidthHalf - MAP_GRID_PADDING)) {
QRect oppositeRect = m_tilesSceneRect;
- oppositeRect.translate(MAP_PIXELS_X, 0);
+ oppositeRect.translate(OSM_MAP_PIXELS_X, 0);
QList<QGraphicsItem *> oppositeItems = items(oppositeRect, Qt::IntersectsItemBoundingRect);
foreach (QGraphicsItem *item, oppositeItems)
allItems.removeOne(item);
if (tile)
removeTile(tile);
}
-
-// qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
}
void MapScene::removeStackedTiles(MapTile *newTile)
}
}
}
-// qWarning() << __PRETTY_FUNCTION__ << "items in scene:" << items().count();
}
void MapScene::removeTile(MapTile *tile)
{
qDebug() << __PRETTY_FUNCTION__;
- m_mapTilesInScene.remove(MapEngine::tilePath(tile->zoomLevel(),
- tile->tileNumber().x(),
- tile->tileNumber().y()));
+ m_mapTilesInScene.remove(MapTile::tilePath(tile->zoomLevel(),
+ tile->tileNumber().x(),
+ tile->tileNumber().y()));
removeItem(tile);
m_removeStackedTilesList.removeAll(tile);
delete tile;
- qWarning() << __PRETTY_FUNCTION__ << "tiles:" << m_mapTilesInScene.count();
+ qDebug() << __PRETTY_FUNCTION__ << "tiles count:" << m_mapTilesInScene.count();
}
void MapScene::setSceneVerticalOverlap(int viewHeight, int zoomLevel)
{
qDebug() << __PRETTY_FUNCTION__;
- int overlap = viewHeight / 2 * (1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel));
+ int overlap = viewHeight / 2 * (1 << (OSM_MAX_ZOOM_LEVEL - zoomLevel));
QRect rect = sceneRect().toRect();
- rect.setTop(MAP_MIN_PIXEL_Y - overlap);
- rect.setBottom(MAP_MAX_PIXEL_Y + overlap);
+ rect.setTop(OSM_MAP_MIN_PIXEL_Y - overlap);
+ rect.setBottom(OSM_MAP_MAX_PIXEL_Y + overlap);
setSceneRect(rect);
}
m_zoomLevel = zoomLevel;
}
-void MapScene::spanItems(int zoomLevel, QPoint sceneCoordinate, QSize viewSize)
+void MapScene::spanItems(QRectF viewSceneRect)
{
qDebug() << __PRETTY_FUNCTION__;
// create rects for left and right side
QRect leftRect = sceneRect().toRect(); // this way we get the horizontal limits of the scene
- leftRect.setTop(MAP_MIN_PIXEL_Y);
- leftRect.setBottom(MAP_MAX_PIXEL_Y);
+ leftRect.setTop(OSM_MAP_MIN_PIXEL_Y);
+ leftRect.setBottom(OSM_MAP_MAX_PIXEL_Y);
QRect rightRect = leftRect;
- // calculate current horizontal area shown on the view
- int viewSceneWidth = (1 << (MAX_MAP_ZOOM_LEVEL - zoomLevel)) * viewSize.width();
- int viewSceneLeft = sceneCoordinate.x() - viewSceneWidth / 2;
- int viewSceneRight = sceneCoordinate.x() + viewSceneWidth / 2;
-
// limit rects to include only area which really must be moved
- leftRect.setRight(-1 - (MAP_PIXELS_X - 1 - viewSceneRight));
- rightRect.setLeft(MAP_PIXELS_X + viewSceneLeft);
+ leftRect.setRight(-1 - (OSM_MAP_PIXELS_X - 1 - viewSceneRect.right()));
+ rightRect.setLeft(OSM_MAP_PIXELS_X + viewSceneRect.left());
- Q_ASSERT_X(leftRect.right() < viewSceneLeft, "spanning rect right value", "move rect is in the view area");
- Q_ASSERT_X(rightRect.left() > viewSceneRight, "spanning rect left value", "move rect is in the view area");
+ Q_ASSERT_X(leftRect.right() < viewSceneRect.left(), "spanning rect right value", "move rect is in the view area");
+ Q_ASSERT_X(rightRect.left() > viewSceneRect.right(), "spanning rect left value", "move rect is in the view area");
// move all items which intersects the rects
if (leftRect.left() < leftRect.right())
- moveIntersectingItemsHorizontally(leftRect, MAP_PIXELS_X);
+ moveIntersectingItemsHorizontally(leftRect, OSM_MAP_PIXELS_X);
if (rightRect.left() < rightRect.right())
- moveIntersectingItemsHorizontally(rightRect, -MAP_PIXELS_X);
+ moveIntersectingItemsHorizontally(rightRect, -OSM_MAP_PIXELS_X);
}
void MapScene::tilesSceneRectUpdated(QRect tilesSceneRect)