如何将纬度归一化到-90 到 90 的范围内?
how to normalise latitude into the range of -90 to 90?
使用 piexif 我得到了纬度和经度的 DMS,我试图将其转换为十进制,但对于某些图像,我得到的纬度值为 184.62583333333333,超出了 [-90,90] 范围。
查看下面的代码,
exif_dict = piexif.load('images/DJI_0026.JPG')
long = 0
latt = 0
value = exif_dict['GPS']
if value:
lat = value[2]
lon = value[4]
for i in range(3):
if i == 1:
latt += lat[i][0]/60.0
elif i == 2:
latt += lat[i][0]/3600.0
else:
latt += lat[i][0]
for i in range(3):
if i == 1:
long += lon[i][0]/60.0
elif i == 2:
long += lon[i][0]/3600.0
else:
long += lon[i][0]
print(latt, long)
值 = {0: (2, 3, 0, 0), 1: b'N', 2: ((19, 1), (8, 1), (595773, 10000)), 3 : b'E', 4: ((73, 1), (0, 1), (131775, 10000)), 5: 0, 6: (70989, 1000)}
我关心的是纬度和经度,它存储在键 2 和 4 的值中。
纬度=19+8/60.0+595773/3600.0
经度 = 73+0/60.0+131775/3600.0
这就是输出结果。
输出:184.62583333333333 109.60416666666666
请告诉我如何在 [-90,90] 范围内归一化纬度。
从您给出的示例值来看,很明显您应该将 val[0] 除以 val[1]。
例如,595773 / 10000 = 59,这很合理。
顺便说一下,您不需要 for
循环。它们使您的代码比必要的更长。
value[1] == b'N'
可能是有原因的。您当前的代码不会对其进行评估。这意味着您的代码仅适用于地球表面的 1/4。
请参阅 https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html 了解详细信息。您的代码也应该能够解释南方和西方。
piexif
返回的 GPS 坐标数据格式如下:
exif_data = {0: (2, 3, 0, 0),
# Latitude: b'N' or b'S'
1: b'N',
# deg, min, sec as (numerator,denominator) of rationals
2: ((19, 1), (8, 1), (595773, 10000)),
# Longitude: b'E' or b'W'
3: b'E',
4: ((73, 1), (0, 1), (131775, 10000)),
5: 0, 6: (70989, 1000)}
纬度和经度以 N 或 S(分别为 E 或 W)的正有理值给出。
我们需要将正值从 DMS 转换为十进制,然后根据方向给它们正确的符号:
def convert_DMS_tuple(tup):
d, m, s = [t[0]/t[1] for t in tup]
degrees = d + m/60 + s/3600
return degrees
def EXIF_to_lat_long(exif_data):
# Latitude is counted positive towards N
lat_sign = 1 if exif_data[1] == b'N' else -1
lat = lat_sign*convert_DMS_tuple(exif_data[2])
# Longitude is counted positive towards E
long_sign = 1 if exif_data[3] == b'E' else -1
long = long_sign*convert_DMS_tuple(exif_data[4])
return lat, long
EXIF_to_lat_long(exif_data)
# (19.149882583333333, 73.00366041666666)
您可以这样使用:
exif_dict = piexif.load('images/DJI_0026.JPG')
value = exif_dict['GPS']
if value:
print(EXIF_to_lat_long(value))
使用 piexif 我得到了纬度和经度的 DMS,我试图将其转换为十进制,但对于某些图像,我得到的纬度值为 184.62583333333333,超出了 [-90,90] 范围。
查看下面的代码,
exif_dict = piexif.load('images/DJI_0026.JPG')
long = 0
latt = 0
value = exif_dict['GPS']
if value:
lat = value[2]
lon = value[4]
for i in range(3):
if i == 1:
latt += lat[i][0]/60.0
elif i == 2:
latt += lat[i][0]/3600.0
else:
latt += lat[i][0]
for i in range(3):
if i == 1:
long += lon[i][0]/60.0
elif i == 2:
long += lon[i][0]/3600.0
else:
long += lon[i][0]
print(latt, long)
值 = {0: (2, 3, 0, 0), 1: b'N', 2: ((19, 1), (8, 1), (595773, 10000)), 3 : b'E', 4: ((73, 1), (0, 1), (131775, 10000)), 5: 0, 6: (70989, 1000)}
我关心的是纬度和经度,它存储在键 2 和 4 的值中。
纬度=19+8/60.0+595773/3600.0
经度 = 73+0/60.0+131775/3600.0
这就是输出结果。
输出:184.62583333333333 109.60416666666666
请告诉我如何在 [-90,90] 范围内归一化纬度。
从您给出的示例值来看,很明显您应该将 val[0] 除以 val[1]。
例如,595773 / 10000 = 59,这很合理。
顺便说一下,您不需要 for
循环。它们使您的代码比必要的更长。
value[1] == b'N'
可能是有原因的。您当前的代码不会对其进行评估。这意味着您的代码仅适用于地球表面的 1/4。
请参阅 https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html 了解详细信息。您的代码也应该能够解释南方和西方。
piexif
返回的 GPS 坐标数据格式如下:
exif_data = {0: (2, 3, 0, 0),
# Latitude: b'N' or b'S'
1: b'N',
# deg, min, sec as (numerator,denominator) of rationals
2: ((19, 1), (8, 1), (595773, 10000)),
# Longitude: b'E' or b'W'
3: b'E',
4: ((73, 1), (0, 1), (131775, 10000)),
5: 0, 6: (70989, 1000)}
纬度和经度以 N 或 S(分别为 E 或 W)的正有理值给出。
我们需要将正值从 DMS 转换为十进制,然后根据方向给它们正确的符号:
def convert_DMS_tuple(tup):
d, m, s = [t[0]/t[1] for t in tup]
degrees = d + m/60 + s/3600
return degrees
def EXIF_to_lat_long(exif_data):
# Latitude is counted positive towards N
lat_sign = 1 if exif_data[1] == b'N' else -1
lat = lat_sign*convert_DMS_tuple(exif_data[2])
# Longitude is counted positive towards E
long_sign = 1 if exif_data[3] == b'E' else -1
long = long_sign*convert_DMS_tuple(exif_data[4])
return lat, long
EXIF_to_lat_long(exif_data)
# (19.149882583333333, 73.00366041666666)
您可以这样使用:
exif_dict = piexif.load('images/DJI_0026.JPG')
value = exif_dict['GPS']
if value:
print(EXIF_to_lat_long(value))