数据处理-(车辆、飞机)轨迹点位抽稀处理

背景需求:

需要实现飞机仿真实时移动位置,但是提供的数据量较为庞大,而我们的数据都是通过kafka发送,再由ue4承接数据来做渲染。但是数据量较为庞大,在增大飞行速度的同时渲染比较吃力,于是想到点位个数压缩,数据推送频率不变来实现。

构思原理:利用普克拉斯算法,通过该点位压缩算法来压缩点的个数
这里提供的数据是excel,我打算把他处理成geosjon格式数据,然后用leaflet加载,判断是否和原数据是否重合。

'''
Author: nico
Date: 2023-06-07 10:21:42
LastEditTime: 2023-06-07 10:21:46
Description: 
'''
import math
import pandas as pd

def douglas_peucker(coords, epsilon):
    # 找到距离端点最远的点
    dmax = 0
    index = 0
    for i in range(1, len(coords)-1):
        d = distance(coords[i], coords[0], coords[-1])
        if d > dmax:
            index = i
            dmax = d

    # 如果最大距离大于阈值,则递归地对两个子段进行处理
    if dmax > epsilon:
        results1 = douglas_peucker(coords[:index+1], epsilon)
        results2 = douglas_peucker(coords[index:], epsilon)

        # 将结果合并
        return results1[:-1] + results2
    else:
        # 如果最大距离小于阈值,则保留该段的起点和终点
        return [coords[0], coords[-1]]
        
def distance(p, p1, p2):
    # 计算点到线段的距离
    x0, y0 = p
    x1, y1 = p1
    x2, y2 = p2
    dx = x2 - x1
    dy = y2 - y1
    if dx == 0 and dy == 0:
        return math.sqrt((x0 - x1)**2 + (y0 - y1)**2)
    else:
        t = ((x0 - x1) * dx + (y0 - y1) * dy) / (dx*dx + dy*dy)
        if t < 0:
            px, py = x1, y1
        elif t > 1:
            px, py = x2, y2
        else:
            px, py = x1 + t*dx, y1 + t*dy
        return math.sqrt((x0 - px)**2 + (y0 - py)**2)

# 示例用法

def getData():
    # 读取Excel数据到DataFrame
    df = pd.read_excel('data.xlsx')

    # 将经纬度转换为坐标点
    coordinates = []
    for index, row in df.iterrows():
        coordinates.append([row['lat'], row['lon']])
    return coordinates

coords = getData()
epsilon = 0.0000009
print(len(coords))
simplified_coords = douglas_peucker(coords, epsilon)
new_list = [[sublist[1], sublist[0]] for sublist in simplified_coords]
print(len(new_list),new_list)
simplified_geojson = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {},
            "geometry": {
                "type": "LineString",
                "coordinates":new_list
            }
        }
    ]
}

# 将GeoJSON写入文件
with open('chouxi10.json', 'w') as f:
    f.write(str(simplified_geojson))

原作者地址:https://segmentfault.com/u/yourena_c
这里我用leaflet来测试形成的geojson是否和未处理的元数据符合,所以经纬度对位也同时做了处理。




    Leaflet GeoJSON Example
    
    
    
    
    
    
    
    



    

数据处理-(车辆、飞机)轨迹点位抽稀处理_第1张图片
数据处理-(车辆、飞机)轨迹点位抽稀处理_第2张图片
最后结果是抽稀10倍,部分特征消失,但是基本吻合。

你可能感兴趣的:(数据处理-(车辆、飞机)轨迹点位抽稀处理)