从文本文件中的数据将度分转换为弧度

Converting degrees-minutes to radians from data in a text file

例如在我的文本文件中,Data.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

这些分别是侧面、轴承和 length/distance。我怎样才能把它转换成弧度? (之后我会得到纬度和出发点,但如果我能先得到这个我会稍后再做)然后我把结果写成一个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())

我不确定我是否理解你的数据,所以这只是字符串转换部分的粗略提示:

# s = "05-30-00"
(degrees, minutes, seconds) = \
   map(float, re.match("(\d+)-(\d+)-(\d+)", s).groups())

获得 degreesminutesseconds 后,您 "flatten" 将它们合并为一个值:

degrees = degrees + minutes / 60.0 + seconds / 3600.0

最后,

rads = math.radians(degrees)

将按照您的提示完成转换。

根据您的用途,您可能希望根据罗盘方向翻转标志,例如:

if compass in ('W', 'S'):
  degrees = -degrees

有关转化的更多详细信息,请查找“Geographic coordinate conversion”。

是的,Jay Kominek 是对的。

只需添加到他的回答即可。

  1. 根据 Jay 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