Python教程

python读取文件夹下图像的GPS并且可视化

本文主要是介绍python读取文件夹下图像的GPS并且可视化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 

 

 

 

 

 

 

 

 

# -*- coding: utf-8 -*-

import os
import cv2


#------获取文件下下所有文件路径---
'''
输入:文件夹的路径
输出:文件列表 - 所有格式

'''
def file_name(file_dir):
    for root, dirs, files in os.walk(file_dir):
        #print(root) #当前目录路径
        #print(dirs) #当前路径下所有子目录
        #print(files) #当前路径下所有非目录子文件
        return files

#imgpath="C:/Users/dongdong/Desktop/标定图/img/"
#files=file_name(imgpath)
#for path_i in files:
#    print(path_i)





#------获取照片的GPS信息并转化60进制---
'''
输入:图像路径名称
输出:经纬度

'''


import json
import requests
import exifread


def GetGps(ImgPath):
    with open(ImgPath, 'rb') as f:
        exif_dict = exifread.process_file(f)

        # 经度
        lon_ref = exif_dict["GPS GPSLongitudeRef"].printable
        lon = exif_dict["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
        lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / float(lon[3]) / 3600
        if lon_ref != "E":
            lon = lon * (-1)

        # 纬度
        lat_ref = exif_dict["GPS GPSLatitudeRef"].printable
        lat = exif_dict["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
        lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600

        if lat_ref != "N":
            lat = lat * (-1)
        #print('照片的经纬度:', (lat, lon))

        '''
        # 调用百度地图api转换经纬度为详细地址
        secret_key = 'MAsVGINLNyTGiM4UulcaeluCekGnAFxj' # 百度地图api 需要注册创建应用
        baidu_map_api = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{}'.format(secret_key, lat, lon)
        content = requests.get(baidu_map_api).text
        gps_address = json.loads(content)
        # 结构化的地址
        formatted_address = gps_address["result"]["formatted_address"]
        # 国家(若需访问境外POI,需申请逆地理编码境外POI服务权限)
        country = gps_address["result"]["addressComponent"]["country"]
        # 省
        province = gps_address["result"]["addressComponent"]["province"]
        # 市
        city = gps_address["result"]["addressComponent"]["city"]
        # 区
        district = gps_address["result"]["addressComponent"]["district"]
        # 语义化地址描述
        sematic_description = gps_address["result"]["sematic_description"]
        
        print(ImgPath,'照片的经纬度:', (lat, lon), formatted_address,  gps_address["result"]["business"] ,)
        #print(formatted_address) #陕西省西安市长安区Y243(东大路)
        #print(gps_address["result"]["business"])#东大

        '''
        print(ImgPath,'照片的经纬度:', (lat, lon))
        return lat,lon




#------GPS可视化工具---
'''
输入:
locations      经纬度
output_path    GPS可视化结果HTML 文件保存路径
file_name      GPS可视化结果HTML 文件保存名字

输出:文件列表 - 所有格式

'''

 ##pip3 install folium
import folium  #可视化工具
import os
 
def draw_gps(locations, output_path, file_name):
    """
    绘制gps轨迹图
    :param locations: list, 需要绘制轨迹的经纬度信息,格式为[[lat1, lon1], [lat2, lon2], ...]
    :param output_path: str, 轨迹图保存路径
    :param file_name: str, 轨迹图保存文件名
    :return: None
    """
    m = folium.Map(locations[0], zoom_start=15, attr='default')  #中心区域的确定
 
    folium.PolyLine(    # polyline方法为将坐标用线段形式连接起来
        locations,    # 将坐标点连接起来
        weight=3,  # 线的大小为3
        color='orange',  # 线的颜色为橙色
        opacity=0.8    # 线的透明度
    ).add_to(m)    # 将这条线添加到刚才的区域m内
     
    # 起始点,结束点
    folium.Marker(locations[0], popup='<b>Starting Point</b>').add_to(m)
    folium.Marker(locations[-1], popup='<b>End Point</b>').add_to(m)
 
   # len(locations)
      
    '''
    for i in locations:
        #folium.Marker(
        #i, popup="<i>Click show a test</i>", tooltip="Click me!",icon=folium.Icon(color="red", icon="info-sign")
        ).add_to(m)
   '''
     
    m.save(os.path.join(output_path, file_name))  # 将结果以HTML形式保存到指定路径
     
 

def USE_GPS_Single():


    # 1 获取文件夹所有照片
    # 2 从图像解析GPS
    # 3 调用GPS可视化结果


    DirPatnList=["100_0001","100_0002","100_0003","100_0004","100_0005","100_0006","100_0007","100_0008","100_0009"]#文件夹名字
    DirPatnList=["100_0009"]

    for DirPatn in DirPatnList:
        imgpath="F:/dongdong/0my_project/slam/航拍数据/NWPU_9/"+DirPatn+"/"#文件夹完整路径
        files=file_name(imgpath)#获取文件夹下所有文件夹名字

        locations=[]


        
        for path_i in files:
            if path_i[-4:] == '.JPG':
                path_i="./NWPU_9/"+DirPatn+"/"+path_i #文件夹下图像路径
                lat,lon=GetGps(path_i)
                locations.append([float(lat),float(lon)])
            else:
                print("非指定文件类型:",path_i)

            
            

        map_html=DirPatn+".html"

        print("地图生成中请等待")
        draw_gps(locations,"",map_html)
        print(map_html,"地图网页生生结束,请用网页打开查看")



        
def USE_GPS_More():


    # 1 获取文件夹所有照片名字
    # 2 从图像解析GPS
    # 3 调用GPS可视化结果

    #文件夹名字
    DirPatnList=["100_0001","100_0002","100_0003","100_0004","100_0005","100_0006","100_0007","100_0008"]#文件夹名字
    #DirPatnList=["100_0009"]

    locations=[]

    for DirPatn in DirPatnList:
        imgpath="F:/dongdong/0my_project/slam/航拍数据/NWPU_9/"+DirPatn+"/"#文件夹完整路径
        files=file_name(imgpath)#获取文件夹下所有文件夹名字

        


        
        for path_i in files:
            if path_i[-4:] == '.JPG':
                path_i="./NWPU_9/"+DirPatn+"/"+path_i #文件夹下图像路径
                lat,lon=GetGps(path_i)
                locations.append([float(lat),float(lon)])
            else:
                print("非指定文件类型:",path_i)

            
            

    map_html="all_8"+".html"
    print("地图生成中请等待")
    draw_gps(locations,"",map_html)
    print(map_html,"地图网页生生结束,请用网页打开查看")


USE_GPS_More()

  

这篇关于python读取文件夹下图像的GPS并且可视化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!