Данные Django Exif: объект ‘IFDRational’ не подлежит подписке

#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 предоставляет только число, которое можно использовать напрямую, поэтому требуется приведенное выше изменение.