通过图片获取位置

这个原图拍摄时需要有打开GPS定位,这样它的位置信息就会保存到图片中。

这个方法的实现需要用到Python 的Exifread和GeoPy两个包。
先普及一下Exif信息,它最初由日本电子工业发展协会在1996年制定,它是可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
而我们用到的第二个GeoPy包,它最强大的功能就是将获取到的位置信息定位到地址。
1、先读取图片

img_file = open(photo, 'rb')
image_map = exifread.process_file(img_file)

2、获取图片信息中的经纬度信息

# 图片的经度
img_longitude_ref = image_map["GPS GPSLongitudeRef"].printable
img_longitude = image_map["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_longitude = float(img_longitude[0]) + float(img_longitude[1]) / 60 + float(img_longitude[2]) / float(img_longitude[3]) / 3600
if img_longitude_ref != "E":
    img_longitude = img_longitude * (-1)

# 图片的纬度
img_latitude_ref = image_map["GPS GPSLatitudeRef"].printable
img_latitude = image_map["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_latitude = float(img_latitude[0]) + float(img_latitude[1]) / 60 + float(img_latitude[2]) / float(img_latitude[3]) / 3600
if img_latitude_ref != "N":
      img_latitude = img_latitude * (-1)

3、获取图片的拍摄时间并关闭(如果你还想获取其他信息,你可以在关闭前,自己获取)

img_create_date = image_map["EXIF DateTimeOriginal"].printable

img_file.close()

4、把获取到的经纬度信息,通过GeoPy包输出显示

reverse_value = str(lat) + ', ' + str(lon)
geolocator = Nominatim()
location = geolocator.reverse(reverse_value)

print('照片的经纬度信息:')
print((location.latitude, location.longitude))

print('照片的地址信息:')
print(location.address)

print('照片的全部信息:')
print(location.raw)

完整代码如下

import exifread
import json
import urllib.request
import sys
from geopy.geocoders import Nominatim


# 获取照片的详细信息
def get_img_infor_tup(photo):
    img_file = open(photo, 'rb')
    image_map = exifread.process_file(img_file)

    try:
        # 图片的经度
        img_longitude_ref = image_map["GPS GPSLongitudeRef"].printable
        img_longitude = image_map["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
        img_longitude = float(img_longitude[0]) + float(img_longitude[1]) / 60 + float(img_longitude[2]) / float(img_longitude[3]) / 3600
        if img_longitude_ref != "E":
            img_longitude = img_longitude * (-1)

        # 图片的纬度
        img_latitude_ref = image_map["GPS GPSLatitudeRef"].printable
        img_latitude = image_map["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
        img_latitude = float(img_latitude[0]) + float(img_latitude[1]) / 60 + float(img_latitude[2]) / float(img_latitude[3]) / 3600
        if img_latitude_ref != "N":
            img_latitude = img_latitude * (-1)

        # 照片拍摄时间
        img_create_date = image_map["EXIF DateTimeOriginal"].printable

        img_file.close()

        # 返回经纬度元组
        return img_longitude, img_latitude, img_create_date

    except Exception as e:
        print('ERROR:图片中不包含Gps信息')


# 根据经纬度获取详细的信息
def get_detail_infor(lat, lon):
    reverse_value = str(lat) + ', ' + str(lon)
    geolocator = Nominatim()
    location = geolocator.reverse(reverse_value)

    print('照片的经纬度信息:')
    print((location.latitude, location.longitude))

    print('照片的地址信息:')
    print(location.address)

    print('照片的全部信息:')
    print(location.raw)


if __name__ == '__main__':

    infor_tup = get_img_infor_tup("你要检测的照片路径")
    get_detail_infor(infor_tup[1], infor_tup[0])

好了以上就是如何通过图片获取位置的方法了。

你可能感兴趣的:(通过图片获取位置)