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