Преобразование градусов-минут в радианы из данных в текстовом файле
Например, в моем текстовом файле, Данные.txt :
AB N05-30-00E 495.85
BC N46-02-00E 850.62
CD S67-38-00E 855.45
DE S12-25-00E 1020.87
EF S83-44-00W 1117.26
FA N55-09-00W 660.08
Это стороны, Азимут и длина/расстояние соответственно. Как я могу преобразовать это в радианы? (после этого я получу широту и отправление, но я сделаю это позже, если только я смогу получить это первым) затем я пишу файл txt с результатами, четвертый и пятый-это широта и отправление.
import math
fileread = open("Data.txt","r")
data = fileread.read
#missing code, convert the string to degrees decimal?
print "%.3f" % math.cos(math.radians())
2 ответа:
Да, Джей Коминек прав.
Просто добавьте к его ответу.
- создал функцию по Джей Kominek ответа.
- чтение входного файла модулями
CSV
, поскольку файл хорошо структурирован.- вычислить выходные данные и записать строку в выходной файл.
Входные данные :
AB N05-30-00E 495.85 BC N46-02-00E 850.62 CD S67-38-00E 855.45 DE S12-25-00E 1020.87 EF S83-44-00W 1117.26 FA N55-09-00W 660.08
Демо :
import csv import math import re def convertRedis(format_input): """ Coordinate format conversion degrees minutes seconds: decimal degrees = degrees + minutes}/60 + seconds/3600. """ degrees, minutes, seconds = map(float, re.match("\w(\d+)-(\d+)-(\d+)\w", format_input).groups()) degrees = degrees + minutes/60 + seconds/3600 return math.radians(degrees) with open("Technical Description.txt") as fp: root_r = csv.reader(fp) root_r = csv.reader(fp, delimiter='\t') with open("output.txt", "wb+") as fp2: root_w = csv.writer(fp2, delimiter='\t') for row in root_r: rads = convertRedis(row[1]) new_row = list(row) distance = float(row[2]) if "S" in row[1]: d_cos = "%.2f"%(distance*math.cos(rads) * -1, ) else: d_cos = "%.2f"%(distance*math.cos(rads), ) if "W" in row[1]: d_sin = "%.2f"%(distance*math.sin(rads) * -1, ) else: d_sin = "%.2f"%(distance*math.sin(rads), ) new_row.extend([d_sin, d_cos]) root_w.writerow(new_row)
Вывод:
AB N05-30-00E 495.85 47.53 493.57 BC N46-02-00E 850.62 612.23 590.53 CD S67-38-00E 855.45 791.09 -325.53 DE S12-25-00E 1020.87 219.51 -996.99 EF S83-44-00W 1117.26 -1110.58 -121.96 FA N55-09-00W 660.08 -541.70 377.19
Я не уверен, что понимаю, что представляют собой ваши данные, поэтому это всего лишь грубый намек на часть преобразования строк:
# s = "05-30-00" (degrees, minutes, seconds) = \ map(float, re.match("(\d+)-(\d+)-(\d+)", s).groups())
Как только вы получите
degrees
,minutes
, иseconds
, вы "сглаживаете" их в одно значение:degrees = degrees + minutes / 60.0 + seconds / 3600.0
Наконец,
rads = math.radians(degrees)
Завершит это преобразование, как вы намекнули.
В зависимости от того, что вы делаете с ним, вы можете перевернуть знак, основываясь на направлении компаса, например:
if compass in ('W', 'S'): degrees = -degrees
Для получения более подробной информации о преобразованиях, lookup "преобразование географических координат ".