Konwertujesz z DMS do DD za pomocą Pythona w kalkulatorze polowym?


12

Muszę przekonwertować długość / długość wyrażoną w stopniach, minutach i sekundach w dane na stopnie dziesiętne. Na przykład w danych są one wymienione jako N335042.06 w kolumnie Szerokość i W86031.04 w kolumnie Długość. Zrobiłem ten problem wcześniej, kiedy stworzyłem skrypt, który przekonwertował DMS na DD i odwrotnie, więc myślę, że mógłbym z tego skorzystać. Ale mam problem z tym, jak zignorować (z braku lepszego słowa) „N” i „W” w danych? Czy mogę je pominąć? I DMS są wymienione razem bez symboli i spacji.

Czy mogę używać len(), range(), split()aby określić, jaka część odczytać z wartości? Na przykład, czy można wykonać następujące czynności?

N335042.06 gdzie, 33 = stopnie 50 = minuty 42,06 = sekundy ...?

Natknąłem się na ten artykuł ESRI, ale jest w VB. Prawdopodobnie użyje go jako odniesienia, ale niektóre terminologie / składnie różnią się od Pythona.

Ostateczny kod, który działa!

# 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!)

4
7 miesięcy później musiałem wymyślić, jak to zrobić ponownie i znalazłem się tutaj, dzięki za opublikowanie kodu! :)
blah238

Odpowiedzi:


8
  • Spójrz na sekcję dotyczącą krojenia w samouczku Python . Możesz pobrać zakres znaków z ciągu przy użyciu składni krojenia, np D = int(x[1:2]).

    Spróbuj przez sekundę S = float(x[5:]). Spowoduje to złapanie wszystkich znaków, począwszy od indeksu 5 do końca ciągu, w przypadku, gdy masz wartości zmiennej długości dla sekund.

  • !FieldName!Składnia jest ważna tylko w polu ekspresji. Musisz zdefiniować funkcję w sekcji „pre-logika”, która przyjmuje wartości pól, które chcesz i zwraca żądaną wartość. Następnie w polu wyrażenia wywołaj funkcję i przekaż wartości pola, używając !FieldName!składni. Zobacz temat Obliczanie przykładów pól w pomocy.

Oto, co mam jako mój kod w kalkulatorze polowym, ale oznacza to, że w pierwszym wierszu wystąpił błąd. Jakieś pomysły? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600A w bloku kodu mam!Latitude! = DD
kaoscify,

Zaktualizowałem odpowiedź z większą ilością informacji, spróbuj i daj nam znać, jeśli nadal masz problemy.
blah238,

Dzięki! Jak się tam dostać, ale napotkałem nowy błąd. Zedytowałem swój pierwszy post z nowym kodem. Myśli? Przepraszam, jestem nowy w Pythonie, ale naprawdę doceniam twoją pomoc!
kaoscify

Spróbuj return DDzamiast return latDD.
blah238,

1
Usunąłem print DDi zmienił return latDDsię return DDtak, jak sugerował, i to działa! Dzięki!
kaoscify

-1

Używając tylko kalkulatora pola bez uprzedniej logiki, mogłem sprawić, że to zadziała dla mnie. Ciąg, który miałem, był trochę inny format z pewnymi spacjami.

Wartość LAT jak „dd mm ss.ss” i użyłem tego w kalkulatorze.

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

długa wartość jak „-dd mm ss.ss” i to na długo

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


2
W rzeczywistości twoja długa wartość jest błędna, ponieważ masz możliwe ujemne stopnie i dodatnie minuty i sekundy. Lepiej użyj wyrażenia regularnego import rew pre-logice
Mike T
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.