2017-03-18 01:30:31 +01:00
|
|
|
#include <QtGlobal>
|
|
|
|
#include <QPainter>
|
2017-11-26 18:54:03 +01:00
|
|
|
#include "common/coordinates.h"
|
|
|
|
#include "common/rectc.h"
|
|
|
|
#include "common/wgs84.h"
|
2017-03-18 01:30:31 +01:00
|
|
|
#include "emptymap.h"
|
|
|
|
|
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
#define ZOOM_MIN 0
|
|
|
|
#define ZOOM_MAX 19
|
|
|
|
#define TILE_SIZE 256
|
2017-03-18 01:30:31 +01:00
|
|
|
|
2018-02-16 19:37:04 +01:00
|
|
|
static QPointF ll2m(const Coordinates &c)
|
|
|
|
{
|
2018-05-15 21:51:56 +02:00
|
|
|
return QPointF(c.lon(), rad2deg(log(tan(M_PI_4 + deg2rad(c.lat())/2.0))));
|
2018-02-16 19:37:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static Coordinates m2ll(const QPointF &p)
|
|
|
|
{
|
2018-05-15 21:51:56 +02:00
|
|
|
return Coordinates(p.x(), rad2deg(2.0 * atan(exp(deg2rad(p.y()))) - M_PI_2));
|
2018-02-16 19:37:04 +01:00
|
|
|
}
|
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
static qreal zoom2scale(int zoom)
|
|
|
|
{
|
|
|
|
return (360.0/(qreal)((1<<zoom) * TILE_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
static int scale2zoom(qreal scale)
|
|
|
|
{
|
|
|
|
return (int)log2(360.0/(scale * (qreal)TILE_SIZE));
|
|
|
|
}
|
|
|
|
|
|
|
|
static int limitZoom(int zoom)
|
|
|
|
{
|
|
|
|
if (zoom < ZOOM_MIN)
|
|
|
|
return ZOOM_MIN;
|
|
|
|
if (zoom > ZOOM_MAX)
|
|
|
|
return ZOOM_MAX;
|
|
|
|
|
|
|
|
return zoom;
|
|
|
|
}
|
|
|
|
|
2018-02-16 19:37:04 +01:00
|
|
|
|
2017-03-18 01:30:31 +01:00
|
|
|
EmptyMap::EmptyMap(QObject *parent) : Map(parent)
|
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
_zoom = ZOOM_MAX;
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QRectF EmptyMap::bounds() const
|
|
|
|
{
|
2018-01-26 01:26:26 +01:00
|
|
|
return QRectF(ll2xy(Coordinates(-180, 85)), ll2xy(Coordinates(180, -85)));
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
int EmptyMap::zoomFit(const QSize &size, const RectC &rect)
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-04-16 20:26:10 +02:00
|
|
|
if (!rect.isValid())
|
2018-02-28 22:19:46 +01:00
|
|
|
_zoom = ZOOM_MAX;
|
2017-03-18 01:30:31 +01:00
|
|
|
else {
|
2018-04-16 20:26:10 +02:00
|
|
|
QRectF tbr(ll2m(rect.topLeft()), ll2m(rect.bottomRight()));
|
2017-03-18 01:30:31 +01:00
|
|
|
QPointF sc(tbr.width() / size.width(), tbr.height() / size.height());
|
|
|
|
|
2018-04-16 20:26:10 +02:00
|
|
|
_zoom = limitZoom(scale2zoom(qMax(sc.x(), -sc.y())));
|
2018-02-28 22:19:46 +01:00
|
|
|
}
|
2017-03-18 01:30:31 +01:00
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
return _zoom;
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-06-30 12:14:58 +02:00
|
|
|
qreal EmptyMap::resolution(const QRectF &rect)
|
2017-06-26 00:20:42 +02:00
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
qreal scale = zoom2scale(_zoom);
|
2017-06-26 00:20:42 +02:00
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
return (WGS84_RADIUS * 2.0 * M_PI * scale / 360.0
|
|
|
|
* cos(2.0 * atan(exp(deg2rad(-rect.center().y() * scale))) - M_PI/2));
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
int EmptyMap::zoomIn()
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
_zoom = qMin(_zoom + 1, ZOOM_MAX);
|
|
|
|
return _zoom;
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-02-28 22:19:46 +01:00
|
|
|
int EmptyMap::zoomOut()
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
_zoom = qMax(_zoom - 1, ZOOM_MIN);
|
|
|
|
return _zoom;
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-04-28 16:07:32 +02:00
|
|
|
void EmptyMap::draw(QPainter *painter, const QRectF &rect, bool block)
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-05-22 22:40:15 +02:00
|
|
|
Q_UNUSED(painter);
|
|
|
|
Q_UNUSED(rect);
|
2018-04-28 16:07:32 +02:00
|
|
|
Q_UNUSED(block);
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-01-26 01:26:26 +01:00
|
|
|
QPointF EmptyMap::ll2xy(const Coordinates &c) const
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
qreal scale = zoom2scale(_zoom);
|
2018-02-16 19:37:04 +01:00
|
|
|
QPointF m = ll2m(c);
|
2018-02-28 22:19:46 +01:00
|
|
|
return QPointF(m.x() / scale, m.y() / -scale);
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|
|
|
|
|
2018-01-26 01:26:26 +01:00
|
|
|
Coordinates EmptyMap::xy2ll(const QPointF &p) const
|
2017-03-18 01:30:31 +01:00
|
|
|
{
|
2018-02-28 22:19:46 +01:00
|
|
|
qreal scale = zoom2scale(_zoom);
|
|
|
|
return m2ll(QPointF(p.x() * scale, -p.y() * scale));
|
2017-03-18 01:30:31 +01:00
|
|
|
}
|