參考文獻:[1]陳曉. 基于AIS數據的船舶密度計算與規律研究[D].大連海事大學,2021.DOI:10.26989/d.cnki.gdlhu.2020.001129.
謝謝姐姐的文章!
網格化AIS數據
網格化 AIS 數據是處理和分析船舶軌跡數據的一種有效方法,特別是當涉及到密度計算和模式識別時。以下是網格化 AIS 數據的一些主要好處,以及一些使用 Python 實現這一過程的基本代碼示例。
網格化 AIS 數據的好處
簡化數據分析:
- 網格化可以將連續的地理空間數據簡化為離散的單元,使得對船舶位置和運動的分析更加直觀和易于處理。
便于計算密度和分布:
- 通過統計每個網格內的船舶數量,可以更容易地計算和可視化船舶密度分布。計算的不再是所有MMSI船舶各自的航行信息,那個既復雜,又不易計算某地區的船舶密度。
模式識別和趨勢分析:
- 網格化數據有助于識別特定區域的流量模式、常用航道和潛在擁堵點。
時間序列分析:
- 通過跟蹤船舶在各個網格中的停留時間,可以分析航行模式和時間上的變化。
降低數據復雜性:
- 網格化減少了數據的復雜性,使大規模數據集更易于管理和分析。
Python 代碼示例
以下是一個簡單的 Python 代碼示例,展示如何將 AIS 數據網格化并計算每個網格中的船舶數量。
import pandas as pd
import numpy as np# 示例數據
data = {'MMSI': [123456789, 987654321, 123456789],'Timestamp': ['2023-01-01 00:00', '2023-01-01 01:00', '2023-01-01 02:00'],'Longitude': [-122.33, -122.34, -122.35],'Latitude': [37.39, 37.40, 37.41]
}
ais_data = pd.DataFrame(data)# 定義網格大小
grid_size = 0.01 # 假設每個網格的大小為0.01度# 網格化函數
def gridify(longitude, latitude, grid_size):return (np.floor(longitude / grid_size), np.floor(latitude / grid_size))# 應用網格化
ais_data['Grid'] = ais_data.apply(lambda row: gridify(row['Longitude'], row['Latitude'], grid_size), axis=1)# 計算每個網格中的船舶數量
grid_counts = ais_data['Grid'].value_counts()print(grid_counts)
這段代碼首先定義了一個模擬的 AIS 數據集,然后使用一個簡單的網格化函數將船舶的經緯度坐標映射到網格坐標上,并計算每個網格中的船舶數量。可以根據自己的數據集和需求調整網格大小和其他參數。
換算系數——考慮船舶大小
在考慮船舶尺度對交通安全的影響時,僅僅按照船舶的數量來計算密度可能不足以準確反映實際情況。因此,建立基于標準船尺寸的船舶密度計算模型是一種更為合理的方法。這種方法允許不同尺寸的船舶根據它們對空間的占用和潛在的安全風險被不同地權衡。
船舶密度計算模型
標準船尺寸定義:
- 將特定尺寸范圍內的船舶(例如 50m-100m)定義為標準船尺寸。
- 這個尺寸范圍代表了一種“平均”或“典型”的船舶大小,用于密度計算的基準。
換算系數:
- 對于小于或大于標準船尺寸的船舶,分配一個換算系數,以反映它們相對于標準船的大小。
- 例如,一個 200m 長的船可能被計算為兩艘標準船,而一個 25m 長的船可能只計為半艘標準船。
船舶密度計算:
- 船舶密度不再簡單地基于船舶數量,而是基于換算后的船舶數量進行計算。
- 這種方法更準確地反映了船舶對水域空間的占用和潛在的風險。
實際應用
在實際應用中,這種計算方法可以用于評估航道的擁擠程度、規劃航線,以及制定海事安全政策。通過考慮船舶的實際尺寸和占用空間,可以更準確地評估特定水域的安全狀況。
Python 代碼示例
以下是一個基本的 Python 代碼示例,演示如何根據船舶大小調整船舶數量來計算密度:
import pandas as pd# 示例數據
data = {'MMSI': [123456789, 987654321, 456789123],'ShipLength': [30, 80, 150] # 船舶長度,單位:米
}
ais_data = pd.DataFrame(data)# 定義標準船的大小范圍
standard_ship_min = 50 # 最小長度
standard_ship_max = 100 # 最大長度# 計算換算系數
def calculate_conversion_factor(length):if length < standard_ship_min:return 0.5elif length > standard_ship_max:return 1.5else:return 1 # 標準船尺寸# 應用換算系數
ais_data['ConversionFactor'] = ais_data['ShipLength'].apply(calculate_conversion_factor)# 計算總的“標準船”數量
total_standard_ships = ais_data['ConversionFactor'].sum()
print("Total 'Standard Ships':", total_standard_ships)
AIS數據的定期廣播
AIS(Automatic Identification System)系統定期廣播船舶的動態信息(如位置、速度、航向)和靜態信息(如船舶識別、類型、尺寸)。不同類型的信息具有不同的廣播頻率,如下圖所示。這可能導致在某一特定瞬時時刻,數據庫中不一定包含所有船舶的最新信息。
如果計算瞬時密度時,這一刻船舶的AIS信息還沒接收到,那么可以利用矩估計選擇近似整點時刻。由于最久的靜態信息是6min間隔,故可設置前后6min的信息接受域,并在域中選擇近似整點時刻,如下圖所示:
這種方式的優點是:
-
提高數據的完整性:由于 AIS 數據可能不是實時更新,所以在一定時間范圍內統計能夠更全面地捕捉到該時刻附近的船舶情況。
-
增加計算的準確性:減少了由于 AIS 更新率不一致而導致的數據缺失或延遲,使得瞬時密度的計算更為準確。
-
適應不同類型的船舶和航速:不同類型的船舶和不同航速的船只可能有不同的 AIS 更新頻率,通過擴展統計窗口可以更好地覆蓋這些差異。
這種方法在進行航道交通分析、海上交通管理和航行安全評估等方面是非常實用的。它允許分析人員更準確地估計特定時刻或時間段內的船舶密度,從而為相關的決策提供支持。
解碼AIS數據
處理和解碼 AIS 數據是一個涉及多個步驟的復雜過程。AIS 數據通常以 NMEA 0183 標準格式(一種海事通信協議)傳輸,這些數據包含了各種船舶信息,包括位置、航向、速度等。AIS 消息以特定格式編碼,首先需要將這些編碼的文本數據轉換為二進制格式,然后根據相關協議(如 ITU-R M.1371 和 IEC 61162-2)解碼以獲取實際的信息。
以下是解碼 AIS 數據的基本步驟:
1. 文本到二進制的轉換
AIS 消息通常使用六位 ASCII 碼表示。這種編碼方式將標準 ASCII 碼映射到六位二進制數。轉換的基本步驟是將每個字符轉換為其相應的六位二進制表示。
2. 根據 IEC 61162-2 協議解碼
一旦文本數據轉換為二進制形式,接下來就需要根據相應的協議解析這些二進制數據。這包括解析船舶的 MMSI、位置坐標、速度、航向等信息。
3. 實現解碼
在 Python 中,這個過程可以通過編寫自定義函數或使用已存在的庫來實現。例如,libais
是一個流行的 Python 庫,可以用于解碼 AIS 消息。
Python 示例
以下是一個使用 libais
庫來解碼 AIS 消息的基本示例。需要先安裝 libais
庫。
import ais# 示例 AIS 消息
ais_message = '!AIVDM,1,1,,B,15N7p<PP00I=0B?4p4p@E=kP058j,0*2C'# 提取消息體和填充位
# msg_parts 是將 AIS 消息按逗號分割后得到的列表。
msg_parts = ais_message.split(',')
# msg_body 是這個列表的第六個元素,即實際的 AIS 數據部分。
msg_body = msg_parts[5]
# fill_bits 是消息中的填充位數,用于告訴解碼器如何正確解析消息。
# 這個例子中填充位數為0,從0*2C中提取出來的
fill_bits = int(msg_parts[6].split('*')[0])# 解碼 AIS 消息
decoded_message = ais.decode(msg_body, fill_bits)print(decoded_message)
結果如下:?
然后根據相關規定,篩除不滿足真實要求的AIS數據,規定如下:?