Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   .GPX datei auslesen (https://www.delphipraxis.net/160600-gpx-datei-auslesen.html)

BBoy 22. Mai 2011 10:27


.GPX datei auslesen
 
Ich möchte eine .gpx datei auslesen und die Werte in Editfelder oder ähnliches eintragen oder vielleicht sogar in eine Datenbank übertragen.
eine .gpx Datei ist eine XML datei, hat aber spezielle werte wie <wpt> usw. Außerdem sind meine XML Kenntnisse nahezu null :oops:
Daher such eich nach einer sehr einfachen möglichkeit mein vorhaben umzusetzen. Vielleicht gibt es eine fertige klasse für GPX oder eine komponente mit der es sogar ich hin bekommen könnte :)

Das ganze hat etwas mit Geocaching zu tun. Da kann man bei der Internetseite (Groundspeak) .gpx dateien herunterladen für eine Tour. Und um eben die Tour besser planen zu können möchte ich ein programm schreiben und dessen grundlage ist eben erstmal der import der gpx datei um an die nötigen daten zu kommen. Und später dann auch der export in eine gpx datei um diese dann an das GPS-Gerät zu übertragen.

habe es mal mit Easyxmlscanner versucht, aber da komme ich an so einträge wie:
<bounds minlat="49.615" minlon="8.320833" maxlat="49.65965" maxlon="8.384933" />
<wpt lat="49.64075" lon="8.363">
nicht ran. Komischerweise werden diese ignoriert.


Wäre nett wenn jemand helfen könnte. danke.

Hier noch ein auszug aus einer Gpx datei:
Code:
<?xml version="1.0" encoding="utf-8"?>
<gpx xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" creator="Groundspeak Pocket Query" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0">
  <name>Worms</name>
  <desc>Geocache file generated by Groundspeak</desc>
  <author>Groundspeak</author>
  <email>contact@groundspeak.com</email>
  <time>2011-05-19T07:06:40.9618119Z</time>
  <keywords>cache, geocache, groundspeak</keywords>
  <bounds minlat="49.615" minlon="8.320833" maxlat="49.65965" maxlon="8.384933" />
  <wpt lat="49.64075" lon="8.363">
    <time>2007-05-07T07:00:00Z</time>
    <name>GC12R2Z</name>
    <desc>Prinz-Carl-Anlage by Whitman, Multi-cache (2/1.5)</desc>
    <url>http://www.geocaching.com/seek/cache_details.aspx?guid=6cb5a6eb-e7dc-4b5d-a388-729d9da1ad7f</url>
    <urlname>Prinz-Carl-Anlage</urlname>
    <sym>Geocache</sym>
    <type>Geocache|Multi-cache</type>
    <groundspeak:cache id="595139" available="True" archived="False" xmlns:groundspeak="http://www.groundspeak.com/cache/1/0/1">
      <groundspeak:name>Prinz-Carl-Anlage</groundspeak:name>
      <groundspeak:placed_by>Whitman</groundspeak:placed_by>
      <groundspeak:owner id="1078871">Whitman</groundspeak:owner>
      <groundspeak:type>Multi-cache</groundspeak:type>
      <groundspeak:container>Regular</groundspeak:container>
      <groundspeak:attributes>
        <groundspeak:attribute id="42" inc="1">Needs maintenance</groundspeak:attribute>
        <groundspeak:attribute id="41" inc="1">Stroller accessible</groundspeak:attribute>
        <groundspeak:attribute id="39" inc="1">Thorns</groundspeak:attribute>
        <groundspeak:attribute id="13" inc="1">Available at all times</groundspeak:attribute>
        <groundspeak:attribute id="33" inc="1">Motorcycles</groundspeak:attribute>
        <groundspeak:attribute id="32" inc="1">Bicycles</groundspeak:attribute>
        <groundspeak:attribute id="7" inc="1">Takes less than an hour</groundspeak:attribute>
        <groundspeak:attribute id="29" inc="1">Telephone nearby</groundspeak:attribute>
        <groundspeak:attribute id="27" inc="1">Drinking water nearby</groundspeak:attribute>
        <groundspeak:attribute id="25" inc="1">Parking available</groundspeak:attribute>
        <groundspeak:attribute id="1" inc="1">Dogs</groundspeak:attribute>
      </groundspeak:attributes>
      <groundspeak:difficulty>2</groundspeak:difficulty>
      <groundspeak:terrain>1.5</groundspeak:terrain>
      <groundspeak:country>Germany</groundspeak:country>
      <groundspeak:state>Rheinland-Pfalz</groundspeak:state>
      <groundspeak:short_description html="False">Kleiner Multicache in der Prinz-Carl-Anlage in Worms - Zollstock mitbringen!!!</groundspeak:short_description>
      <groundspeak:long_description html="False">WICHTIG: Zollstock mitnehmen!!!
