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

问题描述 投票:7回答:5

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

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

parsing gis
5个回答
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""")

4
投票

上述功能(dms2dd)不正确。

实际(有错误):

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

修正条件:

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


4
投票

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

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


1
投票

我稍微修改了一下:

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

并且@Falko建议使其工作,您可以使用双引号或转义引号字符

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

0
投票

对于多个坐标,您可以使用pandas读取它们。格式化很重要 - 不应该有任何空格。可以使用替换功能删除空格。输出可以轻松保存为文本文件或电子表格。我只是将它们打印出来进行验证,并将小数位置四舍五入为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)
© www.soinside.com 2019 - 2024. All rights reserved.