次の形式で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では機能しません。誰かがこの問題を解決するのを手伝ってくれる?
問題は、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""")
_
上記の関数(dms2dd)は正しくありません。
実際(エラーあり):
方向== 'E'または方向== 'N'の場合:dd * = -1
修正された状態:
方向== '[〜#〜] w [〜#〜]'または方向== '[〜#〜] s [〜#〜]'の場合:dd * = -1
これが私の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
Reを少し変更しました:
parts = re.split('[^\d\w\.]+', dms)
そして、@ Falkoがそれを機能させるようにアドバイスしたように、二重の二重引用符を使用するか、引用符文字をエスケープすることができます
parse_dms("53°19\'51.8\"N")
私はこれが古い質問であることを知っていますが、従う人にとっては、小数点の符号に関して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/
緯度の線の座標は正であるため、赤道の北を表します。数値が負の場合、赤道の南を表します。
[...]経度線の座標は正であるため、子午線の東を表します。数値が負の場合は、子午線の西を表します。
複数の座標については、パンダを使用してそれらを読み取ることができます。書式設定は重要です-空白があってはいけません。空白は、置換機能を使用して削除できます。出力は、テキストファイルまたはスプレッドシートとして簡単に保存できます。検証のために印刷し、小数点以下の桁数を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)