Conversion de DMS en DD à l'aide de Python dans Field Calculator?

12

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!)
kaoscify
la source
4
7 mois plus tard, j'ai dû comprendre comment faire à nouveau et je me suis retrouvé ici, merci d'avoir publié votre code! :)
blah238

Réponses:

8
  • 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.

  • La !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.
blah238
la source
Ce qui suit est ce que j'ai comme code dans la calculatrice de champ, mais cela indique que la première ligne a une erreur. Des idées? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Et dans le bloc de code que j'ai!Latitude! = DD
kaoscify
Réponse mise à jour avec plus d'informations, essayez-la et faites-nous savoir si vous avez encore des problèmes.
blah238
Merci! J'y suis, mais j'ai rencontré une nouvelle erreur. J'ai édité mon premier article avec le nouveau code. Pensées? Désolé, je suis nouveau sur Python, mais j'apprécie vraiment votre aide!
kaoscify
Essayez return DDau lieu de return latDD.
blah238
1
J'ai enlevé print DDet changé return latDDpour return DDcomme vous le suggérez, et cela a fonctionné! Merci!
kaoscify
-1

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.

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

valeur longue comme "-dd mm ss.ss" et ceci pour longtemps

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

haul_n_asphalt
la source
2
En fait, votre valeur longue est erronée car vous pouvez avoir des degrés négatifs et des minutes et secondes positives. Mieux vaut utiliser une expression régulière import redans la pré-logique
Mike T