¿Convertir de DMS a DD usando Python en Field Calculator?

12

Necesito convertir lat / long que se expresa como grados, minutos y segundos en los datos en grados decimales. Por ejemplo, en los datos, se enumeran como N335042.06 en la columna Latitud y W86031.04 en la columna Longitud. He solucionado este problema antes de crear un script que convertía DMS a DD, y viceversa, así que supongo que podría usar bits de eso. Pero el problema que tengo es cómo ignorar (por falta de una palabra mejor) la 'N' y 'W' en los datos. ¿Puedo saltearlos? Y DMS se enumeran todos juntos sin ningún símbolo o espacio.

¿Puedo utilizar len(), range(), split()para especificar qué parte a leer a partir del valor? Por ejemplo, ¿puede hacer lo siguiente?

N335042.06 donde, 33 = grados 50 = minutos 42.06 = segundos ...?

Me encontré con este artículo de ESRI, pero está en VB. Probablemente lo usará como referencia, pero parte de la terminología / sintaxis es diferente de Python.

Código final que funciona!

# 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
fuente
44
7 meses después tuve que descubrir cómo hacerlo nuevamente y terminé aquí, ¡gracias por publicar su código! :)
blah238

Respuestas:

8
  • Eche un vistazo a la sección sobre corte en el tutorial de Python . Puede tomar un rango de caracteres de una cadena usando la sintaxis de corte, por ejemplo D = int(x[1:2]).

    Por unos segundos, inténtalo S = float(x[5:]). Esto capturará todos los caracteres que comienzan en el índice 5 hasta el final de la cadena, en el caso de que tenga valores de longitud variable por segundos.

  • La !FieldName!sintaxis solo es válida en el cuadro de expresión. Debe definir una función en la sección "prelógica" que tome los valores de los campos que desee y devuelva el valor deseado. Luego, en el cuadro de expresión, llame a la función y pase los valores de campo utilizando la !FieldName!sintaxis. Vea Calcular ejemplos de campo en la ayuda.
blah238
fuente
Lo siguiente es lo que tengo como mi código en la Calculadora de campo, pero indica que la primera línea tiene un error. ¿Algunas ideas? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Y en el bloque de código que tengo!Latitude! = DD
kaoscify
Respuesta actualizada con más información, pruébalo y avísanos si aún tienes problemas.
blah238
¡Gracias! Al llegar, pero he encontrado un nuevo error. He editado mi primera publicación con el nuevo código. Pensamientos? Lo siento, soy nuevo en Python, ¡pero realmente aprecio tu ayuda!
kaoscify
Intenta en return DDlugar de return latDD.
blah238
1
Quité print DDy cambié return latDDa lo return DDque sugeriste, y funcionó. ¡Gracias!
kaoscify
-1

Usando solo Field Calculator sin lógica previa, pude hacer que esto funcionara para mí. La cadena que tenía era un formato un poco diferente con algunos espacios.

Valor LAT como "dd mm ss.ss" y lo usé en la calculadora.

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

valor largo como "-dd mm ss.ss" y esto por mucho tiempo

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

haul_n_asphalt
fuente
2
En realidad, su valor largo es incorrecto ya que tiene posibles grados negativos y minutos y segundos positivos. Mejor usar una expresión regular import reen pre-lógica
Mike T