(Ich hoffe, dass ich alles richtig berechnet habe - dies ist mein erster Cach, den ich versteckt habe!)

An den Startkoordinaten angekommen stehen vier silber-metallische Hausnummern bzw. Firmenschilder.
Notiere dir alle Hausnummern (am besten auf einem Zettel in einer Zeile, also nebeneinander) im Uhrzeigersinn beginnend bei Hausnummer 42. Insgesamt sind es fünf Hausnummern.

Um zu den nächsten Koordinaten zu gelangen musst du zwei Rechenrätsel lösen:

Rätsel A: (Du hast die Nummern am besten in einer Zeile auf einem Zettel aufgeschrieben) Addiere die dritte und vierte Hausnummer. Vom Ergebnis ziehst du die erste Hausnummer ab. Das Endergebnis drehst du um (also Zahlendreher).

Rätsel B: Addiere die zweite und dritte Hausnummer.

Nächste Location:    N49 38.(445+A) E008 21.(780-B)


Stage 2

An den Koordinaten angekommen zähle die dort stehenden Schranken sowie die Anzahl der Buchstaben des Wortes, dass auf der grauen Wand direkt neben den Schranken steht.

Das dort stehende Wort rechnest du nun in die jeweiligen Zahlen des Alphabets um (also A=1, B=2, C=3 etc.).

Rätsel C: Rechne die Zahlen des zweiten, dritten, sechsten, siebten und achten Buchstaben des Wortes zusammen. Nun ziehe vom Ergebnis die Anzahl der Schranken ab.

Rätsel D: Ziehe von der Zahl des siebten Buchstabens die Zahl des fünften Buchstabens ab. Das Ergebnis multiplizierst du mit der Zahl des sechsten Buchstabens.

Nächste Location:   N49 38.(455-Rätsel C) E008 21.(780-Rätsel D)


Stage 3

An der Location angekommen steht am Wegrand ein hüfthoher Stein.
Vermesse den Stein in Höhe und Breite. Dabei wird in 5cm Schritten gemessen.

Rätsel E: Multipliziere die Breite mit 18.

Rätsel F: Das Ergebnis von Rätsel E + Höhe + Breite + Buchstabe L (der wievielte Buchstabe im Alphabet ist das?)

Finale Location: N49   38.Ergebnis Rätsel E / E008 21.Ergebnis Rätsel F

Suche an den Koordinaten nun den Cach!

Additional Waypoints
</groundspeak:long_description>
      <groundspeak:encoded_hints>
      </groundspeak:encoded_hints>
      <groundspeak:logs>
        <groundspeak:log id="159979461">
          <groundspeak:date>2011-05-07T19:00:00Z</groundspeak:date>
          <groundspeak:type>Found it</groundspeak:type>
          <groundspeak:finder id="3938801">ROTWILD R.E1</groundspeak:finder>
          <groundspeak:text encoded="False">Schöne kleine Runde durch die Anlage.

T4TC

Team ROTWILD R.E1

#563</groundspeak:text>
        </groundspeak:log>
        <groundspeak:log id="159785118">
          <groundspeak:date>2011-05-07T19:00:00Z</groundspeak:date>
          <groundspeak:type>Found it</groundspeak:type>
          <groundspeak:finder id="2956382">Trudeuskölle</groundspeak:finder>
          <groundspeak:text encoded="False">Auf dem Weg der Lösung konnten wir leckeres Eis schlecken und konnten die Aufgaben alle gut meistern.
Gut gefunden.DfdC
Gruß trudeuskölle</groundspeak:text>
        </groundspeak:log>
        <groundspeak:log id="157313539">
          <groundspeak:date>2011-04-24T19:00:00Z</groundspeak:date>
          <groundspeak:type>Found it</groundspeak:type>
          <groundspeak:finder id="3272050">Team Find nix</groundspeak:finder>
          <groundspeak:text encoded="False">Heute führte uns dieser Multi quer durch die Prinz-Carl-Anlage. Beim Final muss man etwas aufpassen, da es dort sehr dornig ist.

