UAV/tools/read_gps.py

64 lines
2.0 KiB
Python
Raw Normal View History

2025-01-15 15:19:40 +08:00
import os
import piexif
from PIL import Image
def dms_to_decimal(dms):
"""将DMS格式转换为十进制度"""
if not dms:
return None
degrees = dms[0][0] / dms[0][1]
minutes = dms[1][0] / dms[1][1] / 60
seconds = dms[2][0] / dms[2][1] / 3600
return degrees + minutes + seconds
def get_gps_info(image_path):
"""获取图片的GPS信息"""
try:
image = Image.open(image_path)
exif_data = piexif.load(image.info['exif'])
gps_info = exif_data.get("GPS", {})
if not gps_info:
return None, None, None
# 获取纬度
lat = dms_to_decimal(gps_info.get(2))
if lat and gps_info.get(1) and gps_info[1] == b'S':
lat = -lat
# 获取经度
lon = dms_to_decimal(gps_info.get(4))
if lon and gps_info.get(3) and gps_info[3] == b'W':
lon = -lon
# 获取高度
alt = None
if 6 in gps_info:
alt = gps_info[6][0] / gps_info[6][1]
return lat, lon, alt
except Exception as e:
print(f"读取文件 {image_path} 时出错: {str(e)}")
return None, None, None
def main():
# 设置输入输出路径
image_dir = r"E:\datasets\UAV\134\project\images"
output_path = r"E:\datasets\UAV\134\project\gps.txt"
with open(output_path, 'w', encoding='utf-8') as f:
for filename in os.listdir(image_dir):
if filename.lower().endswith(('.jpg', '.jpeg')):
image_path = os.path.join(image_dir, filename)
lat, lon, alt = get_gps_info(image_path)
if lat is not None and lon is not None:
# 如果没有高度信息使用0
alt = alt if alt is not None else 0
filename = filename.replace(".jpg", ".tif")
f.write(f"{filename} {lat} {lon} {alt}\n")
if __name__ == '__main__':
main()