mirror of
https://github.com/tumic0/GPXSee.git
synced 2024-11-30 22:51:16 +01:00
Compare commits
2 Commits
2c804780c4
...
148de41eb7
Author | SHA1 | Date | |
---|---|---|---|
148de41eb7 | |||
75a757cc0c |
@ -118,6 +118,7 @@ HEADERS += src/common/config.h \
|
||||
src/GUI/pngexportdialog.h \
|
||||
src/GUI/timezoneinfo.h \
|
||||
src/GUI/passwordedit.h \
|
||||
src/data/gpsdumpparser.h \
|
||||
src/data/style.h \
|
||||
src/data/twonavparser.h \
|
||||
src/map/ENC/attributes.h \
|
||||
@ -338,6 +339,7 @@ SOURCES += src/main.cpp \
|
||||
src/GUI/pngexportdialog.cpp \
|
||||
src/GUI/projectioncombobox.cpp \
|
||||
src/GUI/passwordedit.cpp \
|
||||
src/data/gpsdumpparser.cpp \
|
||||
src/data/twonavparser.cpp \
|
||||
src/map/ENC/atlasdata.cpp \
|
||||
src/map/ENC/mapdata.cpp \
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -16,4 +16,4 @@ Icon=gpxsee
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Graphics;Viewer;Education;Geography;Maps;Sports;Qt
|
||||
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt;application/vnd.orux.map+xml;application/vnd.iho.s57-data;application/vnd.iho.s57-catalogue
|
||||
MimeType=application/gpx+xml;application/vnd.garmin.tcx+xml;application/vnd.ant.fit;application/vnd.google-earth.kml+xml;application/vnd.fai.igc;application/vnd.nmea.nmea;application/vnd.oziexplorer.plt;application/vnd.oziexplorer.rte;application/vnd.oziexplorer.wpt;application/vnd.groundspeak.loc+xml;application/vnd.sigma.slf+xml;application/geo+json;application/vnd.naviter.seeyou.cup;application/vnd.garmin.gpi;application/vnd.suunto.sml+xml;image/jpeg;text/csv;application/vnd.garmin.img;application/vnd.garmin.jnx;application/vnd.garmin.gmap+xml;image/vnd.maptech.kap;application/vnd.oziexplorer.map;application/vnd.mapbox.mbtiles;application/vnd.twonav.rmap;application/vnd.trekbuddy.tba;application/vnd.gpxsee.map+xml;application/x-tar;image/tiff;application/vnd.google-earth.kmz;application/vnd.alpinequest.aqm;application/vnd.cgtk.gemf;application/vnd.rmaps.sqlite;application/vnd.osmdroid.sqlite;application/vnd.mapsforge.map;application/vnd.tomtom.ov2;application/vnd.tomtom.itn;application/vnd.esri.wld;application/vnd.onmove.omd;application/vnd.onmove.ghp;application/vnd.memory-map.qct;application/vnd.twonav.trk;application/vnd.twonav.rte;application/vnd.twonav.wpt;application/vnd.orux.map+xml;application/vnd.iho.s57-data;application/vnd.iho.s57-catalogue;application/vnd.gpsdump.wpt
|
||||
|
@ -177,6 +177,16 @@
|
||||
<glob pattern="*.wpt"/>
|
||||
</mime-type>
|
||||
|
||||
<mime-type type="application/vnd.gpsdump.wpt">
|
||||
<comment>GPSDump Waypoint File</comment>
|
||||
<sub-class-of type="text/plain"/>
|
||||
<generic-icon name="text/plain"/>
|
||||
<magic>
|
||||
<match type="string" offset="0" value="$FormatGEO"/>
|
||||
<match type="string" offset="0" value="$FormatUTM"/>
|
||||
</magic>
|
||||
<glob pattern="*.wpt"/>
|
||||
</mime-type>
|
||||
|
||||
<!-- Maps -->
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "itnparser.h"
|
||||
#include "onmoveparsers.h"
|
||||
#include "twonavparser.h"
|
||||
#include "gpsdumpparser.h"
|
||||
#include "data.h"
|
||||
|
||||
|
||||
@ -46,6 +47,7 @@ static ITNParser itn;
|
||||
static OMDParser omd;
|
||||
static GHPParser ghp;
|
||||
static TwoNavParser twonav;
|
||||
static GPSDumpParser gpsdump;
|
||||
|
||||
static QMultiMap<QString, Parser*> parsers()
|
||||
{
|
||||
@ -78,6 +80,7 @@ static QMultiMap<QString, Parser*> parsers()
|
||||
map.insert("trk", &twonav);
|
||||
map.insert("rte", &twonav);
|
||||
map.insert("wpt", &twonav);
|
||||
map.insert("wpt", &gpsdump);
|
||||
|
||||
return map;
|
||||
}
|
||||
@ -174,6 +177,7 @@ QString Data::formats()
|
||||
+ qApp->translate("Data", "SML files") + " (*.sml);;"
|
||||
+ qApp->translate("Data", "TCX files") + " (*.tcx);;"
|
||||
+ qApp->translate("Data", "TwoNav files") + " (*.rte *.trk *.wpt);;"
|
||||
+ qApp->translate("Data", "GPSDump files") + " (*.wpt);;"
|
||||
+ qApp->translate("Data", "All files") + " (*)";
|
||||
}
|
||||
|
||||
|
161
src/data/gpsdumpparser.cpp
Normal file
161
src/data/gpsdumpparser.cpp
Normal file
@ -0,0 +1,161 @@
|
||||
#include <QRegularExpression>
|
||||
#include "map/pcs.h"
|
||||
#include "map/gcs.h"
|
||||
#include "map/utm.h"
|
||||
#include "gpsdumpparser.h"
|
||||
|
||||
static double dms2dd(const QStringList &dms)
|
||||
{
|
||||
bool ok;
|
||||
|
||||
int deg = dms.at(1).toInt(&ok);
|
||||
if (!ok)
|
||||
return NAN;
|
||||
int min = dms.at(2).toInt(&ok);
|
||||
if (!ok)
|
||||
return NAN;
|
||||
double sec = dms.at(3).toDouble(&ok);
|
||||
if (!ok)
|
||||
return NAN;
|
||||
|
||||
return deg + min/60.0 + sec/3600.0;
|
||||
}
|
||||
|
||||
static double parseLon(const QString &str)
|
||||
{
|
||||
QStringList dms(str.split(' '));
|
||||
if (dms.size() < 4)
|
||||
return NAN;
|
||||
|
||||
double dd = dms2dd(dms);
|
||||
if (std::isnan(dd))
|
||||
return NAN;
|
||||
|
||||
if (dms.at(0) == 'W')
|
||||
return -dd;
|
||||
else if (dms.at(0) == 'E')
|
||||
return dd;
|
||||
else
|
||||
return NAN;
|
||||
}
|
||||
|
||||
static double parseLat(const QString &str)
|
||||
{
|
||||
QStringList dms(str.split(' '));
|
||||
if (dms.size() < 4)
|
||||
return NAN;
|
||||
|
||||
double dd = dms2dd(dms);
|
||||
if (std::isnan(dd))
|
||||
return NAN;
|
||||
|
||||
if (dms.at(0) == 'S')
|
||||
return -dd;
|
||||
else if (dms.at(0) == 'N')
|
||||
return dd;
|
||||
else
|
||||
return NAN;
|
||||
}
|
||||
|
||||
static Coordinates parseGEO(const QString &lat, const QString &lon)
|
||||
{
|
||||
return Coordinates(parseLon(lon), parseLat(lat));
|
||||
}
|
||||
|
||||
static Coordinates parseUTM(const QString &zone, const QString &easting,
|
||||
const QString &northing)
|
||||
{
|
||||
bool ok;
|
||||
|
||||
int z = zone.left(zone.size() - 1).toInt(&ok);
|
||||
if (!ok)
|
||||
return Coordinates();
|
||||
if (zone.right(1) < 'N')
|
||||
z = -z;
|
||||
|
||||
int x = easting.toInt(&ok);
|
||||
if (!ok)
|
||||
return Coordinates();
|
||||
int y = northing.toInt(&ok);
|
||||
if (!ok)
|
||||
return Coordinates();
|
||||
|
||||
Projection proj(PCS(GCS::WGS84(), Conversion(9807, UTM::setup(z), 9001)));
|
||||
|
||||
return proj.xy2ll(PointD(x, y));
|
||||
}
|
||||
|
||||
bool GPSDumpParser::parse(QFile *file, QList<TrackData> &tracks,
|
||||
QList<RouteData> &routes, QList<Area> &polygons, QVector<Waypoint> &waypoints)
|
||||
{
|
||||
Q_UNUSED(tracks);
|
||||
Q_UNUSED(routes);
|
||||
Q_UNUSED(polygons);
|
||||
|
||||
_errorLine = 1;
|
||||
_errorString.clear();
|
||||
Type type = Unknown;
|
||||
QRegularExpression dm("[ ]{2,}");
|
||||
|
||||
while (!file->atEnd()) {
|
||||
QByteArray ba(file->readLine(4096).trimmed());
|
||||
|
||||
if (_errorLine == 1) {
|
||||
if (ba == "$FormatGEO")
|
||||
type = GEO;
|
||||
else if (ba == "$FormatUTM")
|
||||
type = UTM;
|
||||
else {
|
||||
_errorString = "Not a GPSDump waypoint file";
|
||||
return false;
|
||||
}
|
||||
} else if (!ba.isEmpty()) {
|
||||
QString line(ba);
|
||||
QStringList fields(line.split(dm));
|
||||
Coordinates c;
|
||||
double ele = NAN;
|
||||
QString desc;
|
||||
bool ok;
|
||||
|
||||
if (type == UTM) {
|
||||
if (fields.size() < 5) {
|
||||
_errorString = "Parse error";
|
||||
return false;
|
||||
}
|
||||
|
||||
c = parseUTM(fields.at(1), fields.at(2), fields.at(3));
|
||||
ele = fields.at(4).toDouble(&ok);
|
||||
if (fields.size() > 5)
|
||||
desc = fields.at(5);
|
||||
} else {
|
||||
if (fields.size() < 4) {
|
||||
_errorString = "Parse error";
|
||||
return false;
|
||||
}
|
||||
|
||||
c = parseGEO(fields.at(1), fields.at(2));
|
||||
ele = fields.at(3).toDouble(&ok);
|
||||
if (fields.size() > 4)
|
||||
desc = fields.at(4);
|
||||
}
|
||||
|
||||
if (!c.isValid()) {
|
||||
_errorString = "Invalid coordinates";
|
||||
return false;
|
||||
}
|
||||
|
||||
Waypoint w(c);
|
||||
w.setName(fields.at(0));
|
||||
if (ok)
|
||||
w.setElevation(ele);
|
||||
if (!desc.isEmpty())
|
||||
w.setDescription(desc);
|
||||
|
||||
waypoints.append(w);
|
||||
}
|
||||
|
||||
_errorLine++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
27
src/data/gpsdumpparser.h
Normal file
27
src/data/gpsdumpparser.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef GPSDUMPPARSER_H
|
||||
#define GPSDUMPPARSER_H
|
||||
|
||||
#include "parser.h"
|
||||
|
||||
class GPSDumpParser : public Parser
|
||||
{
|
||||
public:
|
||||
GPSDumpParser() : _errorLine(0) {}
|
||||
|
||||
bool parse(QFile *file, QList<TrackData> &tracks, QList<RouteData> &routes,
|
||||
QList<Area> &polygons, QVector<Waypoint> &waypoints);
|
||||
QString errorString() const {return _errorString;}
|
||||
int errorLine() const {return _errorLine;}
|
||||
|
||||
private:
|
||||
enum Type {
|
||||
Unknown,
|
||||
GEO,
|
||||
UTM
|
||||
};
|
||||
|
||||
int _errorLine;
|
||||
QString _errorString;
|
||||
};
|
||||
|
||||
#endif // GPSDUMPPARSER_H
|
Loading…
Reference in New Issue
Block a user