1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2024-10-06 23:03:22 +02:00
GPXSee/src/parser.cpp

130 lines
2.9 KiB
C++
Raw Normal View History

2015-10-05 01:43:48 +02:00
#include "parser.h"
void Parser::handleExtensionData(QStringRef element, const QString &value)
{
if (element == "speed")
_track->last().speed = value.toDouble();
}
2015-10-05 01:43:48 +02:00
void Parser::handleTrekPointData(QStringRef element, const QString &value)
2015-10-05 01:43:48 +02:00
{
if (element == "ele")
_track->last().elevation = value.toLatin1().toDouble();
2015-10-05 01:43:48 +02:00
if (element == "time")
_track->last().timestamp = QDateTime::fromString(value.toLatin1(),
2015-10-05 01:43:48 +02:00
Qt::ISODate);
if (element == "geoidheight")
_track->last().geoidheight = value.toLatin1().toDouble();
2015-10-05 01:43:48 +02:00
}
void Parser::handleWayPointData(QStringRef element, const QString &value)
{
if (element == "name")
_waypoints.last().setDescription(value);
}
void Parser::handleTrekPointAttributes(const QXmlStreamAttributes &attr)
2015-10-05 01:43:48 +02:00
{
_track->last().coordinates.setY(attr.value("lat").toLatin1().toDouble());
_track->last().coordinates.setX(attr.value("lon").toLatin1().toDouble());
2015-10-05 01:43:48 +02:00
}
void Parser::handleWayPointAttributes(const QXmlStreamAttributes &attr)
{
_waypoints.last().setCoordinates(QPointF(
attr.value("lon").toLatin1().toDouble(),
attr.value("lat").toLatin1().toDouble()));
}
2015-10-05 01:43:48 +02:00
void Parser::extensions()
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "speed")
handleExtensionData(_reader.name(), _reader.readElementText());
else
_reader.skipCurrentElement();
}
}
void Parser::trackPointData()
2015-10-05 01:43:48 +02:00
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "ele" || _reader.name() == "time"
|| _reader.name() == "geoidheight")
handleTrekPointData(_reader.name(), _reader.readElementText());
else if (_reader.name() == "extensions")
extensions();
2015-10-05 01:43:48 +02:00
else
_reader.skipCurrentElement();
}
}
void Parser::trackPoints()
2015-10-05 01:43:48 +02:00
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "trkpt") {
_track->append(TrackPoint());
handleTrekPointAttributes(_reader.attributes());
trackPointData();
2015-10-05 01:43:48 +02:00
} else
_reader.skipCurrentElement();
}
}
void Parser::track()
2015-10-05 01:43:48 +02:00
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "trkseg") {
trackPoints();
2015-10-05 01:43:48 +02:00
} else
_reader.skipCurrentElement();
}
}
void Parser::wayPointData()
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "name")
handleWayPointData(_reader.name(), _reader.readElementText());
else
_reader.skipCurrentElement();
}
}
void Parser::gpx()
2015-10-05 01:43:48 +02:00
{
while (_reader.readNextStartElement()) {
if (_reader.name() == "trk") {
_tracks.append(QVector<TrackPoint>());
_track = &_tracks.back();
track();
} else if (_reader.name() == "wpt") {
_waypoints.append(WayPoint());
handleWayPointAttributes(_reader.attributes());
wayPointData();
} else
2015-10-05 01:43:48 +02:00
_reader.skipCurrentElement();
}
}
bool Parser::parse()
2015-10-05 01:43:48 +02:00
{
if (_reader.readNextStartElement()) {
if (_reader.name() == "gpx")
gpx();
2015-10-05 01:43:48 +02:00
else
_reader.raiseError("Not a GPX file.");
2015-10-05 01:43:48 +02:00
}
return !_reader.error();
}
bool Parser::loadFile(QIODevice *device)
2015-10-05 01:43:48 +02:00
{
_reader.clear();
_reader.setDevice(device);
return parse();
2015-10-05 01:43:48 +02:00
}