2012-06-01 6 views
7

こんにちは私はいくつかの位置情報を持つレガシーなデータベースを持っています。フィールドは、0°25'30"S, 91°7'Wのような文字列のテキストフィールドです。 Decimal LatitudeDecimal Longitudeの2つの浮動小数点数に変換できる方法はありますか?Python - GPSの位置をLat Lonの小数点に一括変換する

EDIT:

ですから、例えば次のようになります。0°25'30"S, 91°7'W - >0.425、元の単一のフィールド位置は2つのfloatを得91.116667

ご迷惑をおかけして申し訳ございません。

+0

が得られます。また、緯度には3つの数値フィールドがあり、経度2はこれらがどのように指定されているか(データ内では定数)の典型ですか?これまでに何を試しましたか? – Levon

+0

だから私は浮動小数点数に生成したい: '0°25'30" S、91°7'W' - > '0.425'、' 91.116667'。データに分が付いていてもいなくても良いようです。どれも、私は0 –

+0

経度 をとることができる180 W = -180 180 E = 180 緯度 90 N = 90 90のS = -90 例-0.425、-91.116667を与えてはならない。0°を検索することにより、これを確認し例えばGoogleマップでは25'30 "S、91°7'Wです。 –

答えて

2

これは、入力文字列を期待される出力に変換します。それは存在しない分と秒を処理することができます。

現在、北/南、東/西を考慮していません。どのように処理したいのか教えていただければ、私は答えを更新します。

# -*- coding: latin-1 -*- 
import re 

PATTERN = re.compile(r"""(?P<lat_deg>\d+)°  # Latitude Degrees 
         (?:(?P<lat_min>\d+)')? # Latitude Minutes (Optional) 
         (?:(?P<lat_sec>\d+)")? # Latitude Seconds (Optional) 
         (?P<north_south>[NS]) # North or South 
         ,[ ] 
         (?P<lon_deg>\d+)°  # Longitude Degrees 
         (?:(?P<lon_min>\d+)')? # Longitude Minutes (Optional) 
         (?:(?P<lon_sec>\d+)")? # Longitude Seconds (Optional) 
         (?P<east_west>[EW]) # East or West 
         """, re.VERBOSE) 

LAT_FIELDS = ("lat_deg", "lat_min", "lat_sec") 
LON_FIELDS = ("lon_deg", "lon_min", "lon_sec") 

def parse_dms_string(s, out_type=float): 
    """ 
    Convert a string of the following form to a tuple of out_type latitude, longitude. 

    Example input: 
    0°25'30"S, 91°7'W 
    """ 
    values = PATTERN.match(s).groupdict() 

    return tuple(sum(out_type(values[field] or 0)/out_type(60 ** idx) for idx, field in enumerate(field_names)) for field_names in (LAT_FIELDS, LON_FIELDS)) 


INPUT = """0°25'30"S, 91°7'W""" 

print parse_dms_string(INPUT) # Prints: (0.42500000000000004, 91.11666666666666) 
+0

ありがとうございます。これで私ができることを私に見せてください。 –

16

このアプローチでは、秒と分が不在であることを扱うことができる、と私は正確にコンパスの方向を扱うと思う:

# -*- coding: latin-1 -*- 

def conversion(old): 
    direction = {'N':1, 'S':-1, 'E': 1, 'W':-1} 
    new = old.replace(u'°',' ').replace('\'',' ').replace('"',' ') 
    new = new.split() 
    new_dir = new.pop() 
    new.extend([0,0,0]) 
    return (int(new[0])+int(new[1])/60.0+int(new[2])/3600.0) * direction[new_dir] 

lat, lon = u'''0°25'30"S, 91°7'W'''.split(', ') 
print conversion(lat), conversion(lon) 
#Output: 
0.425 91.1166666667 
+1

私の頭を傷つけないように+1してください.. "シンプルは複雑です。" – Levon

+1

regexes = +1はありません。 – Droogans

+0

そして、秒が浮動小数点形式であれば? – ratata

1

単純なアプローチ(私が理由のちょうど今日正規表現について自分自身を教えたことを考えますこの問題)。不足しているフィールドやコンパスの指示を扱う。

# -*- coding: latin-1 -*- 
import re 
s = """0°25'30"S, 91°7'W""" 

def compLat_Long(degs, mins, secs, comp_dir): 
    return (degs + (mins/60) + (secs/3600)) * comp_dir 

def extract_DegMinSec(data): 
    m = re.search(r'(\d+°)*(\d+\')*(\d+")*', data.strip()) 
    deg, mins, secs = [0.0 if m.group(i) is None else float(m.group(i)[:-1]) for i in range(1, 4)] 
    comp_dir = 1 if data[-1] in ('W', 'S') else -1 
    return deg, mins, secs, comp_dir 

s1, s2 = s.split(',') 
dms1 = extract_DegMinSec(s1) 
dms2 = extract_DegMinSec(s2) 
print('{:7.4f} {:7.4f}'.format(compLat_Long(*dms1), compLat_Long(*dms2))) 

あなたが提供する座標に対応する出力されるもの

0.4250 91.1167 
関連する問題