diff --git a/src/map/emptymap.cpp b/src/map/emptymap.cpp index 8fb5ef1b..8790b2a3 100644 --- a/src/map/emptymap.cpp +++ b/src/map/emptymap.cpp @@ -3,13 +3,23 @@ #include "common/coordinates.h" #include "common/rectc.h" #include "common/wgs84.h" -#include "mercator.h" #include "emptymap.h" #define SCALE_MIN 0.5 #define SCALE_MAX 1.0E-6 +static QPointF ll2m(const Coordinates &c) +{ + return QPointF(c.lon(), rad2deg(log(tan(M_PI/4.0 + deg2rad(c.lat())/2.0)))); +} + +static Coordinates m2ll(const QPointF &p) +{ + return Coordinates(p.x(), rad2deg(2 * atan(exp(deg2rad(p.y()))) - M_PI/2)); +} + + EmptyMap::EmptyMap(QObject *parent) : Map(parent) { _scale = SCALE_MAX; @@ -25,8 +35,7 @@ qreal EmptyMap::zoomFit(const QSize &size, const RectC &br) if (!br.isValid()) _scale = SCALE_MAX; else { - QRectF tbr(Mercator().ll2xy(br.topLeft()), - Mercator().ll2xy(br.bottomRight())); + QRectF tbr(ll2m(br.topLeft()), ll2m(br.bottomRight())); QPointF sc(tbr.width() / size.width(), tbr.height() / size.height()); _scale = qMax(sc.x(), sc.y()); } @@ -73,12 +82,12 @@ void EmptyMap::draw(QPainter *painter, const QRectF &rect) QPointF EmptyMap::ll2xy(const Coordinates &c) const { - QPointF m = Mercator().ll2xy(c); + QPointF m = ll2m(c); return QPointF(m.x() / _scale, m.y() / -_scale); } Coordinates EmptyMap::xy2ll(const QPointF &p) const { QPointF m(p.x() * _scale, -p.y() * _scale); - return Mercator().xy2ll(m); + return m2ll(QPointF(p.x() * _scale, -p.y() * _scale)); } diff --git a/src/map/mercator.cpp b/src/map/mercator.cpp index e46e5122..46883c28 100644 --- a/src/map/mercator.cpp +++ b/src/map/mercator.cpp @@ -1,12 +1,16 @@ #include <cmath> +#include "common/coordinates.h" +#include "common/wgs84.h" #include "mercator.h" QPointF Mercator::ll2xy(const Coordinates &c) const { - return QPointF(c.lon(), rad2deg(log(tan(M_PI/4.0 + deg2rad(c.lat())/2.0)))); + return QPointF(deg2rad(c.lon()) * WGS84_RADIUS, + log(tan(M_PI/4.0 + deg2rad(c.lat())/2.0)) * WGS84_RADIUS); } Coordinates Mercator::xy2ll(const QPointF &p) const { - return Coordinates(p.x(), rad2deg(2 * atan(exp(deg2rad(p.y()))) - M_PI/2)); + return Coordinates(rad2deg(p.x() / WGS84_RADIUS), + rad2deg(2 * atan(exp(p.y() / WGS84_RADIUS)) - M_PI/2)); } diff --git a/src/map/onlinemap.cpp b/src/map/onlinemap.cpp index a423c8fd..85080237 100644 --- a/src/map/onlinemap.cpp +++ b/src/map/onlinemap.cpp @@ -4,7 +4,6 @@ #include "common/coordinates.h" #include "common/rectc.h" #include "common/wgs84.h" -#include "mercator.h" #include "downloader.h" #include "config.h" #include "onlinemap.h" @@ -12,6 +11,16 @@ #define TILE_SIZE 256 +static QPointF ll2m(const Coordinates &c) +{ + return QPointF(c.lon(), rad2deg(log(tan(M_PI/4.0 + deg2rad(c.lat())/2.0)))); +} + +static Coordinates m2ll(const QPointF &p) +{ + return Coordinates(p.x(), rad2deg(2 * atan(exp(deg2rad(p.y()))) - M_PI/2)); +} + static QPoint mercator2tile(const QPointF &m, int z) { QPoint tile; @@ -183,8 +192,7 @@ qreal OnlineMap::zoomFit(const QSize &size, const RectC &br) if (!br.isValid()) _zoom = _zooms.max(); else { - QRectF tbr(Mercator().ll2xy(br.topLeft()), - Mercator().ll2xy(br.bottomRight())); + QRectF tbr(ll2m(br.topLeft()), ll2m(br.bottomRight())); QPointF sc(tbr.width() / size.width(), tbr.height() / size.height()); _zoom = limitZoom(scale2zoom(qMax(sc.x(), sc.y()))); @@ -252,13 +260,12 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect) QPointF OnlineMap::ll2xy(const Coordinates &c) const { qreal scale = zoom2scale(_zoom); - QPointF m = Mercator().ll2xy(c); + QPointF m = ll2m(c); return QPointF(m.x() / scale, m.y() / -scale); } Coordinates OnlineMap::xy2ll(const QPointF &p) const { qreal scale = zoom2scale(_zoom); - QPointF m(p.x() * scale, -p.y() * scale); - return Mercator().xy2ll(m); + return m2ll(QPointF(p.x() * scale, -p.y() * scale)); }