Как я могу извлечь координаты x, y и z из географических данных с помощью Python?

У меня есть географические данные, которые имеют 14 переменных. Данные представлены в следующем формате:

QUADNAME: rockport_colony_SD РЕШЕНИЕ: 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
КВАДРАТА: 20001001

Все данные имеют много предыдущих переменных в последовательности.

Как я могу извлечь координаты ULLAT, ULLON и LRLAT из данных в три списка, чтобы каждая строка соответствовала одному местоположению?

Этот вопрос был поднят проблемой в пост.


person Léo Léopold Hertz 준영    schedule 28.01.2009    source источник
comment
Являются ли данные в нескольких строках, как указано выше, или это проблема форматирования?   -  person UnkwnTech    schedule 29.01.2009
comment
Вместо трех списков вы можете использовать один список из трех кортежей.   -  person Nikhil Chelliah    schedule 29.01.2009
comment
Кроме того, я предполагаю, что под LRNAT вы подразумеваете LRLAT.   -  person Nikhil Chelliah    schedule 29.01.2009
comment
Unkwntech: Это проблема форматирования.   -  person Léo Léopold Hertz 준영    schedule 29.01.2009


Ответы (2)


Что-то вроде этого может работать, если все данные находятся в большом плоском текстовом файле:

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')]
person cdleary    schedule 29.01.2009
comment
@Nick: Извините, но я не понимаю вашего комментария - вы говорите, что я мог бы сделать что-то более читабельным? Это была своего рода демонстрация концепции того, как вы можете использовать регулярное выражение для анализа данных. - person cdleary; 29.01.2009
comment
Благодарю вас! Теперь у меня есть ваш код в файле .py. Как я могу использовать его для обработки .txt файла? Я предполагаю, что нам нужен параметр в файле .py, чтобы мы могли использовать такой синтаксис, как $ py-file файл для обработки - person Léo Léopold Hertz 준영; 29.01.2009
comment
@Masi: Похоже, это должно быть содержанием другого вопроса! - person cdleary; 29.01.2009
comment
@cdleary: новый пост здесь: stackoverflow.com/questions/491085/ - person Léo Léopold Hertz 준영; 29.01.2009

Учитывая именованный читатель StreamReader, это должно дать вам список ( плавать, плавать, плавать). Я предлагаю список из 3-х кортежей, потому что, вероятно, будет удобнее и эффективнее пройтись по нему, если только вы по какой-то причине не хотите получать все точки по отдельности.

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)

Это может работать, но это некрасиво. Я не эксперт в разборе строк.

person Nikhil Chelliah    schedule 29.01.2009
comment
Изменить: просто указал ссылку на новую, более красивую документацию. :-) - person cdleary; 29.01.2009