J'ai besoin de convertir lat / long exprimé en degrés, minutes et secondes dans les données en degrés décimaux. Par exemple, dans les données, ils sont répertoriés comme N335042.06 dans la colonne Latitude et W86031.04 dans la colonne Longitude. J'ai déjà fait ce problème avant de créer un script qui convertissait DMS en DD, et vice-versa, donc je suppose que je pourrais utiliser des bits de cela. Mais le problème que j'ai est de savoir comment ignorer (faute d'un meilleur mot) le «N» et le «W» dans les données? Puis-je les ignorer? Et les DMS sont répertoriés tous ensemble sans aucun symbole ni espace.
Puis - je utiliser len()
, range()
, split()
de préciser quelle partie à lire de la valeur? Par exemple, pouvez-vous faire ce qui suit?
N335042.06 où, 33 = degrés 50 = minutes 42.06 = secondes ...?
Je suis tombé sur cet article ESRI, mais il est en VB. L'utilisera probablement comme référence mais une partie de la terminologie / syntaxe est différente de Python.
Code final qui fonctionne!
# 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!)
Réponses:
Jetez un œil à la section sur le découpage dans le didacticiel Python . Vous pouvez saisir une plage de caractères d'une chaîne en utilisant la syntaxe de découpage, par exemple
D = int(x[1:2])
.Pendant quelques secondes, essayez
S = float(x[5:])
. Cela récupérera tous les caractères à partir de l'index 5 jusqu'à la fin de la chaîne, dans le cas où vous avez des valeurs de longueur variable pour les secondes.!FieldName!
syntaxe n'est valide que dans la zone d'expression. Vous devez définir une fonction dans la section "pré-logique" qui prend les valeurs des champs que vous souhaitez et renvoie la valeur souhaitée. Ensuite, dans la zone d'expression, appelez la fonction et transmettez les valeurs de champ à l'aide de la!FieldName!
syntaxe. Voir les exemples Calculer un champ dans l'aide.la source
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
Et dans le bloc de code que j'ai!Latitude! = DD
return DD
au lieu dereturn latDD
.print DD
et changéreturn latDD
pourreturn DD
comme vous le suggérez, et cela a fonctionné! Merci!En utilisant simplement Field Calculator sans pré-logique, j'ai pu faire fonctionner cela pour moi. La chaîne que j'avais était un format un peu différent avec quelques espaces.
Valeur LAT comme "dd mm ss.ss" et j'ai utilisé cela dans la calculatrice.
valeur longue comme "-dd mm ss.ss" et ceci pour longtemps
la source
import re
dans la pré-logique