--- /dev/null
+#ifndef COMMON_H
+#define COMMON_H
+
+static const int TILE_SIZE_X = 256; ///< Tile image size in x direction
+static const int TILE_SIZE_Y = 256; ///< Tile image size in y direction
+static const int MIN_ZOOM_LEVEL = 0; ///< Minimum zoom level
+static const int MAX_ZOOM_LEVEL = 18; ///< Maximum zoom level
+
+#endif // COMMON_H
#include <QtCore>
#include <QtGlobal>
-MapEngine::MapEngine(MapView *mapView, QWidget *parent)
+MapEngine::MapEngine(QWidget *parent)
: QObject(parent)
{
- m_mapView = mapView;
m_mapScene = new MapScene(this);
- mapView->setScene(m_mapScene);
m_zoomLevel = 14;
m_mapFetcher = new MapFetcher(new QNetworkAccessManager(this), this);
}
/**
- * @todo Create URL builder method
+ * @todo DONE Create URL builder method
* QUrl buildURL(zoomLevel, QPoint tileNumbers)
*/
void MapEngine::setViewLocation(QPointF latLonCoordinate)
{
- m_mapView->setZoomLevel(m_zoomLevel);
+ emit zoomLevelChanged(m_zoomLevel);
/// Fetch some map tiles for demo purposes
for (int x=9351; x<=9354; x++) {
for (int y=4261; y<=4264; y++) {
- QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
- .arg(m_zoomLevel).arg(x).arg(y);
- m_mapFetcher->fetchMapImage(QUrl(url));
+ QUrl url = buildURL(m_zoomLevel, QPoint(x, y));
+ m_mapFetcher->fetchMapImage(url);
}
}
}
+QUrl MapEngine::buildURL(int zoomLevel, QPoint tileNumbers)
+{
+ QString url = QString("http://tile.openstreetmap.org/mapnik/%1/%2/%3.png")
+ .arg(zoomLevel).arg(tileNumbers.x()).arg(tileNumbers.y());
+
+ return QUrl(url);
+}
+
/**
* @todo Create URL parser methor and refactor code (use pointers for returning)
*/
qreal n = M_PI - 2 * M_PI * y / zoom;
return 180.0 / (M_PI * atan(0.5 * exp(n) - exp(-n)));
}
+
+QGraphicsScene* MapEngine::scene()
+{
+ return dynamic_cast<QGraphicsScene *>(m_mapScene);
+}
#ifndef MAPENGINE_H
#define MAPENGINE_H
-#include <math.h>
-
#include <QtCore>
+#include "common.h"
#include "mapfetcher.h"
#include "mapscene.h"
#include "mapview.h"
/**
* @brief Constructor
*
- * Does create and add scene to map view.
- * @param mapView View for map
* @param parent Parent
*/
- MapEngine(MapView *mapView, QWidget *parent = 0);
+ MapEngine(QWidget *parent = 0);
/**
* @brief Convert tile x & y numbers to MapScene coordinates
* @return QPoint MapScene coordinate
*/
/**
- * @todo use bit shift instead of pow
+ * @todo DONE use bit shift instead of pow
*/
static QPoint convertTileNumberToSceneCoordinate(int zoomLevel, QPoint tileNumber)
{
- int x = tileNumber.x() * TILE_SIZE_X * pow(2, MAX_ZOOM_LEVEL - zoomLevel);
- int y = tileNumber.y() * TILE_SIZE_Y * pow(2, MAX_ZOOM_LEVEL - zoomLevel);
+ int pow = 1 << (MAX_ZOOM_LEVEL - zoomLevel);
+ int x = tileNumber.x() * TILE_SIZE_X * pow;
+ int y = tileNumber.y() * TILE_SIZE_Y * pow;
return QPoint(x, y);
}
/**
+ * @brief Getter for scene
+ *
+ * @return QGraphicsScene
+ */
+ QGraphicsScene* scene();
+
+ /**
* @brief Set view location
*
* @param latLonCoordinate Latitude & longitude coordinates for location
*/
qreal tileYToLatitude(int y, int zoom);
+private:
+ /**
+ * @brief Build URL for donwloading single map tile from OpenStreetMap tile server
+ *
+ * @param zoomLevel Zoom level
+ * @param tileNumbers Tile x & y numbers
+ * @return URL for the required tile
+ */
+ QUrl buildURL(int zoomLevel, QPoint tileNumbers);
+
private slots:
/**
* @brief Slot for received map tile images
*/
void mapImageReceived(const QUrl &url, const QPixmap &pixmap);
-public:
- static const int TILE_SIZE_X = 256; ///< Tile image size in x direction
- static const int TILE_SIZE_Y = 256; ///< Tile image size in y direction
- static const int MIN_ZOOM_LEVEL = 0; ///< Minimum zoom level
- static const int MAX_ZOOM_LEVEL = 18; ///< Maximum zoom level
+signals:
+ /**
+ * @brief Signal for zoom level change
+ *
+ * @param newZoomLevel New zoom level
+ */
+ void zoomLevelChanged(int newZoomLevel);
private:
- MapView *m_mapView; ///< View for viewing map
MapScene *m_mapScene; ///< Scene for map tiles
MapFetcher *m_mapFetcher; ///< Fetcher for map tiles
int m_zoomLevel; ///< Current zoom level
USA.
*/
-#include <math.h>
-
#include <QDebug>
#include <QTransform>
-#include "maptile.h"
+#include "common.h"
#include "mapengine.h"
+#include "maptile.h"
MapTile::MapTile()
{
{
m_zoomLevel = zoomLevel;
setPosition();
-/**
- * @todo use bit shifting
- */
- double zoomFactor = pow(2, (MapEngine::MAX_ZOOM_LEVEL - m_zoomLevel));
+ /**
+ * @todo DONE use bit shifting
+ */
+ qreal zoomFactor = (qreal)(1 << (MAX_ZOOM_LEVEL - m_zoomLevel));
setScale(zoomFactor);
}
void MapTile::setPosition()
{
/**
- * @todo use bit shifting
+ * @todo DONE use bit shifting
*/
- if ((m_zoomLevel >= MapEngine::MIN_ZOOM_LEVEL) && (m_zoomLevel <= MapEngine::MAX_ZOOM_LEVEL) &&
- (m_tileNumber.x() >= 0) && (m_tileNumber.x() <= pow(2, m_zoomLevel) -1) &&
- (m_tileNumber.y() >= 0) && (m_tileNumber.y() <= pow(2, m_zoomLevel) -1)) {
+ const int maxTileNumber = (1 << m_zoomLevel) - 1;
+
+ if ((m_zoomLevel >= MIN_ZOOM_LEVEL) && (m_zoomLevel <= MAX_ZOOM_LEVEL) &&
+ (m_tileNumber.x() >= 0) && (m_tileNumber.x() <= maxTileNumber) &&
+ (m_tileNumber.y() >= 0) && (m_tileNumber.y() <= maxTileNumber)) {
setPos(MapEngine::convertTileNumberToSceneCoordinate(m_zoomLevel, m_tileNumber));
return; // done
}
//Q_ASSERT_X(false, __PRETTY_FUNCTION__, "m_zoomLevel and/or m_tileNumber is undefined");
}
-
#include <QDebug>
#include <QMouseEvent>
+#include "common.h"
#include "mapview.h"
-#include "mapengine.h"
MapView::MapView(QWidget *parent) : QGraphicsView(parent)
{
void MapView::setZoomLevel(int zoomLevel)
{
- double scaleFactor = pow(2, zoomLevel - MapEngine::MAX_ZOOM_LEVEL);
+ double scaleFactor = pow(2, zoomLevel - MAX_ZOOM_LEVEL);
scale(scaleFactor, scaleFactor);
}
*/
MapView(QWidget *parent = 0);
+private slots:
/**
- * @brief Set zoom level of the view
+ * @brief Slot for mouse events
*
- * @param zoomLevel Zoom level
+ * @param event Mouse event
*/
- void setZoomLevel(int zoomLevel);
+ void mousePressEvent(QMouseEvent *event);
-public slots:
/**
- * @brief Slot for mouse events
+ * @brief Set zoom level of the view
*
- * @param event Mouse event
+ * @param zoomLevel Zoom level
*/
- void mousePressEvent(QMouseEvent *event);
+ void setZoomLevel(int zoomLevel);
};
#endif // MAPVIEW_H
map/mapscene.cpp \
map/maptile.cpp \
map/mapfetcher.cpp
-
HEADERS += ui/mainwindow.h \
ui/mapviewscreen.h \
ui/listviewscreen.h \
map/mapview.h \
map/mapscene.h \
map/maptile.h \
- map/mapfetcher.h
+ map/mapfetcher.h \
+ common.h
QT += network
# -----------------------------------------------------------------
MapView *mapView = new MapView(this);
mapViewLayout->addWidget(mapView);
setLayout(mapViewLayout);
- MapEngine *mapEngine = new MapEngine(mapView, this);
+ MapEngine *mapEngine = new MapEngine(this);
+ mapView->setScene(mapEngine->scene());
+ connect(mapEngine, SIGNAL(zoomLevelChanged(int)), mapView, SLOT(setZoomLevel(int)));
mapEngine->setViewLocation(QPointF(25.5000, 65.0000));
}