


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 = {"JFK": {"name": "纽约 (JFK)", "lat": 40.6413, "lon": -73.7781},"EWR": {"name": "纽约 (EWR)", "lat": 40.6895, "lon": -74.1745},"SIN": {"name": "新加坡 (SIN)", "lat": 1.3644, "lon": 103.9915},"AKL": {"name": "奥克兰 (AKL)", "lat": -37.0082, "lon": 174.7850},"DOH": {"name": "多哈 (DOH)", "lat": 25.2609, "lon": 51.6138},"PER": {"name": "珀斯 (PER)", "lat": -31.9403, "lon": 115.9672},"LHR": {"name": "伦敦 (LHR)", "lat": 51.4700, "lon": -0.4543},"DFW": {"name": "达拉斯 (DFW)", "lat": 32.8998, "lon": -97.0403},"MEL": {"name": "墨尔本 (MEL)", "lat": -37.6690, "lon": 144.8410},"DXB": {"name": "迪拜 (DXB)", "lat": 25.2532, "lon": 55.3657},"LAX": {"name": "洛杉矶 (LAX)", "lat": 33.9416, "lon": -118.4085},"IAH": {"name": "休斯顿 (IAH)", "lat": 29.9902, "lon": -95.3368},"SYD": {"name": "悉尼 (SYD)", "lat": -33.9399, "lon": 151.1753},"HKG": {"name": "香港 (HKG)", "lat": 22.3080, "lon": 113.9185}}# 航线列表(起点,终点,航空公司,航班号,距离)routes = [ ("JFK", "SIN", "新加坡航空", "SQ23/SQ24", 15349), ("SIN", "EWR", "新加坡航空", "SQ21/SQ22", 15344), ("AKL", "DOH", "卡塔尔航空", "QR921/QR920", 14535), ("PER", "LHR", "澳航", "QF9/QF10", 14499), ("DFW", "MEL", "澳航", "QF22/QF21", 14472), ("AKL", "DXB", "阿联酋航空", "EK449/EK448", 14200), ("LAX", "SIN", "新加坡航空", "SQ37/SQ38", 14114), ("IAH", "SYD", "联合航空", "UA101/UA100", 13834), ("DFW", "SYD", "澳航", "QF8/QF7", 13804), ("JFK", "HKG", "国泰航空", "CX843/CX844", 13000)]# 删除已存在的文件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, "航空公司", "TEXT", field_length=50)arcpy.AddField_management(output_path, "航班号", "TEXT", field_length=50)arcpy.AddField_management(output_path, "距离_km", "DOUBLE")print("要素类已创建,开始绘制航线...")# 使用插入游标添加要素with arcpy.da.InsertCursor(output_path, ["SHAPE@", "起点", "终点", "航空公司", "航班号", "距离_km"]) as cursor:for start_code, end_code, airline, flight_num, distance in routes: start = airports[start_code] end = airports[end_code]# 创建测地线(大圆航线)# 使用 densify 方法沿大圆路径加密点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)# 沿测地线加密点(每 500 公里一个点,使曲线更平滑)# 使用 geodesic 方法生成大圆路径num_points = int(distance / 500) + 2densified_line = polyline.densify("GEODESIC", num_points)# 插入记录cursor.insertRow([ densified_line, start["name"], end["name"], airline, flight_num, distance ]) print(f" 已绘制:{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 i, (start_code, end_code, airline, flight_num, distance) in enumerate(routes, 1): start = airports[start_code] end = airports[end_code] print(f" {i}. {start['name']} → {end['name']} | {airline} {flight_num} | {distance:,} km")
夜雨聆风