Schlagwort-Archive: Goole Earth

NMEA nach Dezimalgrad umrechenen und als KML-Datei f├╝r Google Earth zusammenbauen

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;