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无航线信息!!!')
12-24
1217
