Python 将gpx文件转换为shp

import os.path
import geopandas as gpd
import pandas as pd
import shapely
from pyproj import CRS


def read_gpx(file_path,output_path):
    file_name=os.path.basename(file_path)
    file_name, file_extension = os.path.splitext(file_name)
    #设置WGS84坐标系
    crs = CRS.from_epsg(4326)
    with open(file_path, 'r', errors='ignore') as file:
        gpx_data=parser.GPXParser(file)
        gpx=gpx_data.parse()
        point_list = []
        tracks_list = []
        routes_list = []
        #航点
        if gpx.waypoints:
            print('航点个数:',len(gpx.waypoints))
            for waypoint in gpx.waypoints:
               point={
                   'name':waypoint.name,
                   'geometry' :Point(waypoint.longitude, waypoint.latitude)
               }
               point_list.append(point)
            point_pd=pd.DataFrame(point_list)
            point_gdf = gpd.GeoDataFrame(point_pd,geometry=point_pd.geometry)
            point_path = os.path.join(output_path, f'waypoints_{file_name}.shp')
            point_gdf.set_crs(crs,inplace=True)
            point_gdf.to_file(point_path,driver='ESRI Shapefile')
            print(f"航点保存至: {point_path}")
        else:
            print(r'该GPX无航点信息!!!')

        #航迹
        if gpx.tracks :
            tracks_line=[]
            print('航迹个数:', len(gpx.tracks))
            for track in gpx.tracks:
                tracks_line={
                    'name':track.name,
                    'geometry':LineString([(point.latitude, point.longitude) for point in track.segments[0].points])
                }
                tracks_list.append(tracks_line)
            tracks_pd=pd.DataFrame(tracks_list)
            tracks_gdf = gpd.GeoDataFrame(tracks_list,geometry=tracks_pd.geometry)
            tracks_path = os.path.join(output_path, f'tracks_{file_name}.shp')
            tracks_gdf.set_crs(crs, inplace=True)
            tracks_gdf.to_file(tracks_path, driver='ESRI Shapefile')
            print(f"航迹保存至: {tracks_path}")
        else:
           print(r'该GPX无航迹信息!!!')
        # 遍历所有航线
        if gpx.routes :
            print('航线个数:',len(gpx.routes))
            routes_line=[]
            for route in gpx.routes:
                routes_line = {
                    'name': route.name,
                    'geometry': LineString([(point.latitude, point.longitude)for point in route.points])
                }
                routes_list.append(routes_line)
            routes_pd=pd.DataFrame(routes_list)
            routes_gdf = gpd.GeoDataFrame(routes_list,geometry=routes_pd.geometry)
            routes_path = os.path.join(output_path, f'routes_{file_name}.shp')
            routes_gdf.set_crs(crs, inplace=True)
            routes_gdf.to_file(routes_path, driver='ESRI Shapefile')
            print(f"航线保存至: {routes_path}")
        else:
            print(r'该GPX无航线信息!!!')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值