Python преобразовать значение объекта в int - PullRequest
0 голосов
/ 07 октября 2018

Я уже некоторое время использую python, но у меня все еще есть элементарные проблемы.В настоящее время я использую библиотеку exifread в Python, чтобы получить широту и долготу.Мне нужно преобразовать значения DMS в DD.

До сих пор я написал следующее:

    #!/bin/python
import math
import exifread
path_name = './IMAG0658.jpg'
f = open(path_name, 'rb')

tags = exifread.process_file(f)

GPSLat = tags['GPS GPSLatitude']
print tags['GPS GPSLatitudeRef']
print GPSLat.values[0]
print GPSLat.values[1]
print GPSLat.values[2]
GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
print GPSDDLat

Однако происходит сбой после печати следующего сообщения:

$python tempexif.py
N
33
52
433621/10000
Traceback (most recent call last):
  File "tempexif.py", line 14, in <module>
    GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
TypeError: unsupported operand type(s) for /: 'instance' and 'int'

Как лучше выполнить математику для значений спискачем сам объект?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Ваш код не является полным, поскольку вы не предоставляете входной файл IMAG0658.jpg.Но кое-что еще можно сказать, и мы все равно можем ответить на ваш вопрос.

Из ваших заявлений о печати это выглядит как GPSLat.values[0] и GPSLat.values[1] оба значения int.Но мы видим, что GPSLat.values[2] выглядит как дробь и, следовательно, не является значением int.Из вашей трассировки ошибок мы видим, что GPSLat.values[1] или GPSLat.values[2] на самом деле является экземпляром объекта.Таким образом, по крайней мере одно из этих значений печатается как числовое значение, но на самом деле является экземпляром объекта.

Решение вашей проблемы состоит в том, чтобы взять те очевидные числовые значения, которые показаны в функциях print и, таким образом, доступнытакже с помощью функции str и преобразуйте их в числовые значения перед дальнейшими вычислениями.Поскольку GPSLat.values[2] не печатает как int, а печатает как дробь, мы можем использовать тип Fraction в модуле fractions, чтобы легко преобразовать в float.Поэтому для каждого значения мы используем str, чтобы получить числовое значение, а затем конвертируем его в фактическое числовое значение float.

Таким образом, мы можем сделать

from fractions import Fraction

GPSDDLat = ( float(str(GPSLat.values[0])) 
           + float(str(GPSLat.values[1])) / 60
           + float(Fraction(str(GPSLat.values[2]))) / 3600
           )

Но безэтот файл, я не могу выполнить фактическую проверку этого кода.

0 голосов
/ 08 октября 2018

GPSLat.values[x] - это объект (экземпляр, как сказано в Traceback).

Чтобы получить степень, вам необходимо сделать:

def val_2_deg(value):
    return float(value.num) / float(value.den)

и затем изменитьВаша формула:

GPSDDLat = val_2_deg(GPSLat.values[0]) + val_2_deg(GPSLat.values[1])/60 + val_2_deg(GPSLat.values[2])/3600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...