mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-28 05:34:47 +01:00
Added support for ZIPed DEM files
This commit is contained in:
parent
7e39a34d0e
commit
c3f345c7f9
@ -1,7 +1,21 @@
|
|||||||
|
/*
|
||||||
|
WARNING: This code uses internal Qt API - the QZipReader class for reading
|
||||||
|
ZIP files - and things may break if Qt changes the API. For Qt5 this is not
|
||||||
|
a problem as we can "see the future" now and there are no changes in all
|
||||||
|
the supported Qt5 versions up to the last one (5.15). In Qt6 the class
|
||||||
|
might change or even disappear in the future, but this is very unlikely
|
||||||
|
as there were no changes for several years and The Qt Company's policy
|
||||||
|
is: "do not invest any resources into any desktop related stuff unless
|
||||||
|
absolutely necessary". There is an issue (QTBUG-3897) since the year 2009 to
|
||||||
|
include the ZIP reader into the public API, which aptly illustrates the
|
||||||
|
effort The Qt Company is willing to make about anything desktop related...
|
||||||
|
*/
|
||||||
|
|
||||||
#include <QtEndian>
|
#include <QtEndian>
|
||||||
#include <QtMath>
|
#include <QtMath>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <private/qzipreader_p.h>
|
||||||
#include "common/coordinates.h"
|
#include "common/coordinates.h"
|
||||||
#include "dem.h"
|
#include "dem.h"
|
||||||
|
|
||||||
@ -55,15 +69,19 @@ static qreal height(const Coordinates &c, const QByteArray *data)
|
|||||||
QString DEM::_dir;
|
QString DEM::_dir;
|
||||||
QCache<DEM::Key, QByteArray> DEM::_data;
|
QCache<DEM::Key, QByteArray> DEM::_data;
|
||||||
|
|
||||||
QString DEM::fileName(const Key &key)
|
QString DEM::baseName(const Key &key)
|
||||||
{
|
{
|
||||||
const char ns = (key.lat() >= 0) ? 'N' : 'S';
|
const char ns = (key.lat() >= 0) ? 'N' : 'S';
|
||||||
const char ew = (key.lon() >= 0) ? 'E' : 'W';
|
const char ew = (key.lon() >= 0) ? 'E' : 'W';
|
||||||
|
|
||||||
QString basename = QString("%1%2%3%4.hgt").arg(ns)
|
return QString("%1%2%3%4.hgt").arg(ns)
|
||||||
.arg(qAbs(key.lat()), 2, 10, QChar('0')).arg(ew)
|
.arg(qAbs(key.lat()), 2, 10, QChar('0')).arg(ew)
|
||||||
.arg(qAbs(key.lon()), 3, 10, QChar('0'));
|
.arg(qAbs(key.lon()), 3, 10, QChar('0'));
|
||||||
return QDir(_dir).absoluteFilePath(basename);
|
}
|
||||||
|
|
||||||
|
QString DEM::fileName(const QString &baseName)
|
||||||
|
{
|
||||||
|
return QDir(_dir).absoluteFilePath(baseName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DEM::setDir(const QString &path)
|
void DEM::setDir(const QString &path)
|
||||||
@ -80,17 +98,29 @@ qreal DEM::elevation(const Coordinates &c)
|
|||||||
|
|
||||||
QByteArray *ba = _data[k];
|
QByteArray *ba = _data[k];
|
||||||
if (!ba) {
|
if (!ba) {
|
||||||
QFile file(fileName(k));
|
QString bn(baseName(k));
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
QString fn(fileName(bn));
|
||||||
qWarning("%s: %s", qPrintable(file.fileName()),
|
QString zn(fn + ".zip");
|
||||||
qPrintable(file.errorString()));
|
|
||||||
_data.insert(k, new QByteArray());
|
if (QFileInfo::exists(zn)) {
|
||||||
return NAN;
|
QZipReader zip(zn, QIODevice::ReadOnly);
|
||||||
} else {
|
ba = new QByteArray(zip.fileData(bn));
|
||||||
ba = new QByteArray(file.readAll());
|
|
||||||
qreal ele = height(c, ba);
|
qreal ele = height(c, ba);
|
||||||
_data.insert(k, ba);
|
_data.insert(k, ba);
|
||||||
return ele;
|
return ele;
|
||||||
|
} else {
|
||||||
|
QFile file(fn);
|
||||||
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
|
qWarning("%s: %s", qPrintable(file.fileName()),
|
||||||
|
qPrintable(file.errorString()));
|
||||||
|
_data.insert(k, new QByteArray());
|
||||||
|
return NAN;
|
||||||
|
} else {
|
||||||
|
ba = new QByteArray(file.readAll());
|
||||||
|
qreal ele = height(c, ba);
|
||||||
|
_data.insert(k, ba);
|
||||||
|
return ele;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
return height(c, ba);
|
return height(c, ba);
|
||||||
|
@ -27,7 +27,8 @@ private:
|
|||||||
int _lon, _lat;
|
int _lon, _lat;
|
||||||
};
|
};
|
||||||
|
|
||||||
static QString fileName(const Key &key);
|
static QString baseName(const Key &key);
|
||||||
|
static QString fileName(const QString &baseName);
|
||||||
|
|
||||||
static QString _dir;
|
static QString _dir;
|
||||||
static QCache<Key, QByteArray> _data;
|
static QCache<Key, QByteArray> _data;
|
||||||
|
Loading…
Reference in New Issue
Block a user