船舶AIS轨迹数据插值(Python)

船舶自动识别系统

AIS系统是船舶自动识别系统(Automatic IdentificationSystem)的简称,由岸基(基站)设施和船载设备共同组成,是一种新型的集网络技术、现代通讯技术、计算机技术、电子信息显示技术为一体的数字助航系统和设备。
船舶AIS数据分为静态数据和动态数据。
静态数据包含船舶MMSI号,船名,呼号,IMO号,目的地,预计达到时间,吃水等静态信息。动态数据包含船舶MMSI号,报文发送时间,经度,纬度,航速,航向,船艏向,航行状态等动态信息。

船舶AIS数据插值处理

由于船舶AIS报文发送时间在2-20秒不等,与船舶的航速大小相关。在我们处理轨迹数据时,需要做一些工作,比如绘制船舶航行轨迹,对船舶的航速进行分析,多船航行行为特征分析等,这就需要对船舶的轨迹数据进行匹配,毕竟每条船的AIS数据不是同时发送出来。

线性插值代码

由于时间间隔在10秒左右,默认船舶在时间间隔内处于匀变速运动。
楼主获取的原始AIS数据为csv格式,当然也有txt,xlsx等格式。

import csv
# ['timestamp','lon', 'lat', 'speed']

# 读取csv文件
with open('273133100.csv', 'r') as f:
    reader = csv.reader(f)
    result = list(reader) # 将数据空间转换成嵌套列表
    L = len(result)
    # 遍历列表(跳过表头),将列表里的数据转换成浮点数,便于后续处理
    for i in range(1, L):
        result[i] = list(map(float, result[i]))

# 遍历整个数据空间(跳过表头),判断是否存在空缺,线性插值
for i in range(2, len(result)):
    if result[i][0] - result[i-1][0] > 1:
        gap = int(result[i][0] - result[i-1][0])
        interval_long = (result[i][1]-result[i-1][1])/gap
        interval_lat = (result[i][2]-result[i-1][2])/gap
        interval_speed = (result[i][3]-result[i-1][3])/gap
        for k in range(1, gap):
                result.insert(i-1+k, [result[i-1][0] + k, \
                    interval_long*k + result[i-1][1], \
                    interval_lat*k + result[i-1][2], \
                    interval_speed*k + result[i-1][3]])


# # 遍历,判断插值效果
# for i in range(len(result)):
#     print(result[i])

# 将插值后的数据写入csv文件
with open("273133100_new.csv", "w", newline='') as csvfile:
    writer = csv.writer(csvfile)
    # 由于我转换数据类型及插值的时候跳过了表头,故不需要再写入表头
    # writer.writerow(["timestamp", "long", "lat",'speed'])   # 先写入columns_name
    writer.writerows(result)   #写入多行用writerows

其中对读取的数据进行转换的时候,将数据变成列表的形式比较容易处理。转换方法也可参考下面这位大哥的博客。
python列表嵌套与列表内类型转换

AIS动态数据形式如下:
船舶AIS轨迹数据插值(Python)_第1张图片
欢迎大家留言讨论,如有不正确的地方欢迎交流。

你可能感兴趣的:(python,数据分析)