Преобразование градусов-минут в радианы из данных в текстовом файле


Например, в моем текстовом файле, Данные.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 2

2 ответа:

Да, Джей Коминек прав.

Просто добавьте к его ответу.

  1. создал функцию по Джей Kominek ответа.
  2. чтение входного файла модулями CSV, поскольку файл хорошо структурирован.
  3. вычислить выходные данные и записать строку в выходной файл.

Входные данные :

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 "преобразование географических координат ".