# Höhenmeter aus .gpx Datei errechnen



## Crymes (3. September 2011)

*Höhenmeter aus .gpx Datei errechnen*

Hallo, ich zeichne oft mit dem Programm Sports Tracker und 
meinem Nokia 5230 Touren aus, nur leider werden nicht die gesamthöhenmeter errechnet.
Dafür wollte ich mir ein Programm in C++ schreiben, dass die .gpx Datei einliest und immer die Höhenunterschiede der Tracks zusammenzählt.

Jetzt die Frage : Wie schaffe ich es, dass dass Programm weiß, wo es in der Datei anfängt zu lesen, Werte "einscannt" ?

Ich würde gerne mit dem Typ fstream arbeiten.

Danke für eure Hilfe.


----------



## hardware_fanatiker (3. September 2011)

Ich denke du musst einfach ma mit dem Editor ausarbeiten , wie die daten formatiert sind und dann kannste ja einfach die Datei durchlassen oder so. 
Vielleicht gibt's auch ne SDK


----------



## Crymes (3. September 2011)

Die Datei liegt, wenn ich sie mit dem Editor öffne so vor:
Die ersten 5 Zeilen irgendwas unverständliches und die darauf folgenden Zeilen in Folgendem Schema:

(Latitude, Longitude),(Zeit),(geschwindigkeit),(Höhe)

Alles in verständlichen, absoluten Zahlen.

Die letzten 3 Zeilen wieder unberständlich.

Wie kann ich mir jetzt in jeder Zeile die Höhe in eine Variable einlesen?


----------



## hardware_fanatiker (3. September 2011)

Du kannst zum Beispiel dich durch die Kommas parsen, um dann nach jedem vierten die Zahl einlesen.


----------



## Crymes (3. September 2011)

Du musst wissen, dass ich noch Anfänger mit Dateien bin.

Kannst du mir sagen, wie die Befehle dafür sind?


----------



## hardware_fanatiker (3. September 2011)

Müsste ich jetzt auch erst gucken, bin aber gerade unterwegs. Ich denke morgen kann ich da mal eben gucken.


----------



## Crymes (4. September 2011)

Ok, ich werde es so machen, dass ich Zeile für Zeile in einem String Speicher und nach der Höhe suche:

Bsp.: <Hoehe> 400 </Hoehe>

Wenn ich jetzt in dem String den Ausdruck  <Hoehe> gefunden habe, wie mache ich das, dass die 400 in einer variable gespeichert werden?


----------



## nfsgame (4. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Vielleicht ist es auch nur iene Einstellungssache . Auf meinem Wildfire funktioniert genau das Programm (nur halt in der Android-Version) ohne Probleme.


----------



## Crymes (5. September 2011)

Sorry, was meinst du?

Bei mir Funktioniert das Programm auch ohne Probleme, nur diese Funktion fehlt.
Außerdem möchte ich mich ein Bisschen in C++ üben.

Kann mir einer weiterhelfen?


----------



## KingofKingzZ (5. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Joa, also du liest jede Zeile einfach erstmal mit std::getline() ein und gehst sie dann eben nach deinem <Hoehe> durch. 
Wenn du was gefunden hast, dann suchst du weiter (und merkst dir die alte Position) nach dem </Hoehe>. Wenn du das dann hast rechnest du aus wie viele Zeichen die Zahl hat (also wie viele Stellen) und "schneidest" die eben da raus bzw. kopierst die Zeichen von <Hoehe> bis </Hoehe> in einen neuen string und den kannst du dann mit std::string::c_str() an die C-Funktion atoi() (für int) und atof (für float) übergeben und bekommst eben das Ergebnis in float bzw. int. 
Ich hoff mal das war verständlich^^ 

Lg


----------



## Crymes (5. September 2011)

Danke soweit, aber wie kann ich die Zeichen herauskopieren?
Kannst du mir sagen, welche Funktion ich dafür brauche und wie ich mir die Stellen merke?


----------



## KingofKingzZ (5. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Naja also die ausgelesene Zeile speicherst du am besten in einem std::string. Dann iterierst du mit einem std::string::iterator durch die Zeichen des strings und zählst am besten mit einer int-Variable mit. Wenn du dann ein <Hoehe> gefunden hast, dann hörst du auf mitzuzählen bzw. speicherst die aktuelle Nummer in einer weiteren int-Variable. Dann machst du einfach wie gesagt weiter bis du das </Hoehe> gefunden hast und merkst dir auch diese Position in einer Variable. Jetzt einfach ausrechnen, wie viele Zeichen die Zahl hat, also Größere_Int_Variable - Kleinere_Int_Variable. Dann wieder an die erste Position gehen und von dort an dann einfach so viele Zeichen wie du ausgerechnet hast in einen anderen string kopieren. (z.B: mit push_back()).

