web-dev-qa-db-ja.com

度分秒を度小数に変換する方法

次の形式でGPSから緯度と経度を受け取ります。

緯度:78°55'44.29458 "N

このデータを次のように変換する必要があります。

緯度:78.9288888889

私はこのコードをここに見つけました: link

import re

def dms2dd(degrees, minutes, seconds, direction):
    dd = float(degrees) + float(minutes)/60 + float(seconds)/(60*60);
    if direction == 'E' or direction == 'N':
        dd *= -1
    return dd;

def dd2dms(deg):
    d = int(deg)
    md = abs(deg - d) * 60
    m = int(md)
    sd = (md - m) * 60
    return [d, m, sd]

def parse_dms(dms):
    parts = re.split('[^\d\w]+', dms)
    lat = dms2dd(parts[0], parts[1], parts[2], parts[3])

    return (lat)

dd = parse_dms("78°55'44.33324"N )

print(dd)

このフォーマットで機能しています

dd = parse_dms("78°55'44.33324'N" )

しかし、それは私のdatafromatでは機能しません。誰かがこの問題を解決するのを手伝ってくれる?

11
bikuser

問題は、44.29458秒が_._で分割されることです。

notを分割する場所ではなく)分割文字を直接定義することもできます。

_>>> re.split('[°\'"]+', """78°55'44.29458"N""")
['78', '55', '44.29458', 'N']
_

または正規表現をそのままにして、パート2と3をマージします。

_dms2dd(parts[0], parts[1], parts[2] + "." + parts[3], parts[4])
_

更新:

メソッド呼び出しdd = parse_dms("78°55'44.33324"N )は構文エラーです。最後の_"_を追加して、もう1つをエスケープします。または、文字列の定義に三重引用符を使用します。

_parse_dms("""78°55'44.29458"N""")
_
5
Falko

上記の関数(dms2dd)は正しくありません。

実際(エラーあり):

方向== 'E'または方向== 'N'の場合:dd * = -1

修正された状態:

方向== '[〜#〜] w [〜#〜]'または方向== '[〜#〜] s [〜#〜]'の場合:dd * = -1

7

これが私の1つのライナーです(細かい、細かい-多分それは2行です):)

import re
lat = '''51°36'9.18"N'''
deg, minutes, seconds, direction =  re.split('[°\'"]', lat)
(float(deg) + float(minutes)/60 + float(seconds)/(60*60)) * (-1 if direction in ['W', 'S'] else 1)

これは51.60255

5
Inti

Reを少し変更しました:

parts = re.split('[^\d\w\.]+', dms)

そして、@ Falkoがそれを機能させるようにアドバイスしたように、二重の二重引用符を使用するか、引用符文字をエスケープすることができます

parse_dms("53°19\'51.8\"N")
2
Lili

私はこれが古い質問であることを知っていますが、従う人にとっては、小数点の符号に関してdms2dd()関数のロジックが間違っているようだと私が指摘したと思います。あなたが持っている:

if direction == 'E' or direction == 'N':
    dd *= -1

ただし、方向が本初子午線の西(W)または赤道の南(S)である場合にのみ負になります。だからそれはむしろすべきです:

if direction == 'W' or direction == 'S':
    dd *= -1

これは徹底的なガイドからの引用です: https://www.ubergizmo.com/how-to/read-gps-coordinates/

緯度の線の座標は正であるため、赤道の北を表します。数値が負の場合、赤道の南を表します。

[...]経度線の座標は正であるため、子午線の東を表します。数値が負の場合は、子午線の西を表します。

0
Isaac Asante

複数の座標については、パンダを使用してそれらを読み取ることができます。書式設定は重要です-空白があってはいけません。空白は、置換機能を使用して削除できます。出力は、テキストファイルまたはスプレッドシートとして簡単に保存できます。検証のために印刷し、小数点以下の桁数を4に四捨五入しました。

### read input file
df = pd.read_Excel('dms.xlsx')

n = len(df)

for i in range(n):
  Lat_d = round(parse_dms(df.Lat[i].replace(" ", "")),4)
  Long_d = round(parse_dms(df.Long[i].replace(" ", "")),4)
  print(Lat_d, Long_d)
0
bfree67