Um die Daten eines GPS Empfängers z.B. in Google Earth anzuzeigen benötigt Google Earth die Daten als XML Datei. Die Dateiendung dieser XML Datei lautet „.KML “
In Folgenden finden Sie ein Beispiel für den Aufbau einer solchen Datei mit einer Track (Wegeanzeige), hierbei wird eine Textur 10 Meter über den Weg nach oben gezogen, um einen besseren Überblick zu erhalten:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>KmlFile</name> <Style id="transPurpleLineGreenPoly"> <LineStyle> <color>7fff00ff</color> <width>4</width> </LineStyle> <PolyStyle> <color>7f00ff00</color> </PolyStyle> </Style> <Placemark> <name>Absolute</name> <visibility>1</visibility> <description>Dillinger-Engineering</description> <styleUrl>#transPurpleLineGreenPoly</styleUrl> <LineString> <tessellate>1</tessellate> <altitudeMode>relativeToGround</altitudeMode> <coordinates> 10.8665686666667,49.4601001666667,10 10.8665698333333,49.4601003333333,10 10.8665793333333,49.4601003333333,10 10.8665775,49.4601003333333,10 10.866586,49.460101,10 10.8665888333333,49.4601011666667,10 10.8665971666667,49.4601015,10 10.8665971666667,49.4601015,10 </coordinates> </LineString> </Placemark> </Document> </kml>
Von einem GPS Empfänger werden die Daten meist im NMEA Format übertragen. Für eine reine Positionsbestimmung genügt der Daten String „Recommended Minimum Sentence C“ (RMC)
Jeder GNSS-Empfänger muss mindestens den Recommended Minimum Sentence C (empfohlener Mindestdatensatz C, RMC) Datensatz ausgeben können, maximal alle zwei Sekunden.
Er folgt folgendem Aufbau:
Seit NMEA In 2.3, wurden folgende Sätze um ein Feld erweitert (APB, BWC, BWR, GLL, RMA, RMB, RMC, VTG, WCV und XTE) das die Signalintegritätsinformation laut FAA darstellt. („F“ in untenstehender Tabelle)
$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
$GPRMC,HHMMSS,A,BBBB.BBBB,b,LLLLL.LLLL,l,GG.G,RR.R,DDMMYY,M.M,m,F*PP
Symbol |
Bedeutung |
HHMMSS oder HHMMSS.SSS |
Zeit (UTC) |
A | Status (A für OK, V bei Warnungen) |
BBBB.BBBB | Breitengrad |
b | Ausrichtung (N für North, nördlich; S für South, südlich) |
LLLLL.LLLL | L ängengrad |
l | Ausrichtung (E für East, östlich; W für West, westlich) |
GG.G | Geschwindigkeit über Grund in Knoten |
RR.R | Kurs über Grund in Grad bezogen auf geogr. Nord |
DDMMYY | Datum (Tag Monat Jahr) |
M.M | magnetische Abweichung (Ortsmissweisung) |
m | Vorzeichen der Abweichung (E oder W) |
F | Signalintegrität : A = Autonomous mode, D = Differential Mode, E = Estimated (dead-reckoning) mode M = Manual Input Mode S = Simulated Mode N = Data Not Valid |
PP | Hexadezimale Darstellung der Prüfsumme (Die Prüfsumme ergibt sich durch eine XOR-Verknüpfung aller Daten-Bytes zwischen (jeweils exklusive) dem Dollar-Zeichen ‚$‘ und dem Stern ‚*‘.) |
Um aus den selektierten Lat und Lon Daten den Dezimalgrad zu extrahieren kann folgende Pascal Funktion verwendet werden.
function GMSToDC(Str, Direction : String): String; {Convert NMEA latitude & longitude to decimal Here's how you convert latitude & longitude obtained from NMEA's GPGGA to decimal: N NMEA Decimal latitude 0302.78469 03 + (02.78469/60) = 3.046412 longitude 10141.82531 101 + 41.82531/60) = 101.6971 Notice that for latitude of 0302.78469, 03 ==> degress. counted as is 02.78469 ==> minutes. divide by 60 before adding to degrees above Hence, the decimal equivalent is: 03 + (02.78469/60) = 3.046412 } Var Grad, MinSec , DC: Extended; begin if Length(Str)=10 then //BBBB.BBBBB Breitengrad Begin Grad:= StrToInt(Copy(Str,1,2)); delete(Str,1,2); end else // LLLLL.LLLLL Längengrad Begin Grad:= StrToInt(Copy(Str,1,3)); delete(Str,1,3); end; while Pos('.', Str) > 0 do // Ersetze den Punkt durch ein komma Str[Pos('.', Str)] := ','; MinSec:= StrToFloat(Str)/60; DC:= Grad + MinSec; if (Direction='S') or (Direction='W') then DC := -DC; Result:= FloatToStr(DC); while Pos(',', Result) > 0 do Result[Pos(',', Result)] := '.'; end;
Das Zusammenbauen der KML-Datei erfolgt hier:
Procedure NMEAToKML(VarStringList:TStringList;Name:String;NMEAArray:array of TNMEA); Var I : Integer; Begin StringList.Add(''+#13#10+'<kml xmlns="http://www.opengis.net /kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2"xmlns:atom="http://www.w3.org/2005/Atom">'+#13#10+ '<Document><name>'+Name+'</name>'+#13#10+ '<Style id="sn_ylw-pushpin">'+#13#10+ '<IconStyle><scale>1.1</scale><Icon>'+#13#10+ '<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png'+#13#10+ '<hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>'+#13#10+ '<LineStyle><color>7f0000ff</color><width>5</width> </LineStyle>'+#13#10+ '<PolyStyle><color>7f0000ff</color></PolyStyle></Style>'+#13#10+ '<StyleMap id="msn_ylw-pushpin"><Pair><key>normal</key> <styleUrl>#sn_ylw-pushpin</styleUrl></Pair>'+#13#10+ '<Pair><key>highlight</key><styleUrl>#sh_ylw-pushpin</styleUrl></Pair></StyleMap>'+#13#10+ '<Placemark><name>'+FStopWatch.VeranstaltungsInfo+'#msn_ylw-pushpin1'+#13#10+ '<tessellate>1</tessellate><altitudeMode>relativeToGround</altitudeMode><coordinates>'); For I:= Low(NMEAArray) to High(NMEAArray) do StringList.Add(GMSToDC(NMEAArray[I].Lon, NMEAArray[I].NS)+ ',' + GMSToDC(NMEAArray[I].Lat, NMEAArray[I].EW) + ',10'); StringList.Add(''+#13#10+ '</LineString>'+#13#10+ '</Placemark>'+#13#10+ '</Document>'+#13#10+ '</kml>'); end;