如何将度数分钟转换为十进制度数

时间:2015-11-30 11:18:20

标签: python parsing gis

我使用以下格式从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" )

但它不适用于我的数据图层。任何人都可以帮我解决这个问题吗?

8 个答案:

答案 0 :(得分:4)

问题是秒44.29458被分割为.

您可以直接定义拆分字符(而不是分割的位置):

>>> 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 )是语法错误。添加结束"并转义另一个。或者使用tripple引号进行字符串定义:

parse_dms("""78°55'44.29458"N""")

答案 1 :(得分:3)

上面的功能(dms2dd)不正确。

实际(有错误):

如果方向=='E'或方向=='N':         dd * = -1

更正条件:

如果方向==' W '或方向==' S ':         dd * = -1

答案 2 :(得分:3)

这是我的一支班轮(很好,很好–也许是两行):)

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

答案 3 :(得分:2)

我知道这是一个古老的问题,但是对于接下来的人来说,只是以为我要指出的是,您的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 :(得分:2)

您可以使用此模块 https://pypi.org/project/dms2dec/

将 DMS 转换为十进制。

用法

from dms2dec.dms_convert import dms2dec

dms2dec('''36°44'47.69"N''') # converts to dec
dms2dec('''3° 2'33.53"E''') # converts to dec

答案 5 :(得分:1)

我稍微修改了一下:

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

正如@Falko建议的那样,你可以使用双引号或转义引号字符

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

答案 6 :(得分:0)

对于多个坐标,您可以使用熊猫阅读它们。格式化很重要-不应有任何空格。可以使用替换功能删除空格。输出可以轻松保存为文本文件或电子表格。我只是打印它们以进行验证,然后将小数点后的位置四舍五入到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)

答案 7 :(得分:0)

如果您的数据位于 DataFrame 中,您可以使用库 clean_lat_long() 中的函数 DataPrep。使用 const [fileUrl, setFileUrl] = React.useState(null); const [progress, setProgress] = useState(0); const onFileChange = async (e) => { const file = e.target.files[0]; const d = uuid(); const storageRef = firebase.storage().ref(d); const fileRef = storageRef.child(file.name); await fileRef.put(file).on('state_changed', async(snap) => { let percentage = (snap.bytesTransferred / snap.totalBytes) * 100; await setProgress(percentage)}); setFileUrl(await fileRef.getDownloadURL()); }; 安装 DataPrep。

pip install dataprep