
import arcpyimport os# 设置工作空间desktop = os.path.join(os.path.expanduser("~"), "Desktop")gis_folder = os.path.join(desktop, "GIS")os.makedirs(gis_folder, exist_ok=True)arcpy.env.workspace = gis_folderarcpy.env.overwriteOutput = True# 输出路径output_path = os.path.join(gis_folder, "国内航线.shp")# 机场坐标(纬度,经度)airports = {"HRB": {"name": "哈尔滨 (HRB)", "lat": 45.6234, "lon": 126.2500},"SYX": {"name": "三亚 (SYX)", "lat": 18.3037, "lon": 109.4124},"HAK": {"name": "海口 (HAK)", "lat": 19.9349, "lon": 110.4591},"NNG": {"name": "南宁 (NNG)", "lat": 22.6083, "lon": 108.1722},"KMG": {"name": "昆明 (KMG)", "lat": 24.9924, "lon": 102.7431},"ZUH": {"name": "珠海 (ZUH)", "lat": 22.0064, "lon": 113.3767},"BHY": {"name": "北海 (BHY)", "lat": 21.5392, "lon": 109.2970},"KWL": {"name": "桂林 (KWL)", "lat": 25.2181, "lon": 110.0392},"CTU": {"name": "成都 (CTU)", "lat": 30.5728, "lon": 103.9468},"SZX": {"name": "深圳 (SZX)", "lat": 22.6393, "lon": 113.8107}}# 航线列表(起点,终点,距离)routes = [ ("HRB", "SYX", 3730), ("HRB", "HAK", 3620), ("HRB", "NNG", 3400), ("HRB", "KMG", 3380), ("HRB", "ZUH", 3360), ("HRB", "BHY", 3350), ("HRB", "KWL", 3280), ("HRB", "CTU", 3260), ("HRB", "SZX", 3250)]# 删除已存在的文件if arcpy.Exists(output_path): arcpy.Delete_management(output_path) print("已删除旧文件")# 创建线要素类arcpy.CreateFeatureclass_management( out_path=gis_folder, out_name="国内航线.shp", geometry_type="POLYLINE", spatial_reference=arcpy.SpatialReference(4326) # WGS84)# 添加字段arcpy.AddField_management(output_path, "起点", "TEXT", field_length=50)arcpy.AddField_management(output_path, "终点", "TEXT", field_length=50)arcpy.AddField_management(output_path, "距离_km", "DOUBLE")arcpy.AddField_management(output_path, "排名", "SHORT")print("要素类已创建,开始绘制航线...")# 使用插入游标添加要素with arcpy.da.InsertCursor(output_path, ["SHAPE@", "起点", "终点", "距离_km", "排名"]) as cursor:for rank, (start_code, end_code, distance) in enumerate(routes, 1): start = airports[start_code] end = airports[end_code]# 创建测地线(大圆航线)array = arcpy.Array([ arcpy.Point(start["lon"], start["lat"]), arcpy.Point(end["lon"], end["lat"]) ])# 创建测地线(考虑地球曲率)polyline = arcpy.Polyline( array, arcpy.SpatialReference(4326), has_z=False, has_m=False)# 沿测地线加密点(每 200 公里一个点,使曲线更平滑)num_points = int(distance / 200) + 2densified_line = polyline.densify("GEODESIC", num_points)# 插入记录cursor.insertRow([ densified_line, start["name"], end["name"], distance, rank ]) print(f" [{rank}] 已绘制:{start['name']} → {end['name']} ({distance:,} km)")# 统计结果result_count = int(arcpy.GetCount_management(output_path)[0])print(f"\n[OK] 文件已生成:{output_path}")print(f"[OK] 航线数量:{result_count} 条")print(f"[OK] 坐标系统:EPSG:4326 (WGS84)")print(f"[OK] 字段:起点,终点,距离_km,排名")print(f"\n航线列表(按距离排序):")for rank, (start_code, end_code, distance) in enumerate(routes, 1): start = airports[start_code] end = airports[end_code] print(f" {rank}. {start['name']} → {end['name']} | {distance:,} km")

夜雨聆风