web-dev-qa-db-fra.com

Comment convertir des degrés minutes secondes en degrés décimaux

Je reçois la latitude et la longitude du GPS avec ce format:

Latitude: 78 ° 55'44.29458 "N

J'ai besoin de convertir ces données en:

latitude: 78.9288888889

J'ai trouvé ce code ici: lien

import re

def dms2dd(degrees, minutes, seconds, direction):
    dd = float(degrees) + float(minutes)/60 + float(seconds)/(60*60);
    if direction == 'E' or direction == 'N':
        dd *= -1
    return dd;

def dd2dms(deg):
    d = int(deg)
    md = abs(deg - d) * 60
    m = int(md)
    sd = (md - m) * 60
    return [d, m, sd]

def parse_dms(dms):
    parts = re.split('[^\d\w]+', dms)
    lat = dms2dd(parts[0], parts[1], parts[2], parts[3])

    return (lat)

dd = parse_dms("78°55'44.33324"N )

print(dd)

Il fonctionne pour ce format

dd = parse_dms("78°55'44.33324'N" )

mais cela ne fonctionne pas pour mes données. Quelqu'un peut m'aider à résoudre ce problème?

11
bikuser

Le problème est que les secondes 44.29458 sont divisées en ..

Vous pouvez soit définir les caractères séparés directement (au lieu de l'endroit où pas diviser):

>>> re.split('[°\'"]+', """78°55'44.29458"N""")
['78', '55', '44.29458', 'N']

ou laissez l'expression régulière telle qu'elle est et fusionnez les parties 2 et 3:

dms2dd(parts[0], parts[1], parts[2] + "." + parts[3], parts[4])

Mise à jour:

Votre appel de méthode dd = parse_dms("78°55'44.33324"N ) est une erreur de syntaxe. Ajoutez le " De fermeture et échappez à l'autre. Ou utilisez des guillemets triples pour la définition de chaîne:

parse_dms("""78°55'44.29458"N""")
5
Falko

La fonction ci-dessus (dms2dd) est incorrecte.

Réel (avec erreur):

si direction == 'E' ou direction == 'N': dd * = -1

État corrigé:

si direction == ' W ' ou direction == ' S ': dd * = -1

7
Rodrigo Santiago

Voici ma doublure (fine, fine - c'est peut-être deux lignes) :)

import re
lat = '''51°36'9.18"N'''
deg, minutes, seconds, direction =  re.split('[°\'"]', lat)
(float(deg) + float(minutes)/60 + float(seconds)/(60*60)) * (-1 if direction in ['W', 'S'] else 1)

Cela génère 51.60255

5
Inti

J'ai légèrement modifié le re:

parts = re.split('[^\d\w\.]+', dms)

Et comme @Falko l'a conseillé pour le faire fonctionner, vous pouvez soit utiliser des guillemets doubles ou échapper vos caractères de guillemets

parse_dms("53°19\'51.8\"N")
2
Lili

Je sais que c'est une vieille question, mais pour ceux qui suivent, je pensais simplement que vous sembliez avoir une logique incorrecte dans votre fonction dms2dd() concernant le signe de vos décimales. Tu as:

if direction == 'E' or direction == 'N':
    dd *= -1

Mais il ne devrait être négatif que si la direction est à l'ouest (W) du méridien premier ou au sud (S) de l'équateur. Il faudrait donc plutôt:

if direction == 'W' or direction == 'S':
    dd *= -1

Voici une citation d'un guide complet: https://www.ubergizmo.com/how-to/read-gps-coordinates/

La coordonnée de la ligne de latitude représente le nord de l'équateur car elle est positive. Si le nombre est négatif, il représente au sud de l'équateur.

[...] La coordonnée de la ligne de longitude représente l'est du premier méridien car elle est positive. Si le nombre est négatif, il représente l'ouest du premier méridien.

0
Isaac Asante

Pour plusieurs coordonnées, vous pouvez les lire à l'aide de pandas. Le formatage est important - il ne doit pas y avoir d'espace blanc. Les espaces blancs peuvent être supprimés à l'aide de la fonction de remplacement. Les sorties peuvent être facilement enregistrées sous forme de fichier texte ou de feuille de calcul. Je viens de les imprimer pour validation et j'ai arrondi les décimales à 4.

### read input file
df = pd.read_Excel('dms.xlsx')

n = len(df)

for i in range(n):
  Lat_d = round(parse_dms(df.Lat[i].replace(" ", "")),4)
  Long_d = round(parse_dms(df.Long[i].replace(" ", "")),4)
  print(Lat_d, Long_d)
0
bfree67