Skip to content

Commit

Permalink
Keep elevation data and timestamps for trackpoints so it isn't lost w…
Browse files Browse the repository at this point in the history
…hen you edit a GPX file

git-svn-id: http://svn.osgeo.org/qgis/branches/Release-0_7-candidate@3677 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
larsl committed Jun 30, 2005
1 parent a40051f commit c43dfeb
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 18 deletions.
78 changes: 60 additions & 18 deletions qgis/providers/gpx/gpsdata.cpp
Expand Up @@ -19,6 +19,7 @@
#include <stdexcept>

#include <qfile.h>
#include <qdatetime.h>

#include "gpsdata.h"

Expand Down Expand Up @@ -61,6 +62,8 @@ void GPSPoint::writeXML(QTextStream& stream) {
stream<<"<ele>"<<ele<<"</ele>\n";
if (!sym.isEmpty())
stream<<"<sym>"<<xmlify(sym)<<"</sym>\n";
if (time.isValid())
stream<<"<time>"<<time.toString(Qt::ISODate)<<"Z</time>\n";
}


Expand Down Expand Up @@ -387,9 +390,9 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
mWpt = Waypoint();
for (int i = 0; attr[2*i] != NULL; ++i) {
if (!std::strcmp(attr[2*i], "lat"))
mWpt.lat = mCLocale.toDouble(attr[2*i+1]);
mWpt.lat = mCLocale.toDouble(attr[2*i+1]);
else if (!std::strcmp(attr[2*i], "lon"))
mWpt.lon = mCLocale.toDouble(attr[2*i+1]);
mWpt.lon = mCLocale.toDouble(attr[2*i+1]);
}
mObj = &mWpt;
}
Expand All @@ -407,8 +410,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
// common properties
else if (!std::strcmp(qName, "name")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->name;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -418,8 +421,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
}
else if (!std::strcmp(qName, "cmt")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->cmt;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -429,8 +432,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
}
else if (!std::strcmp(qName, "desc")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->desc;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -440,8 +443,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
}
else if (!std::strcmp(qName, "src")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->src;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -451,8 +454,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
}
else if (!std::strcmp(qName, "url")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->url;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -462,8 +465,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
}
else if (!std::strcmp(qName, "urlname")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
parseModes.top() == ParsingRoute ||
parseModes.top() == ParsingTrack) {
mString = &mObj->urlname;
mCharBuffer = "";
parseModes.push(ParsingString);
Expand All @@ -472,16 +475,33 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
parseModes.push(ParsingUnknown);
}

// waypoint-specific attributes
// point-specific attributes
else if (!std::strcmp(qName, "ele")) {
if (parseModes.top() == ParsingWaypoint) {
mDouble = &mWpt.ele;
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingTrackpoint) {
if (parseModes.top() == ParsingWaypoint)
mDouble = &mWpt.ele;
else if (parseModes.top() == ParsingTrackpoint)
mDouble = &mTrkpt.ele;
mCharBuffer = "";
parseModes.push(ParsingDouble);
}
else
parseModes.push(ParsingUnknown);
}
else if (!std::strcmp(qName, "time")) {
if (parseModes.top() == ParsingWaypoint ||
parseModes.top() == ParsingTrackpoint) {
if (parseModes.top() == ParsingWaypoint)
mTime = &mWpt.time;
else if (parseModes.top() == ParsingTrackpoint)
mTime = &mTrkpt.time;
mCharBuffer = "";
parseModes.push(ParsingTimestamp);
}
else
parseModes.push(ParsingUnknown);
}
else if (!std::strcmp(qName, "sym")) {
if (parseModes.top() == ParsingWaypoint) {
mString = &mWpt.sym;
Expand Down Expand Up @@ -605,8 +625,30 @@ bool GPXHandler::endElement(const std::string& qName) {
*mString = mCharBuffer;
mCharBuffer = "";
}
else if (parseModes.top() == ParsingTimestamp) {
*mTime = QDateTime();
if (mTimezoneRegex.exactMatch(mCharBuffer))
*mTime = QDateTime::fromString(mTimezoneRegex.cap(1), Qt::ISODate);
if (mTime->isValid()) {
QString zone = mTimezoneRegex.cap(2);
if (zone != "Z") {
int sign = (zone[0] == '+' ? 1 : -1);
zone = zone.right(zone.length() - 1);
int n = zone.find(':');
int h = zone.left(n).toInt();
int m = zone.right(zone.length() - n - 1).toInt();
*mTime = mTime->addSecs(sign * (h * 3600 + m * 60));
}
}
else {
std::cerr<<"Found invalid date in GPX file: "<<mCharBuffer<<std::endl;
}
mCharBuffer = "";
}
parseModes.pop();

return true;
}



QRegExp GPXHandler::mTimezoneRegex("(.*)(Z|(?:\\+|-)\\d+:\\d+)");
8 changes: 8 additions & 0 deletions qgis/providers/gpx/gpsdata.h
Expand Up @@ -27,7 +27,9 @@
#include <vector>

#include <expat.h>
#include <qdatetime.h>
#include <qlocale.h>
#include <qregexp.h>
#include <qstring.h>
#include <qtextstream.h>

Expand All @@ -54,6 +56,7 @@ class GPSPoint : public GPSObject {
virtual void writeXML(QTextStream& stream);
double lat, lon, ele;
QString sym;
QDateTime time;
};


Expand Down Expand Up @@ -282,6 +285,7 @@ class GPXHandler {
ParsingDouble,
ParsingInt,
ParsingString,
ParsingTimestamp,
ParsingUnknown
};

Expand All @@ -297,10 +301,14 @@ class GPXHandler {
Trackpoint mTrkpt;
GPSObject* mObj;
QString* mString;
QDateTime* mTime;
double* mDouble;
int* mInt;
QString mCharBuffer;
QLocale mCLocale;

static QRegExp mTimezoneRegex;

};


Expand Down

0 comments on commit c43dfeb

Please sign in to comment.