我使用以下格式从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" )
但它不适用于我的数据图层。任何人都可以帮我解决这个问题吗?
答案 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/
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