1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-06-27 19:49:15 +02:00

Added support for Geographic 2D projections (coordinate systems) in vector maps

This commit is contained in:
2019-08-01 08:36:58 +02:00
parent 38b62c0121
commit 5f5b391cd9
21 changed files with 109 additions and 98 deletions

View File

@ -229,6 +229,18 @@ Coordinates GCS::fromWGS84(const Coordinates &c) const
return Coordinates(_primeMeridian.fromGreenwich(ds.lon()), ds.lat());
}
QList<KV<int, QString> > GCS::list()
{
QList<KV<int, QString> > list;
for (int i = 0; i < _gcss.size(); i++)
if (_gcss.at(i).id())
list.append(KV<int, QString>(_gcss.at(i).id(), _gcss.at(i).name()
+ " / Geographic 2D"));
return list;
}
#ifndef QT_NO_DEBUG
QDebug operator<<(QDebug dbg, const GCS &gcs)
{

View File

@ -1,6 +1,7 @@
#ifndef GCS_H
#define GCS_H
#include "common/kv.h"
#include "datum.h"
#include "angularunits.h"
#include "primemeridian.h"
@ -32,6 +33,7 @@ public:
static const GCS &WGS84();
static void loadList(const QString &path);
static QList<KV<int, QString> > list();
private:
class Entry;

View File

@ -73,12 +73,12 @@ private:
};
static Range zooms(12, 28);
static const Range zooms(12, 28);
static QColor shieldColor(Qt::white);
static QColor shieldBgColor1("#dd3e3e");
static QColor shieldBgColor2("#379947");
static QColor shieldBgColor3("#4a7fc1");
static const QColor shieldColor(Qt::white);
static const QColor shieldBgColor1("#dd3e3e");
static const QColor shieldBgColor2("#379947");
static const QColor shieldBgColor3("#4a7fc1");
static QString convertUnits(const QString &str)
{
@ -259,7 +259,8 @@ void IMGMap::setZoom(int zoom)
Transform IMGMap::transform(int zoom) const
{
double scale = (2.0 * M_PI * WGS84_RADIUS) / (1<<zoom);
double scale = _projection.isGeographic()
? 360.0 / (1<<zoom) : (2.0 * M_PI * WGS84_RADIUS) / (1<<zoom);
PointD topLeft(_projection.ll2xy(_img.bounds().topLeft()));
return Transform(ReferencePoint(PointD(0, 0), topLeft),
PointD(scale, scale));

View File

@ -196,8 +196,8 @@ void MapSource::map(QXmlStreamReader &reader, Config &config)
if (!attr.hasAttribute("id"))
reader.raiseError("Missing dimension id");
else
config.dimensions.append(KV(attr.value("id").toString(),
reader.readElementText()));
config.dimensions.append(KV<QString, QString>
(attr.value("id").toString(), reader.readElementText()));
} else if (reader.name() == "crs") {
config.coordinateSystem = coordinateSystem(reader);
config.crs = reader.readElementText();

View File

@ -38,7 +38,7 @@ private:
QString crs;
CoordinateSystem coordinateSystem;
bool rest;
QList<KV> dimensions;
QList<KV<QString, QString> > dimensions;
Authorization authorization;
qreal tileRatio;
int tileSize;

View File

@ -223,12 +223,12 @@ void PCS::loadList(const QString &path)
}
}
QList<PCS::Info> PCS::pcsList()
QList<KV<int, QString> > PCS::list()
{
QList<Info> list;
QList<KV<int, QString> > list;
for (int i = 0; i < _pcss.size(); i++)
list.append(Info(_pcss.at(i).id(), _pcss.at(i).name()));
list.append(KV<int, QString>(_pcss.at(i).id(), _pcss.at(i).name()));
return list;
}

View File