Zum auslesen brauchst du die Funktion std::geline(...) und dann evtl. noch für den ganzen Kram da oben std::string::at(), ::push_back, ::begin(), ::end() und dann noch atoi() bzw. atof(). 
Die Funktionen sollten eigentlich alle relativ klar sein, ansonsten vllt. einfach nochmal mit den STL Grundlagen den Strings befassen! 

Lg


----------



## Crymes (5. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Also (ich bin wahrscheinlich zu BLöd), ich hab jetzt folgenden Code:


```
[FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]
// gpx Höhenberechnung.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//Initialisierung[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]　
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"stdafx.h"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"string"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"iostream"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"fstream"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]#include[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"conio.h"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]using[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]namespace[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] std;
　
　
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] _tmain([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] argc, _TCHAR* argv[])
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Variablen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]fstream datei;
string linie;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] position1, position2;
　
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Code[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]datei.open([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Datei.gpx"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2], ios::in); [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//öffne Datei [/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (!datei.good()) [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]// PRüfen der Datei[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{
cerr << [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"Fehler beim Öffnen der Datei"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]; 
}
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]while[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](!datei.eof()) [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Bis zum Ende der Datei einlesen[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]do[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]{
linie = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]""[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2];
position1 = 0, position2 = 0;
getline(datei, linie); [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000][FONT=Consolas][SIZE=2][COLOR=#008000]//Linie in String Speichern[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]linie.find([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"<ele>"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]); 
linie.find([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]"</ele>"[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]);

　
　

　
　
　
}
　
[/SIZE][/FONT][/SIZE][/FONT]
```
 
zwischen den beiden ele stehen die Höhenmeter.
Wie kann ich die jetzt einlesen?
Ich muss ja jetzt das mit den Stellemn subtrahieren machen, aber wie bekomme ich die raus?
Das ist doch irgendwas mit argh oder so?


----------



## KingofKingzZ (5. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Naja std::string::find gibt dir ja die Position als std::size_t zurück 
Dann gehst du den string mittels iteratoren oder auch einfach mit nem Zähler und std::string::at() durch, bis du die Endposition erreicht hast und speicherst jedes Zeichen dazwischen in nem neuen string. Dann noch atoi oder atof und fertig. 


```
int pos1 = line.find("<ele>");
int pos2 = line.find("</ele>");
int num = pos2 - pos1;
std::string heightstring;

while (pos1 <= pos2)
{
    heightsting.push_back(line.at(pos1));
    ++pos1; 
}

int Height = atoi (hightsting.c_str());
```

So ähnlich sollte es gehen, kann sein dass du ein klein wenig ändern musst. 

Ach ja, diese Methode geht davon aus, dass nur eine Höhe pro Zeile da ist. Wenn da mehr sein kann, musst du eben die alte Position (pos2) merken und den string dann bis dort löschen (weiß gerade nicht, ob es anders geht (tut es bestimmt), aber löschen is ja relativ einfach). Dann wieder find benutzen, denn find gibt dir immer die erste Stelle zurück, wo es auftaucht.

Lg


----------



## AMD (5. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Falls ich auch noch einen Vorschlag anbieten kann:
"file.abc" ist in diesem Fall der Pfad zu deiner Datei + Format)


```
ifstream file;
int value;
string msg_line;

file.open("file.abc", ios::in);
while (!file.eof())
{
      getline(file, msg_line);
      size_t pos = msg_line.find("<Hoehe>");
      if (pos < 9999)
           sscanf(msg_line.c_str(), "<Hoehe> %i", &value);
}
```

Include dafür wäre <fstream> bzw. <string>

Ist nur ein grober ansatz aber sollte durchaus klappen... gerade die Sache mit pos < 9999 wirkt vllt. etwas billig aber in der Praxis funktioniert gut


----------



## Zappzarrap (6. September 2011)

*AW: Höhenmeter aus .gpx Datei errechnen*

Was du im prinzip willst ist ein Parser  Nur mal so 
am Rande, damit du weisst was du da eigtl programmierst.

Ich würde es ähnlich machen wie King, allerdings evtl.
schon direkt beim einlesen alles rausfiltern, was du
nicht brauchst. Hab das mal für ne XML gemacht, wird 
allerdings etwas komplizierter.

Aber die Möglichkeit temporär mit nem String zu arbeiten
und sich dann der String Methoden zu bedienen funzt auch.


----------

