mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-28 05:34:47 +01:00
Extended error checking
This commit is contained in:
parent
688e309ef7
commit
fa99d01a77
199
src/map/wmts.cpp
199
src/map/wmts.cpp
@ -12,9 +12,9 @@
|
|||||||
|
|
||||||
Downloader *WMTS::_downloader = 0;
|
Downloader *WMTS::_downloader = 0;
|
||||||
|
|
||||||
bool WMTS::createProjection()
|
bool WMTS::createProjection(const QString &crs)
|
||||||
{
|
{
|
||||||
QStringList list(_crs.split(':'));
|
QStringList list(crs.split(':'));
|
||||||
QString authority, code;
|
QString authority, code;
|
||||||
bool res;
|
bool res;
|
||||||
int epsg;
|
int epsg;
|
||||||
@ -92,24 +92,24 @@ WMTS::TileMatrix WMTS::tileMatrix(QXmlStreamReader &reader, bool yx)
|
|||||||
return matrix;
|
return matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMTS::tileMatrixSet(QXmlStreamReader &reader, const QString &set, bool yx)
|
void WMTS::tileMatrixSet(CTX &ctx)
|
||||||
{
|
{
|
||||||
QString id, crs;
|
QString id, crs;
|
||||||
QSet<TileMatrix> matrixes;
|
QSet<TileMatrix> matrixes;
|
||||||
|
|
||||||
while (reader.readNextStartElement()) {
|
while (ctx.reader.readNextStartElement()) {
|
||||||
if (reader.name() == "Identifier")
|
if (ctx.reader.name() == "Identifier")
|
||||||
id = reader.readElementText();
|
id = ctx.reader.readElementText();
|
||||||
else if (reader.name() == "SupportedCRS")
|
else if (ctx.reader.name() == "SupportedCRS")
|
||||||
crs = reader.readElementText();
|
crs = ctx.reader.readElementText();
|
||||||
else if (reader.name() == "TileMatrix")
|
else if (ctx.reader.name() == "TileMatrix")
|
||||||
matrixes.insert(tileMatrix(reader, yx));
|
matrixes.insert(tileMatrix(ctx.reader, ctx.setup.yx));
|
||||||
else
|
else
|
||||||
reader.skipCurrentElement();
|
ctx.reader.skipCurrentElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == set) {
|
if (id == ctx.setup.set) {
|
||||||
_crs = crs;
|
ctx.crs = crs;
|
||||||
_matrixes = matrixes;
|
_matrixes = matrixes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,22 +153,24 @@ QSet<WMTS::MatrixLimits> WMTS::tileMatrixSetLimits(QXmlStreamReader &reader)
|
|||||||
return limits;
|
return limits;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMTS::tileMatrixSetLink(QXmlStreamReader &reader, const QString &set)
|
void WMTS::tileMatrixSetLink(CTX &ctx)
|
||||||
{
|
{
|
||||||
QString id;
|
QString id;
|
||||||
QSet<MatrixLimits> limits;
|
QSet<MatrixLimits> limits;
|
||||||
|
|
||||||
while (reader.readNextStartElement()) {
|
while (ctx.reader.readNextStartElement()) {
|
||||||
if (reader.name() == "TileMatrixSet")
|
if (ctx.reader.name() == "TileMatrixSet")
|
||||||
id = reader.readElementText();
|
id = ctx.reader.readElementText();
|
||||||
else if (reader.name() == "TileMatrixSetLimits")
|
else if (ctx.reader.name() == "TileMatrixSetLimits")
|
||||||
limits = tileMatrixSetLimits(reader);
|
limits = tileMatrixSetLimits(ctx.reader);
|
||||||
else
|
else
|
||||||
reader.skipCurrentElement();
|
ctx.reader.skipCurrentElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == set)
|
if (id == ctx.setup.set) {
|
||||||
|
ctx.set = true;
|
||||||
_limits = limits;
|
_limits = limits;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RectC WMTS::wgs84BoundingBox(QXmlStreamReader &reader)
|
RectC WMTS::wgs84BoundingBox(QXmlStreamReader &reader)
|
||||||
@ -189,83 +191,137 @@ RectC WMTS::wgs84BoundingBox(QXmlStreamReader &reader)
|
|||||||
return RectC(topLeft, bottomRight);
|
return RectC(topLeft, bottomRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMTS::layer(QXmlStreamReader &reader, const QString &layer,
|
QString WMTS::style(QXmlStreamReader &reader)
|
||||||
const QString &set)
|
|
||||||
{
|
{
|
||||||
QString id;
|
QString id;
|
||||||
RectC bounds;
|
|
||||||
QString tpl;
|
|
||||||
|
|
||||||
while (reader.readNextStartElement()) {
|
while (reader.readNextStartElement()) {
|
||||||
if (reader.name() == "Identifier")
|
if (reader.name() == "Identifier")
|
||||||
id = reader.readElementText();
|
id = reader.readElementText();
|
||||||
else if (reader.name() == "TileMatrixSetLink")
|
else
|
||||||
tileMatrixSetLink(reader, set);
|
reader.skipCurrentElement();
|
||||||
else if (reader.name() == "WGS84BoundingBox")
|
}
|
||||||
bounds = wgs84BoundingBox(reader);
|
|
||||||
else if (reader.name() == "ResourceURL") {
|
return id;
|
||||||
const QXmlStreamAttributes &attr = reader.attributes();
|
}
|
||||||
|
|
||||||
|
void WMTS::layer(CTX &ctx)
|
||||||
|
{
|
||||||
|
QString id, tpl;
|
||||||
|
RectC bounds;
|
||||||
|
QStringList formats, styles;
|
||||||
|
|
||||||
|
while (ctx.reader.readNextStartElement()) {
|
||||||
|
if (ctx.reader.name() == "Identifier")
|
||||||
|
id = ctx.reader.readElementText();
|
||||||
|
else if (ctx.reader.name() == "TileMatrixSetLink")
|
||||||
|
tileMatrixSetLink(ctx);
|
||||||
|
else if (ctx.reader.name() == "WGS84BoundingBox")
|
||||||
|
bounds = wgs84BoundingBox(ctx.reader);
|
||||||
|
else if (ctx.reader.name() == "ResourceURL") {
|
||||||
|
const QXmlStreamAttributes &attr = ctx.reader.attributes();
|
||||||
if (attr.value("resourceType") == "tile")
|
if (attr.value("resourceType") == "tile")
|
||||||
tpl = attr.value("template").toString();
|
tpl = attr.value("template").toString();
|
||||||
reader.skipCurrentElement();
|
ctx.reader.skipCurrentElement();
|
||||||
} else
|
} else if (ctx.reader.name() == "Style")
|
||||||
reader.skipCurrentElement();
|
styles.append(style(ctx.reader));
|
||||||
|
else if (ctx.reader.name() == "Format")
|
||||||
|
formats.append(ctx.reader.readElementText());
|
||||||
|
else
|
||||||
|
ctx.reader.skipCurrentElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == layer) {
|
if (id == ctx.setup.layer) {
|
||||||
|
ctx.layer = true;
|
||||||
_bounds = bounds;
|
_bounds = bounds;
|
||||||
_tileUrl = tpl;
|
if (ctx.setup.rest)
|
||||||
|
_tileUrl = tpl;
|
||||||
|
if (styles.contains(ctx.setup.style))
|
||||||
|
ctx.style = true;
|
||||||
|
if (formats.contains(ctx.setup.format))
|
||||||
|
ctx.format = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMTS::contents(QXmlStreamReader &reader, const QString &layer,
|
void WMTS::contents(CTX &ctx)
|
||||||
const QString &set, bool yx)
|
|
||||||
{
|
{
|
||||||
while (reader.readNextStartElement()) {
|
while (ctx.reader.readNextStartElement()) {
|
||||||
if (reader.name() == "TileMatrixSet")
|
if (ctx.reader.name() == "TileMatrixSet")
|
||||||
tileMatrixSet(reader, set, yx);
|
tileMatrixSet(ctx);
|
||||||
else if (reader.name() == "Layer")
|
else if (ctx.reader.name() == "Layer")
|
||||||
WMTS::layer(reader, layer, set);
|
layer(ctx);
|
||||||
else
|
else
|
||||||
reader.skipCurrentElement();
|
ctx.reader.skipCurrentElement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WMTS::capabilities(QXmlStreamReader &reader, const QString &layer,
|
void WMTS::capabilities(CTX &ctx)
|
||||||
const QString &set, bool yx)
|
|
||||||
{
|
{
|
||||||
while (reader.readNextStartElement()) {
|
while (ctx.reader.readNextStartElement()) {
|
||||||
if (reader.name() == "Contents")
|
if (ctx.reader.name() == "Contents")
|
||||||
contents(reader, layer, set, yx);
|
contents(ctx);
|
||||||
else
|
else
|
||||||
reader.skipCurrentElement();
|
ctx.reader.skipCurrentElement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WMTS::parseCapabilities(const QString &path, const QString &layer,
|
bool WMTS::parseCapabilities(const QString &path, const Setup &setup)
|
||||||
const QString &set, bool yx)
|
|
||||||
{
|
{
|
||||||
QFile file(path);
|
QFile file(path);
|
||||||
QXmlStreamReader reader;
|
CTX ctx(setup);
|
||||||
|
|
||||||
if (!file.open(QFile::ReadOnly | QFile::Text)) {
|
if (!file.open(QFile::ReadOnly | QFile::Text)) {
|
||||||
_errorString = file.errorString();
|
_errorString = file.errorString();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
reader.setDevice(&file);
|
ctx.reader.setDevice(&file);
|
||||||
|
if (ctx.reader.readNextStartElement()) {
|
||||||
if (reader.readNextStartElement()) {
|
if (ctx.reader.name() == "Capabilities")
|
||||||
if (reader.name() == "Capabilities")
|
capabilities(ctx);
|
||||||
capabilities(reader, layer, set, yx);
|
|
||||||
else
|
else
|
||||||
reader.raiseError("Not a Capabilities XML file");
|
ctx.reader.raiseError("Not a Capabilities XML file");
|
||||||
|
}
|
||||||
|
if (ctx.reader.error()) {
|
||||||
|
_errorString = QString("%1:%2: %3").arg(path).arg(
|
||||||
|
ctx.reader.lineNumber()).arg(ctx.reader.errorString());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_errorString = reader.error() ? QString("%1:%2: %3").arg(path)
|
if (!ctx.layer) {
|
||||||
.arg(reader.lineNumber()).arg(reader.errorString()) : QString();
|
_errorString = ctx.setup.layer + ": layer not provided";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!ctx.style) {
|
||||||
|
_errorString = ctx.setup.style + ": style not provided";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!ctx.setup.rest && !ctx.format) {
|
||||||
|
_errorString = ctx.setup.format + ": format not provided";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!ctx.set) {
|
||||||
|
_errorString = ctx.setup.set + ": set not provided";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (ctx.crs.isNull()) {
|
||||||
|
_errorString = "Missing CRS definition";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!createProjection(ctx.crs)) {
|
||||||
|
_errorString = ctx.crs + ": unknown CRS";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (_matrixes.isEmpty()) {
|
||||||
|
_errorString = "No usable tile matrix found";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (ctx.setup.rest && _tileUrl.isNull()) {
|
||||||
|
_errorString = "Missing tile URL template";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return reader.error() ? false : true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WMTS::getCapabilities(const QString &url, const QString &file)
|
bool WMTS::getCapabilities(const QString &url, const QString &file)
|
||||||
@ -296,7 +352,7 @@ bool WMTS::load(const QString &file, const WMTS::Setup &setup)
|
|||||||
if (!QFileInfo(file).exists())
|
if (!QFileInfo(file).exists())
|
||||||
if (!getCapabilities(capaUrl, file))
|
if (!getCapabilities(capaUrl, file))
|
||||||
return false;
|
return false;
|
||||||
if (!parseCapabilities(file, setup.layer, setup.set, setup.yx))
|
if (!parseCapabilities(file, setup))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!setup.rest)
|
if (!setup.rest)
|
||||||
@ -312,23 +368,6 @@ bool WMTS::load(const QString &file, const WMTS::Setup &setup)
|
|||||||
_tileUrl.replace("{TileCol}", "$x");
|
_tileUrl.replace("{TileCol}", "$x");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_crs.isNull()) {
|
|
||||||
_errorString = "Missing CRS definition";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!createProjection()) {
|
|
||||||
_errorString = _crs + ": unknown CRS";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (_matrixes.isEmpty()) {
|
|
||||||
_errorString = "No usable tile matrix found";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (_tileUrl.isNull()) {
|
|
||||||
_errorString = "Missing tile URL";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
|
#include <QXmlStreamReader>
|
||||||
#include "common/rectc.h"
|
#include "common/rectc.h"
|
||||||
#include "projection.h"
|
#include "projection.h"
|
||||||
|
|
||||||
class QXmlStreamReader;
|
|
||||||
class Downloader;
|
class Downloader;
|
||||||
|
|
||||||
class WMTS
|
class WMTS
|
||||||
@ -87,27 +87,37 @@ private:
|
|||||||
{return !id.isEmpty() && rect.isValid();}
|
{return !id.isEmpty() && rect.isValid();}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool createProjection();
|
struct CTX {
|
||||||
|
const Setup &setup;
|
||||||
|
QXmlStreamReader reader;
|
||||||
|
|
||||||
|
QString crs;
|
||||||
|
bool layer;
|
||||||
|
bool style;
|
||||||
|
bool format;
|
||||||
|
bool set;
|
||||||
|
|
||||||
|
CTX(const Setup &setup) : setup(setup), layer(false), style(false),
|
||||||
|
format(false), set(false) {}
|
||||||
|
};
|
||||||
|
|
||||||
RectC wgs84BoundingBox(QXmlStreamReader &reader);
|
RectC wgs84BoundingBox(QXmlStreamReader &reader);
|
||||||
MatrixLimits tileMatrixLimits(QXmlStreamReader &reader);
|
MatrixLimits tileMatrixLimits(QXmlStreamReader &reader);
|
||||||
TileMatrix tileMatrix(QXmlStreamReader &reader, bool yx);
|
TileMatrix tileMatrix(QXmlStreamReader &reader, bool yx);
|
||||||
QSet<MatrixLimits> tileMatrixSetLimits(QXmlStreamReader &reader);
|
QSet<MatrixLimits> tileMatrixSetLimits(QXmlStreamReader &reader);
|
||||||
void tileMatrixSet(QXmlStreamReader &reader, const QString &set, bool yx);
|
QString style(QXmlStreamReader &reader);
|
||||||
void tileMatrixSetLink(QXmlStreamReader &reader, const QString &set);
|
void tileMatrixSet(CTX &ctx);
|
||||||
void layer(QXmlStreamReader &reader, const QString &layer,
|
void tileMatrixSetLink(CTX &ctx);
|
||||||
const QString &set);
|
void layer(CTX &ctx);
|
||||||
void contents(QXmlStreamReader &reader, const QString &layer,
|
void contents(CTX &ctx);
|
||||||
const QString &set, bool yx);
|
void capabilities(CTX &ctx);
|
||||||
void capabilities(QXmlStreamReader &reader, const QString &layer,
|
bool parseCapabilities(const QString &path, const Setup &setup);
|
||||||
const QString &set, bool yx);
|
|
||||||
bool parseCapabilities(const QString &path, const QString &layer,
|
|
||||||
const QString &set, bool yx);
|
|
||||||
bool getCapabilities(const QString &url, const QString &file);
|
bool getCapabilities(const QString &url, const QString &file);
|
||||||
|
bool createProjection(const QString &crs);
|
||||||
|
|
||||||
QSet<TileMatrix> _matrixes;
|
QSet<TileMatrix> _matrixes;
|
||||||
QSet<MatrixLimits> _limits;
|
QSet<MatrixLimits> _limits;
|
||||||
RectC _bounds;
|
RectC _bounds;
|
||||||
QString _crs;
|
|
||||||
Projection _projection;
|
Projection _projection;
|
||||||
QString _tileUrl;
|
QString _tileUrl;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user