mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-24 19:55:53 +01:00
Added support for tiles with a different size than 256px
This commit is contained in:
parent
39a8a144dd
commit
5a692c71a8
@ -82,13 +82,40 @@ MBTilesMap::MBTilesMap(const QString &fileName, QObject *parent)
|
|||||||
_bounds = RectC(tl, br);
|
_bounds = RectC(tl, br);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QString sql = QString("SELECT tile_data FROM tiles LIMIT 1");
|
||||||
|
QSqlQuery query(sql, _db);
|
||||||
|
query.first();
|
||||||
|
QImage tile = QImage::fromData(query.value(0).toByteArray());
|
||||||
|
if (tile.isNull() || tile.size().width() != tile.size().height()) {
|
||||||
|
_errorString = "Unsupported/invalid tile images";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_tileSize = tile.size().width();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
QSqlQuery query("SELECT value FROM metadata WHERE name = 'name'", _db);
|
QSqlQuery query("SELECT value FROM metadata WHERE name = 'name'", _db);
|
||||||
if (query.first())
|
if (query.first())
|
||||||
_name = query.value(0).toString();
|
_name = query.value(0).toString();
|
||||||
else
|
else {
|
||||||
|
qWarning("%s: missing map name", qPrintable(_fileName));
|
||||||
_name = QFileInfo(_fileName).fileName();
|
_name = QFileInfo(_fileName).fileName();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
QSqlQuery query(
|
||||||
|
"SELECT value FROM metadata WHERE name = 'tilepixelratio'", _db);
|
||||||
|
if (query.first()) {
|
||||||
|
bool ok;
|
||||||
|
_tileRatio = query.value(0).toString().toDouble(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
_errorString = "Invalid tile pixel ratio";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_db.close();
|
_db.close();
|
||||||
|
|
||||||
@ -128,7 +155,7 @@ int MBTilesMap::zoomFit(const QSize &size, const RectC &rect)
|
|||||||
QRectF tbr(osm::ll2m(rect.topLeft()), osm::ll2m(rect.bottomRight()));
|
QRectF tbr(osm::ll2m(rect.topLeft()), osm::ll2m(rect.bottomRight()));
|
||||||
QPointF sc(tbr.width() / size.width(), tbr.height() / size.height());
|
QPointF sc(tbr.width() / size.width(), tbr.height() / size.height());
|
||||||
_zoom = limitZoom(osm::scale2zoom(qMax(sc.x(), -sc.y())
|
_zoom = limitZoom(osm::scale2zoom(qMax(sc.x(), -sc.y())
|
||||||
/ coordinatesRatio()));
|
/ coordinatesRatio(), _tileSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
return _zoom;
|
return _zoom;
|
||||||
@ -136,7 +163,7 @@ int MBTilesMap::zoomFit(const QSize &size, const RectC &rect)
|
|||||||
|
|
||||||
qreal MBTilesMap::resolution(const QRectF &rect)
|
qreal MBTilesMap::resolution(const QRectF &rect)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, _tileSize);
|
||||||
|
|
||||||
return (WGS84_RADIUS * 2.0 * M_PI * scale / 360.0
|
return (WGS84_RADIUS * 2.0 * M_PI * scale / 360.0
|
||||||
* cos(2.0 * atan(exp(deg2rad(-rect.center().y() * scale))) - M_PI/2));
|
* cos(2.0 * atan(exp(deg2rad(-rect.center().y() * scale))) - M_PI/2));
|
||||||
@ -166,7 +193,7 @@ qreal MBTilesMap::imageRatio() const
|
|||||||
|
|
||||||
qreal MBTilesMap::tileSize() const
|
qreal MBTilesMap::tileSize() const
|
||||||
{
|
{
|
||||||
return (TILE_SIZE / coordinatesRatio());
|
return (_tileSize / coordinatesRatio());
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray MBTilesMap::tileData(int zoom, const QPoint &tile) const
|
QByteArray MBTilesMap::tileData(int zoom, const QPoint &tile) const
|
||||||
@ -188,7 +215,7 @@ QByteArray MBTilesMap::tileData(int zoom, const QPoint &tile) const
|
|||||||
void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
||||||
{
|
{
|
||||||
Q_UNUSED(flags);
|
Q_UNUSED(flags);
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, _tileSize);
|
||||||
QRectF b(bounds());
|
QRectF b(bounds());
|
||||||
|
|
||||||
|
|
||||||
@ -224,14 +251,14 @@ void MBTilesMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
|||||||
|
|
||||||
QPointF MBTilesMap::ll2xy(const Coordinates &c)
|
QPointF MBTilesMap::ll2xy(const Coordinates &c)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, _tileSize);
|
||||||
QPointF m = osm::ll2m(c);
|
QPointF m = osm::ll2m(c);
|
||||||
return QPointF(m.x() / scale, m.y() / -scale) / coordinatesRatio();
|
return QPointF(m.x() / scale, m.y() / -scale) / coordinatesRatio();
|
||||||
}
|
}
|
||||||
|
|
||||||
Coordinates MBTilesMap::xy2ll(const QPointF &p)
|
Coordinates MBTilesMap::xy2ll(const QPointF &p)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, _tileSize);
|
||||||
return osm::m2ll(QPointF(p.x() * scale, -p.y() * scale)
|
return osm::m2ll(QPointF(p.x() * scale, -p.y() * scale)
|
||||||
* coordinatesRatio());
|
* coordinatesRatio());
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ private:
|
|||||||
RectC _bounds;
|
RectC _bounds;
|
||||||
Range _zooms;
|
Range _zooms;
|
||||||
int _zoom;
|
int _zoom;
|
||||||
|
int _tileSize;
|
||||||
qreal _deviceRatio, _tileRatio;
|
qreal _deviceRatio, _tileRatio;
|
||||||
|
|
||||||
bool _valid;
|
bool _valid;
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "onlinemap.h"
|
#include "onlinemap.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define TILE_SIZE 256
|
||||||
|
|
||||||
OnlineMap::OnlineMap(const QString &name, const QString &url,
|
OnlineMap::OnlineMap(const QString &name, const QString &url,
|
||||||
const Range &zooms, const RectC &bounds, qreal tileRatio,
|
const Range &zooms, const RectC &bounds, qreal tileRatio,
|
||||||
const Authorization &authorization, QObject *parent)
|
const Authorization &authorization, QObject *parent)
|
||||||
@ -53,7 +55,7 @@ int OnlineMap::zoomFit(const QSize &size, const RectC &rect)
|
|||||||
QRectF tbr(osm::ll2m(rect.topLeft()), osm::ll2m(rect.bottomRight()));
|
QRectF tbr(osm::ll2m(rect.topLeft()), osm::ll2m(rect.bottomRight()));
|
||||||
QPointF sc(tbr.width() / size.width(), tbr.height() / size.height());
|
QPointF sc(tbr.width() / size.width(), tbr.height() / size.height());
|
||||||
_zoom = limitZoom(osm::scale2zoom(qMax(sc.x(), -sc.y())
|
_zoom = limitZoom(osm::scale2zoom(qMax(sc.x(), -sc.y())
|
||||||
/ coordinatesRatio()));
|
/ coordinatesRatio(), TILE_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
return _zoom;
|
return _zoom;
|
||||||
@ -61,7 +63,7 @@ int OnlineMap::zoomFit(const QSize &size, const RectC &rect)
|
|||||||
|
|
||||||
qreal OnlineMap::resolution(const QRectF &rect)
|
qreal OnlineMap::resolution(const QRectF &rect)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, TILE_SIZE);
|
||||||
|
|
||||||
return (WGS84_RADIUS * 2.0 * M_PI * scale / 360.0
|
return (WGS84_RADIUS * 2.0 * M_PI * scale / 360.0
|
||||||
* cos(2.0 * atan(exp(deg2rad(-rect.center().y() * scale))) - M_PI/2));
|
* cos(2.0 * atan(exp(deg2rad(-rect.center().y() * scale))) - M_PI/2));
|
||||||
@ -96,7 +98,7 @@ qreal OnlineMap::tileSize() const
|
|||||||
|
|
||||||
void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, TILE_SIZE);
|
||||||
QRectF b(bounds());
|
QRectF b(bounds());
|
||||||
|
|
||||||
QPoint tile = osm::mercator2tile(QPointF(rect.topLeft().x() * scale,
|
QPoint tile = osm::mercator2tile(QPointF(rect.topLeft().x() * scale,
|
||||||
@ -131,14 +133,14 @@ void OnlineMap::draw(QPainter *painter, const QRectF &rect, Flags flags)
|
|||||||
|
|
||||||
QPointF OnlineMap::ll2xy(const Coordinates &c)
|
QPointF OnlineMap::ll2xy(const Coordinates &c)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, TILE_SIZE);
|
||||||
QPointF m = osm::ll2m(c);
|
QPointF m = osm::ll2m(c);
|
||||||
return QPointF(m.x() / scale, m.y() / -scale) / coordinatesRatio();
|
return QPointF(m.x() / scale, m.y() / -scale) / coordinatesRatio();
|
||||||
}
|
}
|
||||||
|
|
||||||
Coordinates OnlineMap::xy2ll(const QPointF &p)
|
Coordinates OnlineMap::xy2ll(const QPointF &p)
|
||||||
{
|
{
|
||||||
qreal scale = osm::zoom2scale(_zoom);
|
qreal scale = osm::zoom2scale(_zoom, TILE_SIZE);
|
||||||
return osm::m2ll(QPointF(p.x() * scale, -p.y() * scale)
|
return osm::m2ll(QPointF(p.x() * scale, -p.y() * scale)
|
||||||
* coordinatesRatio());
|
* coordinatesRatio());
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,12 @@ QPoint osm::mercator2tile(const QPointF &m, int z)
|
|||||||
(int)(floor((1.0 - (m.y() / 180.0)) / 2.0 * (1<<z))));
|
(int)(floor((1.0 - (m.y() / 180.0)) / 2.0 * (1<<z))));
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal osm::zoom2scale(int zoom)
|
qreal osm::zoom2scale(int zoom, int tileSize)
|
||||||
{
|
{
|
||||||
return (360.0/(qreal)((1<<zoom) * TILE_SIZE));
|
return (360.0/(qreal)((1<<zoom) * tileSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
int osm::scale2zoom(qreal scale)
|
int osm::scale2zoom(qreal scale, int tileSize)
|
||||||
{
|
{
|
||||||
return (int)(log2(360.0/(scale * (qreal)TILE_SIZE)) + EPSILON);
|
return (int)(log2(360.0/(scale * (qreal)tileSize)) + EPSILON);
|
||||||
}
|
}
|
||||||
|
@ -4,15 +4,13 @@
|
|||||||
#include <QPointF>
|
#include <QPointF>
|
||||||
#include <common/coordinates.h>
|
#include <common/coordinates.h>
|
||||||
|
|
||||||
#define TILE_SIZE 256
|
|
||||||
|
|
||||||
namespace osm
|
namespace osm
|
||||||
{
|
{
|
||||||
QPointF ll2m(const Coordinates &c);
|
QPointF ll2m(const Coordinates &c);
|
||||||
Coordinates m2ll(const QPointF &p);
|
Coordinates m2ll(const QPointF &p);
|
||||||
QPoint mercator2tile(const QPointF &m, int z);
|
QPoint mercator2tile(const QPointF &m, int z);
|
||||||
qreal zoom2scale(int zoom);
|
qreal zoom2scale(int zoom, int tileSize);
|
||||||
int scale2zoom(qreal scale);
|
int scale2zoom(qreal scale, int tileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // OSM_H
|
#endif // OSM_H
|
||||||
|
Loading…
Reference in New Issue
Block a user