1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-06-27 03:29:16 +02:00

Added support for TomTom OV2 files

This commit is contained in:
2021-05-09 22:39:39 +02:00
parent 64aa44d09b
commit 6a941566cb
7 changed files with 102 additions and 2 deletions

View File

@ -17,7 +17,7 @@
#include "cupparser.h"
#include "gpiparser.h"
#include "smlparser.h"
#include "map/map.h"
#include "ov2parser.h"
#include "data.h"
@ -38,6 +38,7 @@ static EXIFParser exif;
static CUPParser cup;
static GPIParser gpi;
static SMLParser sml;
static OV2Parser ov2;
static QMap<QString, Parser*> parsers()
{
@ -62,6 +63,7 @@ static QMap<QString, Parser*> parsers()
map.insert("cup", &cup);
map.insert("gpi", &gpi);
map.insert("sml", &sml);
map.insert("ov2", &ov2);
return map;
}
@ -138,6 +140,7 @@ QString Data::formats()
+ qApp->translate("Data", "KML files") + " (*.kml);;"
+ qApp->translate("Data", "LOC files") + " (*.loc);;"
+ qApp->translate("Data", "NMEA files") + " (*.nmea);;"
+ qApp->translate("Data", "OV2 files") + " (*.ov2);;"
+ qApp->translate("Data", "OziExplorer files") + " (*.plt *.rte *.wpt);;"
+ qApp->translate("Data", "SLF files") + " (*.slf);;"
+ qApp->translate("Data", "SML files") + " (*.sml);;"

71
src/data/ov2parser.cpp Normal file
View File

@ -0,0 +1,71 @@
#include <QDataStream>
#include "common/textcodec.h"
#include "ov2parser.h"
bool OV2Parser::parse(QFile *file, QList<TrackData> &tracks,
QList<RouteData> &routes, QList<Area> &polygons, QVector<Waypoint> &waypoints)
{
Q_UNUSED(tracks);
Q_UNUSED(routes);
Q_UNUSED(polygons);
QDataStream stream(file);
quint8 type;
quint32 len;
qint32 lon, lat;
QByteArray ba;
TextCodec codec(1252);
stream.setByteOrder(QDataStream::LittleEndian);
while (!stream.atEnd()) {
stream >> type;
switch (type) {
case 0:
stream >> len;
if (stream.status() != QDataStream::Ok || len < 5) {
_errorString = "Corrupted deleted record";
return false;
}
stream.skipRawData(len - 5);
break;
case 1:
if (stream.skipRawData(20) < 20) {
_errorString = "Corrupted skipper record";
return false;
}
break;
case 2:
case 3:
{stream >> len >> lon >> lat;
if (stream.status() != QDataStream::Ok || len < 13) {
_errorString = "Corrupted POI record";
return false;
}
ba.resize(len - 13);
if (stream.readRawData(ba.data(), ba.size()) != ba.size()) {
_errorString = "Corrupted POI record";
return false;
}
if (lon < -18000000 || lon > 18000000
|| lat < -9000000 || lat > 9000000) {
_errorString = "Invalid POI coordinates";
return false;
}
Waypoint wp(Coordinates(lon/1e5, lat/1e5));
if (type == 2)
wp.setName(codec.toString(ba));
else {
QList<QByteArray> parts(ba.split('\0'));
wp.setName(codec.toString(parts.at(0)));
}
waypoints.append(wp);}
break;
default:
_errorString = QString("%1: invalid/unknown record type")
.arg(type);
return false;
}
}
return true;
}

17
src/data/ov2parser.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef OV2PARSER_H
#define OV2PARSER_H
#include "parser.h"
class OV2Parser : public Parser
{
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 0;}
private:
QString _errorString;
};
#endif // OV2PARSER_H