Как нормализовать широту в диапазоне от -90 до 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].
2 ответа
Данные, возвращаемые 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))
Из приведенных вами примеров видно, что вы должны разделить val[0] на val[1].
Например, 595773 / 10000 = 59, что имеет смысл на секунду.
Кстати, вам не нужно for
петли. Они делают ваш код длиннее, чем необходимо.
Там, вероятно, причина, почему value[1] == b'N'
, Ваш текущий код не оценивает его, хотя. Это означает, что ваш код работает только на 1/4 поверхности Земли.
См. https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html для хорошего обзора. Ваш код должен иметь возможность интерпретировать Юг и Запад.