python 飞机作业路线叠加地图

有一个飞机作业路线的经纬度excel表,飞机飞的时候很多经纬度重合么,因为时刻在记录位置,需要找到几个关键的转折点:

找转折点代码:

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: Suyue
@file: qingxi.py
@time: 2025/03/11
@desc:
"""
import numpy as np
import pandas as pd
from rdp import rdp

# 1. 读取数据
excel_path = "F:/hysplit_evaluation/NMG_B3726_202306181707_chgj.xlsx"
df = pd.read_excel(excel_path)

# 2. 提取列数据(请修改为实际列名)
time_col = df['时间'].values
lon = df['经度'].values
lat = df['纬度'].values
altitude = df['高度'].values  # 新增高度列
points = np.column_stack((lon, lat))

# 3. 轨迹简化(兼容版)
try:
    # 尝试新版本方法
    simplified_points, simplified_indices = rdp(points, epsilon=0.1, return_indices=True)
except TypeError:
    # 旧版本回退方案
    simplified_points = rdp(points, epsilon=0.1)
    indices = []
    for p in simplified_points:
        idx = np.where((points == p).all(axis=1))[0][0]
        indices.append(idx)
    simplified_indices = np.array(indices)

# 4. 获取对应时间和其他列数据
simplified_time = time_col[simplified_indices]
simplified_altitude = altitude[simplified_indices]  # 新增高度数据提取

# 5. 输出和保存
result_df = pd.DataFrame({
    '时间': simplified_time,
    '经度': simplified_points[:, 0],
    '纬度': simplified_points[:, 1],
    '高度': simplified_altitude  # 新增高度列
})
result_df.to_excel("F:/hysplit_evaluation//NMG_B3726_202306181707_关键转折点.xlsx", index=False)
print("结果已保存,保留点数:", len(simplified_points))

 

 

飞机路线找关键转折点叠加地图:

关键步骤解释:

  1. 坐标系转换:
    • 使用to_crs(epsg=4326)将SHP文件转换为WGS84坐标系(EPSG:4326),假设轨迹数据也是使用WGS84。
    • 如果轨迹数据使用其他坐标系,请根据实际情况调整转换。
  2. 错误处理:
    • 在加载SHP文件时,添加了异常处理,以便在文件加载失败时输出错误信息,而不是中断程序。
  3. 图形叠加:
    • 确保所有绘图操作都在同一个Axes对象(ax)上进行,这样它们会叠加显示。

通过这些调整,你应该能够在地图上正确显示飞机作业路线。

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: Suyue
@file: lianxi.py
@time: 2025/05/15
@desc:
"""
import matplotlib
matplotlib.use('Agg')  # 使用非交互式后端,适合保存文件
import matplotlib.pyplot as plt
import geopandas as gpd
from rdp import rdp
import numpy as np
import pandas as pd

# 设置中文字体,解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 读取数据
def load_data(excel_path):
    """从Excel加载轨迹数据"""
    df = pd.read_excel(excel_path)
    # 请根据实际列名修改(假设列名为'经度'和'纬度')
    return np.column_stack((df['经度'], df['纬度']))

# 2. 轨迹简化
def simplify_trajectory(points, epsilon=0.1):
    """使用RDP算法简化轨迹"""
    return rdp(points, epsilon=epsilon)

# 3. 绘制地图和轨迹
def plot_trajectory(original_points, simplified_points, shp_path):
    """绘制轨迹地图"""
    # 创建图形
    fig, ax = plt.subplots(figsize=(12, 10))

    # 绘制盟市边界(SHP文件)
    try:
        boundaries = gpd.read_file(shp_path)
        # 确保SHP文件和轨迹数据使用相同的坐标系
        # 假设轨迹数据是WGS84(经纬度),而SHP文件可能是投影坐标系
        # 将SHP文件转换为WGS84(EPSG:4326)
        boundaries = boundaries.to_crs(epsg=4326)
        boundaries.plot(ax=ax, edgecolor='gray', facecolor='none', linewidth=0.5)
    except Exception as e:
        print(f"无法加载SHP文件: {e}")

    # 绘制原始轨迹(浅色细线)
    ax.plot(original_points[:, 0], original_points[:, 1],
            'b-', linewidth=1, alpha=0.3, label='原始轨迹')

    # 绘制简化后的轨迹(红色粗线带标记)
    ax.plot(simplified_points[:, 0], simplified_points[:, 1],
            'r-', linewidth=2, marker='o', markersize=6, label='关键转折点')

    # 设置图形属性
    ax.set_xlabel('经度')
    ax.set_ylabel('纬度')
    ax.set_title('飞机增雨作业轨迹简化结果')
    ax.legend()
    ax.grid(True)

    # 自动调整坐标范围
    all_points = np.vstack([original_points, simplified_points])
    ax.set_xlim([all_points[:, 0].min() - 0.5, all_points[:, 0].max() + 0.5])
    ax.set_ylim([all_points[:, 1].min() - 0.5, all_points[:, 1].max() + 0.5])

    plt.tight_layout()
    return fig

# 主程序
if __name__ == "__main__":
    # 文件路径配置(请修改为您的实际路径)
    excel_path = "F:/作业轨迹/NMG_B3726_202306181707_关键转折点.xlsx"
    shp_path = "G:/标准地图/内蒙古shp干旱业务机/盟市界.shp"

    try:
        # 处理数据
        original_points = load_data(excel_path)
        simplified_points = simplify_trajectory(original_points, epsilon=0.1)

        # 生成地图
        fig = plot_trajectory(original_points, simplified_points, shp_path)

        # 保存结果
        fig.savefig("F:/作业轨迹/轨迹可视化结果.png", dpi=300, bbox_inches='tight')
        print("图形已保存为:轨迹可视化结果.png")

        # 保存简化后的转折点
        pd.DataFrame(simplified_points, columns=['经度', '纬度']).to_excel("关键转折点.xlsx", index=False)
    except Exception as e:
        print(f"程序运行出错: {e}")

 

posted @ 2025-05-15 17:12  秋刀鱼CCC  Views(40)  Comments(0)    收藏  举报