как нормализовать широту в диапазоне от -90 до 90? - PullRequest
0 голосов
/ 23 декабря 2018

Используя 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)

value = {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

это то, что на выходе.

OutPut: 184.62583333333333 109.60416666666666

Пожалуйста, дайте мне знать, какнормализуйте широту в диапазоне [-90,90].

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Данные, возвращаемые 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))
0 голосов
/ 23 декабря 2018

Из приведенных вами примеров видно, что вы должны разделить val [0] на val [1].

Например, 595773/10000 = 59, что имеет смысл на секунду.

Кстати, вам не нужны петли for.Они делают ваш код длиннее необходимого.

Возможно, причина value[1] == b'N'.Ваш текущий код не оценивает его, хотя.Это означает, что ваш код работает только для 1/4 поверхности Земли.

См. https://sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html для хорошего обзора.Ваш код должен также иметь возможность интерпретировать Юг и Запад.

...