我使用以下格式从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" )
但它不适用于我的数据帧。任何人都可以帮我解决这个问题吗?
问题是秒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""")
上述功能(dms2dd)不正确。
实际(有错误):
如果direction =='E'或direction =='N':dd * = -1
修正条件:
如果direction =='W'或direction =='S':dd * = -1
这是我的一个班轮(很好,很好 - 也许是两行):)
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
我稍微修改了一下:
parts = re.split('[^\d\w\.]+', dms)
并且@Falko建议使其工作,您可以使用双引号或转义引号字符
parse_dms("53°19\'51.8\"N")
对于多个坐标,您可以使用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)