@ -3,6 +3,7 @@
#include <QDebug>
#include <QList>
#include "common/kv.h"
#include "gcs.h"
#include "linearunits.h"
#include "coordinatesystem.h"
@ -11,20 +12,6 @@
class PCS
{
public:
class Info {
public:
Info(int id, const QString &name) : _id(id), _name(name) {}
int id() const {return _id;}
const QString &name() const {return _name;}
bool operator<(const Info &other) const {return _id < other._id;}
private:
int _id;
QString _name;
};
PCS() : _gcs(0) {}
PCS(const GCS *gcs, const Projection::Method &method,
const Projection::Setup &setup, const LinearUnits &units,
@ -48,7 +35,7 @@ public:
static void loadList(const QString &path);
static const PCS *pcs(int id);
static const PCS *pcs(const GCS *gcs, int proj);
static QList<Info> pcsList();
static QList<KV<int, QString> > list();
private:
class Entry;

View File

@ -20,7 +20,7 @@ public:
public:
Setup(const QString &url, const QString &layer, const QString &style,
const QString &format, const QString &crs, const CoordinateSystem &cs,
const QList<KV> &dimensions,
const QList<KV<QString, QString> > &dimensions,
const Authorization &authorization = Authorization())
: _url(url), _layer(layer), _style(style), _format(format),
_crs(crs), _cs(cs), _dimensions(dimensions),
@ -33,7 +33,8 @@ public:
const QString &format() const {return _format;}
const QString &crs() const {return _crs;}
const CoordinateSystem &coordinateSystem() const {return _cs;}
const QList<KV> &dimensions() const {return _dimensions;}
const QList<KV<QString, QString> > &dimensions() const
{return _dimensions;}
private:
QString _url;
@ -42,7 +43,7 @@ public:
QString _format;
QString _crs;
CoordinateSystem _cs;
QList<KV> _dimensions;
QList<KV<QString, QString> > _dimensions;
Authorization _authorization;
};

View File

@ -34,7 +34,7 @@ QString WMSMap::tileUrl(const QString &version) const
url.append(QString("&SRS=%1").arg(_setup.crs()));
for (int i = 0; i < _setup.dimensions().size(); i++) {
const KV &dim = _setup.dimensions().at(i);
const KV<QString, QString> &dim = _setup.dimensions().at(i);
url.append(QString("&%1=%2").arg(dim.key(), dim.value()));
}

View File

@ -335,7 +335,7 @@ WMTS::WMTS(const QString &file, const WMTS::Setup &setup) : _valid(false)
setup.url().contains('?') ? "&" : "?" , setup.format(),
setup.layer(), style, setup.set());
for (int i = 0; i < setup.dimensions().size(); i++) {
const KV &dim = setup.dimensions().at(i);
const KV<QString, QString> &dim = setup.dimensions().at(i);
_tileUrl.append(QString("&%1=%2").arg(dim.key(), dim.value()));
}
} else {
@ -345,7 +345,7 @@ WMTS::WMTS(const QString &file, const WMTS::Setup &setup) : _valid(false)
_tileUrl.replace("{TileRow}", "$y", Qt::CaseInsensitive);
_tileUrl.replace("{TileCol}", "$x", Qt::CaseInsensitive);
for (int i = 0; i < setup.dimensions().size(); i++) {
const KV &dim = setup.dimensions().at(i);
const KV<QString, QString> &dim = setup.dimensions().at(i);
_tileUrl.replace(QString("{%1}").arg(dim.key()), dim.value(),
Qt::CaseInsensitive);
}

View File

@ -22,7 +22,8 @@ public:
public:
Setup(const QString &url, const QString &layer, const QString &set,
const QString &style, const QString &format, bool rest,
const CoordinateSystem &cs, const QList<KV> &dimensions,
const CoordinateSystem &cs,
const QList<KV<QString, QString> > &dimensions,
const Authorization &authorization = Authorization())
: _url(url), _layer(layer), _set(set), _style(style),
_format(format), _rest(rest), _cs(cs), _dimensions(dimensions),
@ -36,7 +37,8 @@ public:
const QString &format() const {return _format;}
bool rest() const {return _rest;}
const CoordinateSystem &coordinateSystem() const {return _cs;}
const QList<KV> &dimensions() const {return _dimensions;}
const QList<KV<QString, QString> > &dimensions() const
{return _dimensions;}
private:
QString _url;
@ -46,7 +48,7 @@ public:
QString _format;
bool _rest;
CoordinateSystem _cs;
QList<KV> _dimensions;
QList<KV<QString, QString> > _dimensions;
Authorization _authorization;
};