2015-05-01 3 views
2

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

Эти стороны, несущие и длина/расстояние соответственно. Как я могу преобразовать это в радианы? (после этого я получу широту и отклонения, но я сделаю это позже, если только я смогу получить этот первый). Затем я пишу 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()) 

ответ

1

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

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

  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 
3

Я не уверен, я понимаю, что ваши подарки данных, так что это просто грубый намек на части преобразования строки:

# 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 

Для получения более подробной информации о преобразованиях, подстановки «Geographic coordinate conversion».