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!)
Respostas:
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.!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.fonte
x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600
E no bloco de código que eu tenho!Latitude! = DD
return DD
vez dereturn latDD
.print DD
e mudeireturn latDD
parareturn DD
como você sugeriu, e funcionou! Obrigado!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.
valor longo como "-dd mm ss.ss" e isso por muito tempo
fonte
import re
na pré-lógica