TFTC
Team Find nix</groundspeak:text>
        </groundspeak:log>
        <groundspeak:log id="151185863">
          <groundspeak:date>2011-03-25T19:00:00Z</groundspeak:date>
          <groundspeak:type>Found it</groundspeak:type>
          <groundspeak:finder id="1962888">gigi-mo</groundspeak:finder>
          <groundspeak:text encoded="False">Auch ohne Zollstock, aber mit kariertem Papier die Aufgabe lösen können. Ich hatte hier eine Tagung und so konnte ich auch in Worms eine Cachemarke setzen.</groundspeak:text>
        </groundspeak:log>
        <groundspeak:log id="150333382">
          <groundspeak:date>2011-03-21T19:00:00Z</groundspeak:date>
          <groundspeak:type>Found it</groundspeak:type>
          <groundspeak:finder id="4297883">fabi1402</groundspeak:finder>
          <groundspeak:text encoded="False">Hat Spaß gemacht,nach 4mal nachrechnen endlich gefunden

lg fabi1402[:)]</groundspeak:text>
        </groundspeak:log>
      </groundspeak:logs>
      <groundspeak:travelbugs />
    </groundspeak:cache>
  </wpt>
  <wpt lat="49.639167" lon="8.368167">
    <time>2011-01-07T08:00:00Z</time>
    <name>GC2M3NP</name>
    <desc>Wormser Portale #2 Liebfrauen (reloaded) by Bizzler, Multi-cache (2/1)</desc>
    <url>http://www.geocaching.com/seek/cache_details.aspx?guid=1bef3da6-af70-4977-8703-464ee9765161</url>
    <urlname>Wormser Portale #2 Liebfrauen (reloaded)</urlname>
    <sym>Geocache</sym>

alfold 22. Mai 2011 10:46

AW: .GPX datei auslesen
 
Hast Du mal die Suche im Forum benutzt 'xml parser'?
Den ohne sowas, ist es Aufwendig es selbst zu machen!:wink:

Gruss alfold

lbccaleb 22. Mai 2011 11:51

AW: .GPX datei auslesen
 
Weiß ja nicht welche xml Parser du probiert hast(bis auf den ein genannten), aber hier ist mal einer:

http://www.muetze1.de/?page_id=31ja

mkinzler 22. Mai 2011 12:15

AW: .GPX datei auslesen
 
GPX-Editor mit Delphi 7 Sourcen:
http://www.knackes.com/blog/2008/11/...x-editor-1070/

BBoy 24. Mai 2011 11:05

AW: .GPX datei auslesen
 
Die source davon lässt sich unter D2009 nicht kompilieren da einige benötigte Bibliotheken zu alt sind. Ich will ja auch was eigenes machen.

Um die Daten zu importieren sieht mein Code nun so aus (ist noch in der Testphase):
Code:
procedure TForm2.Button3Click(Sender: TObject);
var
i : Integer;
wpt1_node : Txmlnode;
gc_node  : Txmlnode;
cacheGC: String;
CacheTime : String;
CacheDesc : String;
cacheUrl : String;
CacheUrln : String;
CacheSym : String;
CacheType : String;
CacheId  : String;
CacheAvail: String;
CacheArch : String;
CacheXMLNS: String;
GSName   : String;
begin
  Memo1.Lines.Clear;
  ADoc := TNativeXml.Create(self);
  ADoc.LoadFromFile('1.gpx');

wpt1_node := adoc.Root.FindNode('wpt');

cacheGC  := wpt1_node.FindNode('name').Value;
CacheTime := wpt1_node.FindNode('time').Value;
CacheDesc := wpt1_node.FindNode('desc').Value;
CacheUrl := wpt1_node.FindNode('url').Value;
CacheUrln := wpt1_node.FindNode('urlname').Value;
CacheSym := wpt1_node.FindNode('sym').Value;
CacheType := wpt1_node.FindNode('type').Value;

gc_node := wpt1_node.FindNode('groundspeak:cache');

CacheId  := gc_node.Attributes[0].Value;
CacheAvail:= gc_node.Attributes[1].Value;
CacheArch := gc_node.Attributes[2].Value;
CacheXMLNS:= gc_node.Attributes[3].Value;

GSName   := gc_node.FindNode('groundspeak:name').Value;

end;

Ist es so ok oder gibt es bessere Möglichkeiten?

Dann noch eine andere Frage für später wenn ich die Daten in eine Datenbank speichern möchte. Und zwar sind in der XML Datei immer verschieden viele Einträge <wpt>, es könnten bis zu 30 oder theoretisch sogar mehr sein. Nun frage ich mich wie ich so etwas in eine DB bringe. Im Code würde ich das mit einem dynamischen Array lösen, aber wie geht das mit einer Datenbank??


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz