用python解释exif数据的GPS信息

我正在写一个小程序来获取iphone jpg照片的GPS信息。

我使用的库是python中的PIL。现在我可以得到GPSInfo了,它类似于:

{1: N, 
 2: ((1, 1), (20, 1), (5365, 100)), 
 3: E, 
 4: ((103, 1), (41, 1), (1052, 100)), 
 5: 0, 
 6: (43, 1), 
 7: ((15, 1), (32, 1), (7, 1)), 
 16: T, 
 17: (77473, 452), 
 29: 2013:10:25}

我怎么解释?我注意到标签是不连续的,所以是否有任何作弊表,我可以参考,以便更好地了解所有的数字标签和他们的意思?谢谢您!

更新

对不起,我想出来了。在PIL库中,有一个GPSTAGS.get()函数可以帮助我解码gps信息中的密钥。谢谢你们!

gpsinfo = {}
for key in exif[GPSInfo].keys():
    decode = ExifTags.GPSTAGS.get(key,key)
    gpsinfo[decode] = exif[GPSInfo][key]
print gpsinfo

结果是

{GPSTimeStamp: ((15, 1), (32, 1), (7, 1)), 
 GPSImgDirectionRef: T, 
 GPSImgDirection: (77473, 452), 
 GPSLongitude: ((103, 1), (41, 1), (1052, 100)), 
 GPSLatitudeRef: N, 29: 2013:10:25, 
 GPSAltitude: (43, 1), 
 GPSLatitude: ((1, 1), (20, 1), (5365, 100)), 
 GPSLongitudeRef: E, 
 GPSAltitudeRef: 0}

3条回答

网友

1楼 ·

OP,已经发布了一个使用PIL的解决方案。如果您只想从Python获取GPS信息,可以使用

使用pip安装包

$ pip install exifread

获取GPS数据

In [10]: import exifread

In [11]: tags = exifread.process_file(open(./tests/demo-project/content/test.jpg, rb))                                              

In [12]: geo = {i:tags[i] for i in tags.keys() if i.startswith(GPS)}

In [13]: geo
Out[13]: 
{GPS GPSAltitude: (0x0006) Ratio=186188/239 @ 898,
 GPS GPSAltitudeRef: (0x0005) Byte=0 @ 722,
 GPS GPSDate: (0x001D) ASCII=2015:12:06 @ 954,
 GPS GPSDestBearing: (0x0018) Ratio=43771/526 @ 946,
 GPS GPSDestBearingRef: (0x0017) ASCII=T @ 806,
 GPS GPSImgDirection: (0x0011) Ratio=43771/526 @ 938,
 GPS GPSImgDirectionRef: (0x0010) ASCII=T @ 782,
 GPS GPSLatitude: (0x0002) Ratio=[46, 3803/100, 0] @ 850,
 GPS GPSLatitudeRef: (0x0001) ASCII=N @ 674,
 GPS GPSLongitude: (0x0004) Ratio=[13, 2429/100, 0] @ 874,
 GPS GPSLongitudeRef: (0x0003) ASCII=E @ 698,
 GPS GPSSpeed: (0x000D) Ratio=139/50 @ 930,
 GPS GPSSpeedRef: (0x000C) ASCII=K @ 758,
 GPS GPSTimeStamp: (0x0007) Ratio=[10, 37, 33] @ 906,
 GPS Tag 0x001F: (0x001F) Ratio=30 @ 966}

网友

2楼 ·

使用exifread模块。

这里有一个非常有用的

import exifread as ef


# barrowed from 
# https://gist.github.com/snakeye/fdc372dbf11370fe29eb 
def _convert_to_degress(value):
    """
    Helper function to convert the GPS coordinates stored in the EXIF to degress in float format
    :param value:
    :type value: exifread.utils.Ratio
    :rtype: float
    """
    d = float(value.values[0].num) / float(value.values[0].den)
    m = float(value.values[1].num) / float(value.values[1].den)
    s = float(value.values[2].num) / float(value.values[2].den)

    return d + (m / 60.0) + (s / 3600.0)


def getGPS(filepath):
    
    returns gps data if present other wise returns empty dictionary
    
    with open(filepath, r) as f:
        tags = ef.process_file(f)
        latitude = tags.get(GPS GPSLatitude)
        latitude_ref = tags.get(GPS GPSLatitudeRef)
        longitude = tags.get(GPS GPSLongitude)
        longitude_ref = tags.get(GPS GPSLongitudeRef)
        if latitude:
            lat_value = _convert_to_degress(latitude)
            if latitude_ref.values != N:
                lat_value = -lat_value
        else:
            return {}
        if longitude:
            lon_value = _convert_to_degress(longitude)
            if longitude_ref.values != E:
                lon_value = -lon_value
        else:
            return {}
        return {latitude: lat_value, longitude: lon_value}
    return {}


file_path = file path of the file    
gps = getGPS(file_path)
print gps

网友

3楼 ·

迟回答,但截至2019年,您可以使用,即:

from GPSPhoto import gpsphoto
# Get the data from image file and return a dictionary
data = gpsphoto.getGPSData(IMG_20181224_201933.jpg)
print(data[Latitude], data[Longitude])

输出:


安装:

pip install GPSPhoto
经验分享 程序员 微信小程序 职场和发展