探寻世界:用Python获取照片的地理定位信息

您所在的位置:网站首页 识别图片地理位置的软件 探寻世界:用Python获取照片的地理定位信息

探寻世界:用Python获取照片的地理定位信息

2024-07-09 10:23| 来源: 网络整理| 查看: 265

目录

步骤:

源代码:

代码说明:

报错1:

解决方法1:

报错2:

解决方法2:

效果如下所示:

验证效果如下:

一、步骤:

要从 JPEG 图像中获取经纬度信息,可以使用 Python 的 PIL(Python Imaging Library)库。以下是一个示例代码,用于从 JPEG 图像中获取经纬度信息并打印出来:

二、源代码: from PIL import Image from PIL.ExifTags import TAGS, GPSTAGS def get_exif_data(image_path): """ 获取 JPEG 图像的 EXIF 数据 """ exif_data = {} with Image.open(image_path) as img: if hasattr(img, '_getexif'): # 获取所有 EXIF 标签 for tag, value in img._getexif().items(): if tag in TAGS: exif_data[TAGS[tag]] = value # 获取 GPSInfo 标签 if 'GPSInfo' in exif_data: # 解析 GPSInfo 标签中的子标签 gps_data = {} for gps_tag in exif_data['GPSInfo'].keys(): tag_name = GPSTAGS.get(gps_tag, gps_tag) gps_data[tag_name] = exif_data['GPSInfo'][gps_tag] exif_data['GPSInfo'] = gps_data return exif_data def get_gps_info(exif_data): """ 从 EXIF 数据中提取经纬度信息 """ gps_info = {} if 'GPSInfo' in exif_data: # 获取经度 lat = exif_data['GPSInfo']['GPSLatitude'] lat_ref = exif_data['GPSInfo']['GPSLatitudeRef'] # lat_degrees = lat[0][0] / float(lat[0][1]) lat_degrees = lat[0].numerator / float(lat[0].denominator) # lat_minutes = lat[1][0] / float(lat[1][1]) lat_minutes = lat[1].numerator / float(lat[1].denominator) # lat_seconds = lat[2][0] / float(lat[2][1]) lat_seconds = lat[2].numerator / float(lat[2].denominator) lat_direction = lat_ref gps_info['latitude'] = (lat_degrees + (lat_minutes / 60.0) + (lat_seconds / 3600.0)) * (-1 if lat_direction == 'S' else 1) # 获取纬度 lon = exif_data['GPSInfo']['GPSLongitude'] lon_ref = exif_data['GPSInfo']['GPSLongitudeRef'] # lon_degrees = lon[0][0] / float(lon[0][1]) lon_degrees = lon[0].numerator / float(lon[0].denominator) # lon_minutes = lon[1][0] / float(lon[1][1]) lon_minutes = lon[1].numerator / float(lon[1].denominator) # lon_seconds = lon[2][0] / float(lon[2][1]) lon_seconds = lon[2].numerator / float(lon[2].denominator) lon_direction = lon_ref gps_info['longitude'] = (lon_degrees + (lon_minutes / 60.0) + (lon_seconds / 3600.0)) * (-1 if lon_direction == 'W' else 1) return gps_info # 测试代码 if __name__ == '__main__': image_path = r'D:\spiderdocs\FtpServer\IMG_20230302_134126.jpg' # 修改为你自己的 JPEG 图像路径 exif_data = get_exif_data(image_path) gps_info = get_gps_info(exif_data) print('经度:', gps_info['longitude']) print('纬度:', gps_info['latitude']) 三、代码说明:

在上述代码中,我们使用了 if hasattr(img, '_getexif'): 来检查图片是否包含 EXIF 数据。如果包含,就将获取到的 EXIF 数据保存在 exif_data 变量中。然后再使用 if exif_data is None: 来检查 exif_data 是否为 None。如果是,就说明图片没有 EXIF 数据,打印一条消息并返回一个空字典。否则,将 EXIF 数据转换为字典格式并返回。 

四、报错1: Traceback (most recent call last): File "d:\spiderdocs\jpegexifgps.py", line 53, in exif_data = get_exif_data(image_path) File "d:\spiderdocs\jpegexifgps.py", line 12, in get_exif_data for tag, value in img._getexif().items(): AttributeError: 'NoneType' object has no attribute 'items' 五、解决方法1: 出现这种情况的原因可能是文件中没有 EXIF 数据或者图片格式不支持 EXIF 数据。为了避免出现这种错误,您可以在调用 _getexif() 方法之前,先检查一下是否存在 _getexif() 方法和返回的 EXIF 数据是否为 None。如果是 None,则说明该图片没有 EXIF 数据,需要相应地处理。

打开手机的相机应用,进入相机设置。

找到 “地理标记” 或者 “位置信息” 这个选项,打开它。

确保允许相机应用访问位置信息。在有些手机上,您需要在设置中打开相机应用的位置权限。

如果您希望在每次拍照时都保存经纬度信息,可以选择“始终使用”或“启用”选项。如果您只想在需要时保存位置信息,可以选择“询问每次”选项。

拍摄照片时,手机会自动获取当前位置的经纬度信息,并将其保存在照片的 EXIF 数据中。您可以使用一些工具或软件来读取照片的 EXIF 数据,并提取经纬度信息。

请注意,启用位置信息会对手机的电池寿命产生一定影响。如果您不需要在拍照时保存经纬度信息,建议关闭位置信息功能,以延长手机的电池寿命。

六、报错2: Traceback (most recent call last): File "d:\spiderdocs\jpegexifgps.py", line 57, in gps_info = get_gps_info(exif_data) File "d:\spiderdocs\jpegexifgps.py", line 34, in get_gps_info lat_degrees = lat[0][0] / float(lat[0][1]) TypeError: 'IFDRational' object is not subscriptable 七、解决方法2:

这个错误是因为在读取经纬度信息时,使用了 IFDRational 类型的对象来进行下标操作,而 IFDRational 类型并不支持下标操作。

建议检查代码中读取经纬度信息的部分,并确保使用正确的数据类型进行操作。您可以尝试使用 numerator 和 denominator 属性来获取 IFDRational 类型对象的值,例如:

类似地,您也可以使用 longitude[0].numerator 和 longitude[0].denominator 来获取经度的度数。

lat_degrees = lat[0].numerator / float(lat[0].denominator) 八、效果如下所示:

九、验证效果如下:

1)打开:拾取坐标系统

2)输入框中输入:坐标(如:120.39987897666663,30.128810976666666)

注意:勾选“坐标反查”。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3