Convertendo de DMS para DD usando Python na calculadora de campo?


12

Preciso converter lat / long que é expresso em graus, minutos e segundos nos dados em graus decimais. Por exemplo, nos dados, eles são listados como N335042.06 na coluna Latitude e W86031.04 na coluna Longitude. Eu já fiz esse problema antes, onde criei um script que convertia o DMS em DD e vice-versa, então acho que poderia usar bits disso. Mas o problema que estou tendo é como ignorar (por falta de uma palavra melhor) o 'N' e 'W' nos dados? Posso pular eles? E o DMS é listado todos juntos, sem símbolos ou espaços.

Posso usar len(), range(), split()para especificar que parte para ler a partir do valor? Por exemplo, você pode fazer o seguinte?

N335042.06 em que, 33 = graus 50 = minutos 42,06 = segundos ...?

Me deparei com este artigo da ESRI, mas está no VB. Provavelmente o usará como referência, mas parte da terminologia / sintaxe é diferente do 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!)

4
Sete meses depois, tive que descobrir como fazer isso novamente e acabei aqui, obrigado por postar seu código! :)
blah238

Respostas:


8
  • Dê uma olhada na seção sobre fatiamento no tutorial do Python . Você pode pegar um intervalo de caracteres de uma string usando a sintaxe de fatia, por exemplo D = int(x[1:2]).

    Por segundos, tente S = float(x[5:]). Isso capturará todos os caracteres que começam no índice 5 até o final da string, caso você tenha valores de comprimento variável por segundos.

  • A !FieldName!sintaxe é válida apenas na caixa de expressão. Você precisa definir uma função na seção "pré-lógica" que aceite os valores dos campos desejados e retorne o valor desejado. Em seguida, na caixa de expressão, chame a função e passe os valores do campo usando a !FieldName!sintaxe. Consulte Calcular exemplos de campos na ajuda.

A seguir, o que tenho como código na Calculadora de campo, mas está indicando que a primeira linha tem um erro. Alguma ideia? 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 no bloco de código que eu tenho!Latitude! = DD
kaoscify 5/11

Resposta atualizada com mais informações, experimente e informe-nos se você ainda tiver problemas.
blah238

Obrigado! Chegando lá, mas encontrei um novo erro. Eu editei meu primeiro post com o novo código. Pensamentos? Desculpe, eu sou novo no Python, mas eu realmente aprecio sua ajuda!
kaoscify

Tente em return DDvez de return latDD.
blah238

1
Eu removi print DDe mudei return latDDpara return DDcomo você sugeriu, e funcionou! Obrigado!
kaoscify

-1

Usando apenas a Calculadora de Campo, sem pré-lógica, consegui fazer isso funcionar para mim. A string que eu tinha era um formato um pouco diferente, com alguns espaços.

LAT valor como "dd mm ss.ss" e eu usei isso na calculadora.

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

valor longo como "-dd mm ss.ss" e isso por muito tempo

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


2
Na verdade, seu valor longo está errado, pois você tem possíveis graus negativos e minutos e segundos positivos. É melhor usar uma expressão regular import rena pré-lógica
Mike T
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.