1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-11-27 21:24:47 +01:00

Added support for geocaching.com LOC files

This commit is contained in:
Martin Tůma 2018-08-08 20:18:08 +02:00
parent 3ce3de119b
commit 6194519b18
4 changed files with 110 additions and 4 deletions

View File

@ -137,7 +137,8 @@ HEADERS += src/config.h \
src/map/mercator.h \ src/map/mercator.h \
src/map/jnxmap.h \ src/map/jnxmap.h \
src/map/krovak.h \ src/map/krovak.h \
src/GUI/kv.h src/GUI/kv.h \
src/data/locparser.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/common/coordinates.cpp \ src/common/coordinates.cpp \
src/common/rectc.cpp \ src/common/rectc.cpp \
@ -238,7 +239,8 @@ SOURCES += src/main.cpp \
src/map/mercator.cpp \ src/map/mercator.cpp \
src/map/jnxmap.cpp \ src/map/jnxmap.cpp \
src/map/krovak.cpp \ src/map/krovak.cpp \
src/map/map.cpp src/map/map.cpp \
src/data/locparser.cpp
RESOURCES += gpxsee.qrc RESOURCES += gpxsee.qrc
TRANSLATIONS = lang/gpxsee_cs.ts \ TRANSLATIONS = lang/gpxsee_cs.ts \

View File

@ -9,6 +9,7 @@
#include "igcparser.h" #include "igcparser.h"
#include "nmeaparser.h" #include "nmeaparser.h"
#include "oziparsers.h" #include "oziparsers.h"
#include "locparser.h"
#include "data.h" #include "data.h"
@ -22,6 +23,7 @@ static NMEAParser nmea;
static PLTParser plt; static PLTParser plt;
static WPTParser wpt; static WPTParser wpt;
static RTEParser rte; static RTEParser rte;
static LOCParser loc;
static QHash<QString, Parser*> parsers() static QHash<QString, Parser*> parsers()
{ {
@ -37,6 +39,7 @@ static QHash<QString, Parser*> parsers()
hash.insert("plt", &plt); hash.insert("plt", &plt);
hash.insert("wpt", &wpt); hash.insert("wpt", &wpt);
hash.insert("rte", &rte); hash.insert("rte", &rte);
hash.insert("loc", &loc);
return hash; return hash;
} }
@ -108,10 +111,11 @@ QString Data::formats()
{ {
return return
tr("Supported files") tr("Supported files")
+ " (*.csv *.fit *.gpx *.igc *.kml *.nmea *.plt *.rte *.tcx *.wpt);;" + " (*.csv *.fit *.gpx *.igc *.kml *.loc *.nmea *.plt *.rte *.tcx *.wpt);;"
+ tr("CSV files") + " (*.csv);;" + tr("FIT files") + " (*.fit);;" + tr("CSV files") + " (*.csv);;" + tr("FIT files") + " (*.fit);;"
+ tr("GPX files") + " (*.gpx);;" + tr("IGC files") + " (*.igc);;" + tr("GPX files") + " (*.gpx);;" + tr("IGC files") + " (*.igc);;"
+ tr("KML files") + " (*.kml);;" + tr("NMEA files") + " (*.nmea);;" + tr("KML files") + " (*.kml);;" + tr("LOC files") + " (*.loc);;"
+ tr("NMEA files") + " (*.nmea);;"
+ tr("OziExplorer files") + " (*.plt *.rte *.wpt);;" + tr("OziExplorer files") + " (*.plt *.rte *.wpt);;"
+ tr("TCX files") + " (*.tcx);;" + tr("All files") + " (*)"; + tr("TCX files") + " (*.tcx);;" + tr("All files") + " (*)";
} }

77
src/data/locparser.cpp Normal file
View File

@ -0,0 +1,77 @@
#include "locparser.h"
Coordinates LOCParser::coordinates()
{
bool res;
qreal lon, lat;
const QXmlStreamAttributes &attr = _reader.attributes();
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
lon = attr.value("lon").toString().toDouble(&res);
#else // QT_VERSION < 5
lon = attr.value("lon").toDouble(&res);
#endif // QT_VERSION < 5
if (!res || (lon < -180.0 || lon > 180.0)) {
_reader.raiseError("Invalid longitude");
return Coordinates();
}
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
lat = attr.value("lat").toString().toDouble(&res);
#else // QT_VERSION < 5
lat = attr.value("lat").toDouble(&res);
#endif // QT_VERSION < 5
if (!res || (lat < -90.0 || lat > 90.0)) {
_reader.raiseError("Invalid latitude");
return Coordinates();
}
return Coordinates(lon, lat);
}
void LOCParser::waypoint(Waypoint &waypoint)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "name") {
const QXmlStreamAttributes &attr = _reader.attributes();
waypoint.setName(attr.value("id").toString());
waypoint.setDescription(_reader.readElementText());
} else if (_reader.name() == "coord") {
waypoint.setCoordinates(coordinates());
_reader.skipCurrentElement();
} else
_reader.skipCurrentElement();
}
if (waypoint.coordinates().isNull())
_reader.raiseError("Missing waypoint coordinates");
}
void LOCParser::loc(QList<Waypoint> &waypoints)
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "waypoint") {
waypoints.append(Waypoint());
waypoint(waypoints.last());
} else
_reader.skipCurrentElement();
}
}
bool LOCParser::parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Waypoint> &waypoints)
{
Q_UNUSED(tracks);
Q_UNUSED(routes);
_reader.clear();
_reader.setDevice(file);
if (_reader.readNextStartElement()) {
if (_reader.name() == "loc")
loc(waypoints);
else
_reader.raiseError("Not a LOC file");
}
return !_reader.error();
}

23
src/data/locparser.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef LOCPARSER_H
#define LOCPARSER_H
#include <QXmlStreamReader>
#include "parser.h"
class LOCParser : public Parser
{
public:
bool parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Waypoint> &waypoints);
QString errorString() const {return _reader.errorString();}
int errorLine() const {return _reader.lineNumber();}
private:
void loc(QList<Waypoint> &waypoints);
void waypoint(Waypoint &waypoint);
Coordinates coordinates();
QXmlStreamReader _reader;
};
#endif // LOCPARSER_H