【代码】从十进制度数到度分秒格式与反向转换的Python实现
【代码】从十进制度数到度分秒格式与反向转换的Python实现
ytkz在地理和导航领域,我们经常使用度分秒(DMS)和十进制度数(DD)两种格式来表示经纬度。这两种格式各有优缺点,但在某些应用场景下,我们需要将一种格式转换为另一种格式。本文将介绍如何使用Python实现这两种格式之间的转换,并解释其背后的原理。
一、度分秒(DMS)与十进制度数(DD)简介
度分秒(DMS)是一种传统的角度表示方法,它将一个角度分为度、分和秒三个部分。在地理坐标中,度通常表示大单位,分和秒表示更小的单位。例如,北纬35度14分57.18秒可以表示为35º 14’ 57.18” N。
十进制度数(DD)则是一种更简洁的表示方法,它将角度表示为一个小数。例如,北纬35度14分57.18秒可以转换为十进制度数35.249216度。
二、从十进制度数转换为度分秒
import math
import re
def dd2dms(lat, lon):
latf, latn = math.modf(lat)
lonf, lonn = math.modf(lon)
latd = int(latn)
latm = int(latf * 60)
lats = (lat - latd - latm / 60) * 3600.00
lond = int(lonn)
lonm = int(lonf * 60)
lons = (lon - lond - lonm / 60) * 3600.00
compass = {
'lat': ('N','S'),
'lon': ('E','W')
}
lat_compass = compass['lat'][0 if latd >= 0 else 1]
lon_compass = compass['lon'][0 if lond >= 0 else 1]
return '{}º {}\' {:.2f}" {}, {}º {}\' {:.2f}" {}'.format(abs(latd),
abs(latm), abs(lats), lat_compass, abs(lond),
abs(lonm), abs(lons), lon_compass)
Python中的dd2dms
函数实现了从十进制度数到度分秒的转换。其转换步骤如下:
- 使用
math.modf
函数将十进制度数分解为整数部分和小数部分。整数部分即为度,小数部分用于计算分和秒。 - 将小数部分乘以60,得到分的整数部分和小数部分。整数部分即为分,小数部分用于计算秒。
- 将上一步得到的小数部分乘以3600,得到秒数。
- 根据度的正负确定方向(N或S,E或W)。
在dd2dms
函数中,我们首先使用math.modf
函数得到度和剩余的小数部分。然后,我们计算分和秒,并将它们转换为绝对值。最后,我们根据度的正负确定方向,并使用字符串格式化函数将结果组合成度分秒的格式。
三、从度分秒转换为十进制度数
import math
import re
def dms2dd(lat, lon):
lat_deg, lat_min, lat_sec, lat_dir = re.split('[^\d\.A-Z]+', lat)
lon_deg, lon_min, lon_sec, lon_dir = re.split('[^\d\.A-Z]+', lon)
lat_dd = float(lat_deg) + float(lat_min)/60 + float(lat_sec)/(60*60);
lon_dd = float(lon_deg) + float(lon_min)/60 + float(lon_sec)/(60*60);
if lat_dir == 'S':
lat_dd *= -1
if lon_dir == 'W':
lon_dd *= -1
return (lat_dd, lon_dd);
Python中的dms2dd
函数实现了从度分秒到十进制度数的转换。其转换步骤如下:
- 使用正则表达式将度分秒字符串分解为度、分、秒和方向。
- 将度、分、秒转换为小数,并计算它们的总和。
- 根据方向(N或S,E或W)确定是否需要取反。
在dms2dd
函数中,我们首先使用正则表达式将度分秒字符串分解为度、分、秒和方向。然后,我们将它们转换为小数并相加得到十进制度数。最后,我们根据方向确定是否需要取反,并返回结果。
四、总结
本文介绍了如何使用Python实现十进制度数与度分秒之间的转换,并解释了其背后的原理。这两种格式在地理和导航领域都有广泛的应用,因此掌握它们之间的转换方法对于相关领域的开发者来说是非常有用的。