![]() |
Delphi-Version: 5
String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Ich habe in einem String Geo-Koordinaten in der form von: N 09° 42.756 E 008° 30.061
Zumindest sollten die so aussehen bevor sie weiterverarbeitet werden. Nun kann es aber passieren das der String die Koordinaten nicht in der optimalen Schreibweise enthält. Hier mal ein paar Varianten: N 09° 41.766 E 8° 30.061 < E 8° statt 008° N 9° 42.756 E 008° 30.061 < nur eine einstellige Ziffer bei 9 N 09° 42.756 E 008° 30.61 < nur zweistellige Ziffer bei 61 N 09° 42.756 E 008° 9.612 < nur einstellige Ziffer bei 9.612 N 9° 42.65 E 8° 9.546 < so ziemlich alles falsch oder es fehlen Leerzeichen: N09° 42.756 E008° 30.061 Wie bekomme ich es am einfachsten hin den String immer in das optimale Format zu bringen? |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Zerlege das Original in seine Bestandteile und bring ihn dann mit
![]() |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
so ungefähr hatte ich mir das auch vorgestellt. aber wie geht das am einfachsten?
grad= copy(koordstr,2,2) und dann mit pos prüfen ob ein ° Zeichen enthalten ist ?? und dann entsprechend reagieren? Mir kommt dieser Weg etwas umständlich vor. Das geht doch bestimmt einfacher, oder? |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Hiermit
Delphi-Quellcode:
var
LStrLst : TStringList; LStrLst := TStringList.Create; try LStrLst.Delimiter := ' '; LStrLst.StrictDelimiter := True; // evtl. in D2009 noch nicht bekannt, dann weglassen LStrLst.DelimitedText := 'N 09° 41.766 E 8° 30.061'; // Jetzt ist jeder Teil in einer Zeile von LStrLst finally LStrLst.Free; end; |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Ich würde den String an den Leerstellen in einzelne Parts zerlegen. Dann kannst Du anfangen, die Elemente zu untersuchen, ob sie ein gültiges Format darstellen.
Das erste Element muss ein N oder S sein. Wenn nicht -> Fehler schmeißen Das zweite Element muss mit ° enden und der Rest muss ne Zahl sein Das dritte Element muss eine Zahl mit Dezimaltrenner . sein. usw. Wenn diese Prüfungen alle erfolgreich sind, kannst Du die einzelnen Element formatieren und wieder zu einem String zusammen setzen. |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Das aber geht davon aus, dass zwingend alle Teile durch Leerzeichen getrennt sind. Da obige Varianten nicht alle sind, würde ich davon nicht ausgehen. Im Gegenteil würde ich eventuell sogar alle Leerzeichen rausnehmen (damit ist der Teil schonmal normiert), den zweiten Buchstaben raussuchen, an der Stelle trennen (damit ist das ganze in zwei identische Teilprobleme zerlegt) und beide Teile dann nach den Trennzeichen parsen.
|
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Also so etwa:
1. alle leerzeichen löschen = N49°41.766E8°31.672 2.nach E oder O suchen und den String in 2 Stücke teilen = "N49°41.766" und "E8°31.672" 3.prüfen ob 1. Buchstabe ein N oder S ist... weiter 4. prüfen an wievielter stelle das ° Zeichen kommt. kommt es an 3. stelle dann eine 0 vor anfügen ansonsten alles ok. macht aus N9° ~ N09° oder aus E8° ~ E008° 5. prüfen an wievielter stelle der . kommt. ist er an 6. stelle dann eine 0 vor anfügen ansonsten alles ok macht aus N49°7.123 ~ N49°07.123 6. prüfen wiviel ziffern kommen nach dem punkt. sind es 2 dann eine 0 vor anfügen. macht aus N49°07.23 ~ N49°07.023 7. fertig :) Müsste so OK sein, oder? |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Dafür würde ich einen kleinen Parser schreiben, der diesen String dann entsprechend Zeichen für Zeichen verarbeitet.
Kann man auch sehr schön mit dem ![]() |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Kleiner Test ohne jegliche Fehlerbehandlung:
Delphi-Quellcode:
uses StrUtils;
procedure TForm24.Button1Click(Sender: TObject); type TGeoData = record NSOrientation: char; NSDegree: integer; NSMinutes: double; EWOrientation: char; EWDegree: integer; EWMinutes: double; end; const DEGREESIGN = '°'; ORIGINAL = 'N 49° 41.766E8 °31.67 2'; var CurrentPos, NextPos: integer; Data: TGeoData; Settings: TFormatSettings; GeoData, s: string; begin Settings := TFormatSettings.Create; Settings.DecimalSeparator := '.'; ZeroMemory(@Data, SizeOf(Data)); GeoData := StringReplace(ORIGINAL, ' ', '', [rfReplaceAll]); Data.NSOrientation := GeoData[1]; CurrentPos := 2; NextPos := Pos(DEGREESIGN, GeoData); Data.NSDegree := StrToInt(Copy(GeoData, CurrentPos, NextPos - CurrentPos)); CurrentPos := NextPos + 1; NextPos := PosEx('E', AnsiUpperCase(GeoData), CurrentPos); if NextPos = 0 then NextPos := PosEx('W', AnsiUpperCase(GeoData), CurrentPos); Data.NSMinutes := StrToFloat(Copy(GeoData, CurrentPos, NextPos - CurrentPos), Settings); CurrentPos := NextPos + 1; Data.EWOrientation := GeoData[NextPos]; NextPos := PosEx(DEGREESIGN, GeoData, CurrentPos); Data.EWDegree := StrToInt(Copy(GeoData, CurrentPos, NextPos - CurrentPos)); CurrentPos := NextPos + 1; Data.EWMinutes := StrToFloat(Copy(GeoData, CurrentPos, MAXINT), Settings); s := Format('%s %.2d%s %.3f %s %.3d%s %.3f', [ Data.NSOrientation, Data.NSDegree, DEGREESIGN, Data.NSMinutes, Data.EWOrientation, Data.EWDegree, DEGREESIGN, Data.EWMinutes], Settings); ShowMessage(s); end; |
AW: String auf bestimmtest Format (Geokoordinaten) prüfen und verbessern
Mal ganz vorsichtig angemerkt, statt "N" könnte auch "S" vorkommen, und statt "E" "W".
Und auf das Gradzeichen würde ich mich auch nicht verlassen. Wenn dann sollte eher ein "allgemeines" Format zum Einsatz kommen [Bstb][trenn][Integer][Sndrz][trenn][Float][trenn] [Bstb][trenn][Integer][Sndrz][trenn][Float][NL] Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz