Comment puis-je extraire les coordonnées x, y et z à partir de données géographiques avec Python?
-
20-08-2019 - |
Question
J'ai des données géographiques qui ont 14 variables. Les données sont au format suivant:
QUADNAME: rockport_colony_SD RÉSOLUTION: 10 ULLAT: 43.625
ULLON: -97.87527466 LRLAT: 43.5
LRLON: -97.75027466 HDATUM: 27
ZMIN: 361.58401489 ZMAX: 413.38400269 ZMEAN: 396.1293335 ZSIGMA: 12.36359215 PMETHOD: 5
QUADDATE: 20001001
Les données entières ont de nombreuses variables précédentes dans la séquence.
Comment puis-je extraire les coordonnées ULLAT, ULLON et LRLAT des données dans trois listes, de sorte que chaque ligne correspond à un emplacement?
Cette question a été soulevée par le problème dans the post .
La solution
Quelque chose comme cela pourrait fonctionner si les données sont dans un grand fichier texte plat:
import re
data = """
QUADNAME: rockport_colony_SD RESOLUTION: 10 ULLAT: 43.625
ULLON: -97.87527466 LRLAT: 43.5
LRLON: -97.75027466 HDATUM: 27
ZMIN: 361.58401489 ZMAX: 413.38400269 ZMEAN: 396.1293335 ZSIGMA: 12.36359215 PMETHOD: 5
QUADDATE: 20001001
"""
regex = re.compile(
r"""ULLAT:\ (?P<ullat>-?[\d.]+).*?
ULLON:\ (?P<ullon>-?[\d.]+).*?
LRLAT:\ (?P<lrlat>-?[\d.]+)""", re.DOTALL|re.VERBOSE)
print regex.findall(data) # Yields: [('43.625', '-97.87527466', '43.5')]
Autres conseils
Étant donné qu'un lecteur de StreamReader est nommé, cela devrait vous donner une liste de (float, float, float). Je suggère une liste de 3-tuples, car il sera probablement plus pratique et plus efficace de s'y déplacer, à moins que, pour une raison quelconque, vous ne souhaitiez obtenir que tous les points individuellement.
coords = []
reader
while line=reader.readline():
index_ullat = line.find("ULLAT")
if index_ullat >= 0:
ullat = float(line[ index_ULLAT+7 : ])
line = reader.readline()
index_ullon = line.find("ULLON")
index_lrlat = line.find("LRLAT")
if index_ullon >= 0 and index_lrlat >= 0:
ullon = float(line[ index_ullon+7 : index_lrlat-1 ])
lrlat = float(line[ index_lrlat+7 : ])
else:
raise InputError, "ULLON and LRLAT didn't follow ULLAT."
coords.append(ullat, ullon, lrlat)
Cela peut marcher, mais c'est moche. Je ne suis pas un expert en analyse de chaîne.