#python #django
#python #django
Вопрос:
У меня возникла проблема с кодом: объект ‘IFDRational’ не подлежит подписке
Вот трассировка:
lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])
degrees = dms[0][0] / dms[0][1]
проблема заключается в:
Dms с переменным значением
(45.0, 46.0, 34.29)
ссылка
‘N’
{'GPSAltitude': 22.90324416619237,
'GPSAltitudeRef': b'x00',
'GPSDateStamp': '2020:10:17',
'GPSDestBearing': 18.1919587128,
'GPSDestBearingRef': 'M',
'GPSHPositioningError': 65.0,
'GPSImgDirection': 108.199192887128,
'GPSImgDirectionRef': 'M',
'GPSLatitude': (12.0, 26.0, 14.09),
'GPSLatitudeRef': 'N',
'GPSLongitude': (1.0, 47.0, 39.38),
'GPSLongitudeRef': 'E',
'GPSSpeed': 0.0,
'GPSSpeedRef': 'K',
'GPSTimeStamp': (12.0, 58.0, 42.0)}
Это то, что я получаю, например, из изображения. Я думаю, что код ассимилирует GPSLatitudeRef в градусы = dms [0] [0] / dms [0] [1] . Дело в том, что GPSLatitudeRef — это буква, а не число.
def get_geotagging(exifgps):
geotagging = {}
for (idx, tag) in TAGS.items():
if tag == 'GPSInfo':
if idx not in exifgps:
raise ValueError("No EXIF geotagging found")
for (key, val) in GPSTAGS.items():
if key in exifgps[idx]:
geotagging[val] = exifgps[idx][key]
return geotagging
def get_decimal_from_dms(dms, ref):
degrees = dms[0][0] / dms[0][1]
minutes = dms[1][0] / dms[1][1] / 60.0
seconds = dms[2][0] / dms[2][1] / 3600.0
if ref in ['S', 'W']:
degrees = -degrees
minutes = -minutes
seconds = -seconds
return round(degrees minutes seconds, 5)
def get_lat_coordinates(geotags):
lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])
return lat
def get_lon_coordinates(geotags):
lon = get_decimal_from_dms(geotags['GPSLongitude'], geotags['GPSLongitudeRef'])
return lon
try:
exifgps = img.getexif()
geotags = get_geotagging(exifgps)
self.gpsinfo = geotags
except Exception as e:
pass
#try:
exifgps = img.getexif()
geotags = get_geotagging(exifgps)
self.latitude = get_lat_coordinates(geotags)
#except Exception as e:
#pass
#try:
exifgps = img.getexif()
geotags = get_geotagging(exifgps)
self.longitude = get_lon_coordinates(geotags)
#except Exception as e:
#pass
Ответ №1:
Я не могу понять, зачем degrees = dms[0][0] / dms[0][1]
это необходимо, когда вы можете просто извлечь степени из кортежа, используя degrees = dms[0]
Заменить
def get_decimal_from_dms(dms, ref):
degrees = dms[0][0] / dms[0][1]
minutes = dms[1][0] / dms[1][1] / 60.0
seconds = dms[2][0] / dms[2][1] / 3600.0
С помощью
def get_decimal_from_dms(dms, ref):
degrees = dms[0]
minutes = dms[1] / 60.0
seconds = dms[2] / 3600.0
Комментарии:
1. Пожалуйста, добавьте некоторые пояснения, чтобы улучшить свой ответ.
2. Это хорошо работает, спасибо. Не могли бы вы объяснить, почему?
3. Похоже, что в версии Pillow версии 7 (и, скорее всего, ниже) значения степени, минуты и секунды были кортежами, которые должны были интерпретироваться как дроби (первое значение является числителем, а второе — знаменателем). Версия Pillow версии 8 предоставляет только число, которое можно использовать напрямую, поэтому требуется приведенное выше изменение.