地理坐标输出中的经度符号不正确

问题描述 投票:0回答:1

我正在编写一个 Python 脚本,该脚本使用 GeoCooperatives 类处理地理坐标。该类应该将纬度和经度从十进制转换为度、分和秒 (DMS) 格式,反之亦然。但是,我遇到了输出中经度符号不正确的问题。当我创建一个坐标为 lat=40.7775, long=-122.41639 的对象时,经度的预期输出应该是 40°46′39″N 122°24′59″W,但我得到的是 40°46′39″北纬 -122°24′59″W.

def convert_lat_long_to_dms(self, lat: float, long: float):
    lat_deg = int(lat)
    lat_min = int((lat - lat_deg) * 60)
    lat_sec = round((lat - lat_deg - lat_min / 60) * 3600)
    lat_dir = 'S' if lat < 0 else 'N'
    long_deg = int(long)
    long_min = int((long - long_deg) * 60)
    long_sec = round((long - long_deg - long_min / 60) * 3600)
    long_dir = 'W' if long < 0 else 'E'
    return f"{lat_deg}°{lat_min:02}′{lat_sec:02}″{lat_dir} {long_deg}°{abs(long_min):02}′. {abs(long_sec):02}″{long_dir}"

python tuples
1个回答
0
投票

这是因为您将经度的负号直接应用于度数,而不是通过方向(W/E)来表示。最后的返回语句中添加了西向的负号,但绝对值函数仅适用于分钟和秒,而不适用于度数。因此,原始经度值的负号保留并在最终输出中打印出来,从而导致差异。

要解决此问题,您还应该在返回结果之前对度数应用绝对值函数。这是更新的功能:

def convert_lat_long_to_dms(self, lat: float, long: float):
    lat_deg = int(lat)
    lat_min = int((lat - lat_deg) * 60)
    lat_sec = round((lat - lat_deg - lat_min / 60) * 3600)
    lat_dir = 'S' if lat < 0 else 'N'
    
    long_deg = int(long)
    long_min = int((long - long_deg) * 60)
    long_sec = round((long - long_deg - long_min / 60) * 3600)
    long_dir = 'W' if long < 0 else 'E'
    
    return f"{abs(lat_deg)}°{lat_min:02}′{lat_sec:02}″{lat_dir} {abs(long_deg)}°{abs(long_min):02}′{abs(long_sec):02}″{long_dir}"

现在,这应该返回正确的输出:

40°46′39"N 122°24′59"W
,输入 lat=40.7775,long=-122.41639。

© www.soinside.com 2019 - 2024. All rights reserved.