1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-24 11:45:53 +01:00

Fixed atlas ll2xy() caching

This commit is contained in:
Martin Tůma 2017-04-30 00:19:53 +02:00
parent b500031713
commit 0aedec66c4
8 changed files with 30 additions and 29 deletions

View File

@ -118,6 +118,7 @@ Atlas::Atlas(const QString &fileName, QObject *parent) : Map(parent)
_valid = false; _valid = false;
_zoom = 0; _zoom = 0;
_name = fi.dir().dirName(); _name = fi.dir().dirName();
_ci = -1; _cz = -1;
if (!isAtlas(tar, fileName)) if (!isAtlas(tar, fileName))
return; return;
@ -233,35 +234,33 @@ qreal Atlas::zoomOut()
return _zoom; return _zoom;
} }
QPointF Atlas::ll2xy(const Coordinates &c) const QPointF Atlas::ll2xy(const Coordinates &c)
{ {
static int idx = -1;
static int zoom = -1;
QPointF pp; QPointF pp;
if (zoom != _zoom) { if (_cz != _zoom) {
idx = -1; _ci = -1;
zoom = _zoom; _cz = _zoom;
} }
if (idx >= 0) if (_ci >= 0)
pp = _maps.at(idx)->ll2pp(c); pp = _maps.at(_ci)->ll2pp(c);
if (idx < 0 || !_bounds.at(idx).first.contains(pp)) { if (_ci < 0 || !_bounds.at(_ci).first.contains(pp)) {
idx = _zooms.at(zoom).first; _ci = _zooms.at(_zoom).first;
for (int i = _zooms.at(zoom).first; i <= _zooms.at(zoom).second; i++) { for (int i = _zooms.at(_zoom).first; i <= _zooms.at(_zoom).second; i++) {
pp = _maps.at(i)->ll2pp(c); pp = _maps.at(i)->ll2pp(c);
if (_bounds.at(i).first.contains(pp)) { if (_bounds.at(i).first.contains(pp)) {
idx = i; _ci = i;
break; break;
} }
} }
} }
QPointF p = _maps.at(idx)->pp2xy(pp); QPointF p = _maps.at(_ci)->pp2xy(pp);
return p + _bounds.at(idx).second.topLeft(); return p + _bounds.at(_ci).second.topLeft();
} }
Coordinates Atlas::xy2ll(const QPointF &p) const Coordinates Atlas::xy2ll(const QPointF &p)
{ {
int idx = _zooms.at(_zoom).first; int idx = _zooms.at(_zoom).first;

View File

@ -24,8 +24,8 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);
@ -48,6 +48,8 @@ private:
QVector<QPair<int, int> > _zooms; QVector<QPair<int, int> > _zooms;
QVector<QPair<QRectF, QRectF> > _bounds; QVector<QPair<QRectF, QRectF> > _bounds;
int _zoom; int _zoom;
int _ci, _cz;
}; };
#endif // ATLAS_H #endif // ATLAS_H

View File

@ -64,13 +64,13 @@ void EmptyMap::draw(QPainter *painter, const QRectF &rect)
painter->fillRect(rect, Qt::white); painter->fillRect(rect, Qt::white);
} }
QPointF EmptyMap::ll2xy(const Coordinates &c) const QPointF EmptyMap::ll2xy(const Coordinates &c)
{ {
QPointF m = Mercator().ll2xy(c); QPointF m = Mercator().ll2xy(c);
return QPointF(m.x() / _scale, m.y() / -_scale); return QPointF(m.x() / _scale, m.y() / -_scale);
} }
Coordinates EmptyMap::xy2ll(const QPointF &p) const Coordinates EmptyMap::xy2ll(const QPointF &p)
{ {
QPointF m(p.x() * _scale, -p.y() * _scale); QPointF m(p.x() * _scale, -p.y() * _scale);
return Mercator().xy2ll(m); return Mercator().xy2ll(m);

View File

@ -20,8 +20,8 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);

View File

@ -25,8 +25,8 @@ public:
virtual qreal zoomIn() = 0; virtual qreal zoomIn() = 0;
virtual qreal zoomOut() = 0; virtual qreal zoomOut() = 0;
virtual QPointF ll2xy(const Coordinates &c) const = 0; virtual QPointF ll2xy(const Coordinates &c) = 0;
virtual Coordinates xy2ll(const QPointF &p) const = 0; virtual Coordinates xy2ll(const QPointF &p) = 0;
virtual void draw(QPainter *painter, const QRectF &rect) = 0; virtual void draw(QPainter *painter, const QRectF &rect) = 0;

View File

@ -31,9 +31,9 @@ public:
qreal zoomIn() {return 1.0;} qreal zoomIn() {return 1.0;}
qreal zoomOut() {return 1.0;} qreal zoomOut() {return 1.0;}
QPointF ll2xy(const Coordinates &c) const QPointF ll2xy(const Coordinates &c)
{return _transform.map(_projection->ll2xy(c));} {return _transform.map(_projection->ll2xy(c));}
Coordinates xy2ll(const QPointF &p) const Coordinates xy2ll(const QPointF &p)
{return _projection->xy2ll(_inverted.map(p));} {return _projection->xy2ll(_inverted.map(p));}
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);

View File

@ -232,13 +232,13 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect)
} }
} }
QPointF OnlineMap::ll2xy(const Coordinates &c) const QPointF OnlineMap::ll2xy(const Coordinates &c)
{ {
QPointF m = Mercator().ll2xy(c); QPointF m = Mercator().ll2xy(c);
return QPointF(m.x() / _scale, m.y() / -_scale); return QPointF(m.x() / _scale, m.y() / -_scale);
} }
Coordinates OnlineMap::xy2ll(const QPointF &p) const Coordinates OnlineMap::xy2ll(const QPointF &p)
{ {
QPointF m(p.x() * _scale, -p.y() * _scale); QPointF m(p.x() * _scale, -p.y() * _scale);
return Mercator().xy2ll(m); return Mercator().xy2ll(m);

View File

@ -23,8 +23,8 @@ public:
qreal zoomIn(); qreal zoomIn();
qreal zoomOut(); qreal zoomOut();
QPointF ll2xy(const Coordinates &c) const; QPointF ll2xy(const Coordinates &c);
Coordinates xy2ll(const QPointF &p) const; Coordinates xy2ll(const QPointF &p);
void draw(QPainter *painter, const QRectF &rect); void draw(QPainter *painter, const QRectF &rect);