Konvertieren von DMS zu DD mit Python in Field Calculator?

12

Ich muss Lat / Long, das in den Daten als Grad, Minuten und Sekunden ausgedrückt wird, in Dezimalgrade konvertieren . In den Daten sind sie beispielsweise in der Spalte Breitengrad als N335042.06 und in der Spalte Längengrad als W86031.04 aufgeführt. Ich habe dieses Problem bereits zuvor gelöst, als ich ein Skript erstellt habe, das DMS in DD konvertiert hat, und umgekehrt. Ich schätze, ich könnte Bits daraus verwenden. Aber das Problem, das ich habe, ist, wie man (mangels eines besseren Wortes) das 'N' und 'W' in den Daten ignoriert? Kann ich sie überspringen? Und DMS werden alle zusammen ohne Symbole oder Leerzeichen aufgelistet.

Kann ich len(), range(), split()zu spezifizieren , welcher Teil von dem Wert zu lesen? Kann zum Beispiel Folgendes tun?

N335042.06 wobei 33 = Grad 50 = Minuten 42.06 = Sekunden ...?

Ich bin auf diesen ESRI-Artikel gestoßen, aber er ist in VB. Wird wahrscheinlich als Referenz verwendet, aber einige der Begriffe / Syntax unterscheiden sich von Python.

Finaler Code, der funktioniert!

# Pre-logic
def latDD(x):
  D = int(x[1:3])
  M = int(x[3:5])
  S = float(x[5:])
  DD = D + float(M)/60 + float(S)/3600
  return DD

# Expression
latDD(!Latitude!)
kaoscify
quelle
4
7 Monate später musste ich herausfinden, wie ich das wieder tun sollte und landete hier. Danke, dass du deinen Code gepostet hast! :)
blah238

Antworten:

8
  • Sehen Sie sich den Abschnitt zum Schneiden im Python-Tutorial an . Sie können eine Reihe von Zeichen aus einer Zeichenfolge mit der Aufteilungssyntax abrufen, z D = int(x[1:2]).

    Versuchen Sie es für Sekunden S = float(x[5:]). Dadurch werden alle Zeichen ab Index 5 bis zum Ende der Zeichenfolge erfasst, falls Sie für Sekunden Werte mit variabler Länge haben.

  • Die !FieldName!Syntax ist nur im Ausdrucksfeld gültig. Sie müssen im Abschnitt "Vorlogik" eine Funktion definieren, die die Werte der gewünschten Felder aufnimmt und den gewünschten Wert zurückgibt. Rufen Sie dann im Ausdrucksfeld die Funktion auf und übergeben Sie die Feldwerte mithilfe der !FieldName!Syntax. Siehe Berechnen von Feldbeispielen in der Hilfe.
blah238
quelle
Das Folgende ist, was ich als meinen Code im Feldrechner habe, aber es zeigt an, dass die erste Zeile einen Fehler hat. Irgendwelche Ideen? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Und im Codeblock habe ich!Latitude! = DD
5.
Aktualisierte Antwort mit mehr Informationen, versuchen Sie es und lassen Sie uns wissen, wenn Sie immer noch Probleme haben.
blah238
Vielen Dank! Ankommen, aber ich bin auf einen neuen Fehler gestoßen. Ich habe meinen ersten Beitrag mit dem neuen Code bearbeitet. Gedanken? Tut mir leid, ich bin neu in Python, aber ich weiß Ihre Hilfe wirklich zu schätzen!
Kaoscify
Versuchen Sie es return DDstatt return latDD.
blah238
1
Ich habe sie entfernt print DDund geändert return latDD, return DDwie von Ihnen vorgeschlagen, und es hat funktioniert! Vielen Dank!
Kaoscify
-1

Mit nur Field Calculator ohne Vorlogik konnte ich dies für mich arbeiten lassen. Die Zeichenfolge, die ich hatte, hatte ein etwas anderes Format mit einigen Leerzeichen.

LAT-Wert wie "dd mm ss.ss" und ich habe dies im Taschenrechner verwendet.

float (! LAT! [0: 2]) + float (! LAT! [3: 5]) / 60+ float (! LAT! [6:]) / 3600

langer Wert wie "-dd mm ss.ss" und das für lange

float (! LONG_! [0: 3]) + float (! LONG_! [4: 6]) / 60+ float (! LONG_! [7:]) / 3600

haul_n_asphalt
quelle
2
Tatsächlich ist Ihr langer Wert falsch, da Sie mögliche negative Grade und positive Minuten und Sekunden haben. Verwenden Sie besser einen regulären Ausdruck import rein der Vorlogik
Mike T