Conversione da DMS a DD utilizzando Python in Field Calculator?


12

Devo convertire lat / long che è espresso in gradi, minuti e secondi nei dati in gradi decimali. Ad esempio, nei dati, sono elencati come N335042.06 nella colonna Latitude e W86031.04 nella colonna Longitudine. Ho già fatto questo problema in cui ho creato uno script che ha convertito DMS in DD e viceversa, quindi immagino di poter usare bit da quello. Ma il problema che sto riscontrando è come ignorare (per mancanza di una parola migliore) la "N" e la "W" nei dati? Posso saltarli? E DMS sono elencati tutti insieme senza simboli o spazi.

Posso usare len(), range(), split()per specificare quale parte di leggere il valore? Ad esempio, è possibile effettuare le seguenti operazioni?

N335042.06 dove, 33 = gradi 50 = minuti 42.06 = secondi ...?

Mi sono imbattuto in questo articolo ESRI, ma è in VB. Probabilmente lo userà come riferimento, ma parte della terminologia / sintassi è diversa da Python.

Codice finale che funziona!

# 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 mesi dopo ho dovuto capire come farlo di nuovo e sono finito qui, grazie per aver pubblicato il tuo codice! :)
blah238,

Risposte:


8
  • Dai un'occhiata alla sezione sul taglio nel tutorial di Python . Puoi prendere un intervallo di caratteri da una stringa usando la sintassi di suddivisione, ad es D = int(x[1:2]).

    Per alcuni secondi, prova S = float(x[5:]). Questo prenderà tutti i caratteri che iniziano dall'indice 5 fino alla fine della stringa, nel caso in cui tu abbia valori di lunghezza variabile per secondi.

  • La !FieldName!sintassi è valida solo nella casella dell'espressione. È necessario definire una funzione nella sezione "pre-logica" che accetta i valori dei campi desiderati e restituisce il valore desiderato. Quindi, nella casella dell'espressione, chiama la funzione e passa i valori del campo usando la !FieldName!sintassi. Vedi gli esempi di Calculate Field nella guida.

Quello che segue è quello che ho come codice nel Field Calculator, ma indica che la prima riga ha un errore. Qualche idea? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600E nel blocco di codice che ho!Latitude! = DD
kaoscify il

Risposta aggiornata con maggiori informazioni, provala e facci sapere se hai ancora problemi.
blah238,

Grazie! Come arrivarci, ma ho riscontrato un nuovo errore. Ho modificato il mio primo post con il nuovo codice. Pensieri? Mi dispiace, sono nuovo di Python, ma apprezzo molto il tuo aiuto!
Kaoscify,

Prova return DDinvece di return latDD.
blah238,

1
Ho rimosso print DDe cambiato return latDDper return DDcome da te suggerito, e ha funzionato! Grazie!
Kaoscify,

-1

Usando solo Field Calculator senza pre-logica sono stato in grado di farlo funzionare per me. La stringa che avevo era un formato leggermente diverso con alcuni spazi.

Valore LAT come "dd mm ss.ss" e l'ho usato nella calcolatrice.

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

valore lungo come "-dd mm ss.ss" e questo per molto tempo

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


2
In realtà, il tuo valore lungo è sbagliato poiché hai possibili gradi negativi e minuti e secondi positivi. Meglio usare un'espressione regolare import rein pre-logica
Mike T
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.