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:
parent
3ce3de119b
commit
6194519b18
@ -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 \
|
||||||
|
@ -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
77
src/data/locparser.cpp
Normal 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
23
src/data/locparser.h
Normal 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
|
Loading…
Reference in New Issue
Block a user