【开源技巧】AIS 定位异常船舶挖掘实用指南

· 2026-11-13 16:29 · 2 阅读

原创 丁爸 2026-11-13 16:29 四川

AIS 定位异常船舶挖掘实用指南

适用对象:海事态势感知分析员、合规与制裁筛查团队、海警/海关情报岗、航运风险尽调人员,以及搭建"暗船"检测流水线的数据工程师。

开源情报研究中心

2026年11月13日不开船舶定位,或者盗用其他船舶的注册名称该怎么挖?一句话结论:绝大多数"异常"是数据和覆盖造成的,不是船在作弊。指南的全部技巧,都是为了让"漏掉的船"和"无辜的船"同时变少。

0. 一页速览:30 分钟上手流程

步骤

做什么

产出

典型耗时

① 建底座

把 AIS 拆成"船舶静态表 / 动态报文表 / 航次表 / 事件表",跑一遍字段质检

可信 MMSI 清单 + 脏数据黑名单

半天(一次性)

② 硬规则筛

速度不可能、位置跳变、越陆、长度与船型矛盾

L1 候选池(通常占全量 0.1%–2%)

分钟级

③ 行为画像

静默缺口(gap)、绕行、长时间漂航、近距离并靠

L2 候选池

小时级

④ 遥感复核

用 SAR/光学影像判断"当时那里到底有没有船"

可见 / 不可见 / 无法判定

受卫星重访限制

⑤ 身份归因

IMO 主键 → 注册、检验、所有权、制裁

证据卷宗

每船 10–30 分钟

⑥ 网络扩展

同港同窗、STS、共有公司、共有管理公司

关联船组

批量

⑦ 分级交付

按证据强度分 A/B/C 三档,附可复核的证据链

可行动清单

每轮 1 小时

记住一条铁律:"某一次 SAR 过境没看到 AIS"不构成故意规避的证据——可能是卫星没拍到、设备坏了、或船本来就小于 AIS 强制配备门槛。系统的定位是"生成待人工裁定的候选",不是"下判决"。

1. 先搞清楚:你要找的是哪一类异常

"定位信息异常"在实务中是四种完全不同的东西,混在一起分析必然误报泛滥:

类型

现象

常见成因

挖掘难点

A. 静默/断点(gap)

报文中断数十分钟到数天,之后在原处或远处"重新出现"

关闭设备、遮挡、岸基/卫星覆盖空洞、设备故障

无法自证恶意;必须先排除覆盖问题

B. 位置伪造/跳变

位置瞬移、速度矢量不可能、多船同步偏移

篡改 AIS 报文、GPS 干扰/欺骗、身份冒用

区域性 GPS 干扰会让"整片海"一起异常

C. 身份伪装(identity laundering)

声称是渔船/游艇/Class B,但实际是大型货船

冒用他人 MMSI、错填船型、关闭 A 类改开 B 类

需要外部物理证据(长度、吃水、影像)

D. 行为异常

绕行、禁区闯入、长时漂航、异常并靠

规避检查、走私转运、电缆/管道抵近、捕捞

阈值强依赖海域与时季

学术界常用的五种行为异常分类(Lane 等提出,被 J. Mar. Sci. Eng. 2022 综述沿用,该综述覆盖 44 篇 AIS 异常检测论文)可以直接作为你的"分析菜单":

1.偏离常规航线(route deviation)

2.异常 AIS 活动(信号丢失 / 丢失后异常续接)

3.异常到港(unexpected port arrival,去了不该去的港)

4.近距离接近(close approach,长时间并靠)

5.进入禁区(zone entry,海洋保护区、专属经济区、制裁水域)

落到数据上,这五类都要转成可计算的代理指标,第 5 节给对照表。

一条重要的分流原则:单船异常 vs 区域同步异常

特征

更可能是

处置

只有个别船静默/跳变,同海域其他船正常

个体行为或个体设备问题

逐船画像 + 遥感复核

同一时段、同一片海域,几十上百条船同时出现物理上不可能的位移

区域性 GPS 干扰/欺骗

判定为"环境受影响区",不要把这些船当嫌疑人;标注为数据可信度屏蔽区

佐治亚理工学院对 2024 年 11 月—2025 年 2 月全球 36.7 万艘船的 AIS 测量发现:31 个持续性异常热点中至少 22 个有强 GPS 欺骗证据,且红海(MSC Antonia 搁浅事件前数月)与霍尔木兹海峡(2026 年伊朗战争前一年多)的欺骗活动长期存在。结论:区域欺骗是常态,逐船定罪必须扣除这一层。

2. 数据底座:把报文变成能查的四张表

2.1 表结构

表

关键字段

用途

船舶静态表

MMSI、IMO、呼号、船名、船旗、船型、总长/船宽、吃水

身份核对、物理一致性校验

动态报文表

MMSI、时间戳(UTC)、经纬度、SOG、COG、艏向、旋回率、航行状态

一切轨迹分析

航次表

目的地、ETA、吃水、危险品标志

意图与实际对照(异常到港/异常目的地)

事件表

进出港、锚泊、STS、禁区闯入、gap

供人工复核的结构化线索

分区的关键建议:动态表按MMSI + 时间建索引,并按月/海域分区;单月全球量级在十亿条报文上下(本地论文使用的商用聚合器 12 天语料即含 1.34 亿个位置快照、192 万 MMSI),单机 PostgreSQL/PostGIS + TimescaleDB 足够,不必上大数据栈。

2.2 质检:先杀掉会毁掉全部结论的脏数据

校验项

判定方式

不通过意味着

MMSI 结构

9 位;前 3 位为 MID 国家码;无 MID 的号段(如 111/970/974)需单独规则

伪造号或测试设备

MMSI 校验

同一 MMSI 出现多个 IMO/船名/呼号/尺寸

身份冒用、或静态信息被改写

IMO 校验位

7 位,前 6 位加权求和取模 10 得第 7 位

假 IMO(本地论文样本中 IMO 校验位 100% 通过,说明校验位是廉价而有效的过滤)

坐标合法性

lat∈[-90,90]、lon∈[-180,180];不等于 0/91/181;不在陆地上(用海陆栅格判定)

解析错误、设备故障、故意投毒

速度合法性

SOG ≤ 30 kn(本地论文取 v_max=30 kn 作为水面船上限),且 > 102.3 kn 为保留值

传感器故障或伪造

时间一致性

报文时间单调、时区统一为 UTC、无跨年错误

聚合器处理错误(这类错误会伪造出"瞬移")

船型—尺寸一致性

声明"游艇/渔船/Class B"但总长 > 50 m

身份伪装(本地论文据此定义 identity laundering 规则)

覆盖可信度

与岸站/卫星覆盖栅格叠置,标注"低覆盖区"

决定后续 gap 能否作为证据

实操建议:把"低覆盖区"图层做出来。同一片海,如果历史 AIS 密度本身很稀,那里的 gap 几乎没有任何证据价值——这是把误报砍掉一半的最省力手段。

3. L1 硬规则层:用物理与格式把人筛到几十条

硬规则的价值不在"聪明",而在可解释、可复现、可写进报告。建议全部实现为对单条报文或相邻报文的确定性判定。

#

规则

判定式(示例阈值)

主要误报来源

处置

R1

速度不可能

相邻两点位移 / 时间差 > 30 kn(或 > 45 kn 作为极端)

时间戳错乱、聚合器补点

先修时间戳,再判

R2

位置瞬移

位移 > 100 km 且 Δt < 10 min

经纬度解析错误、MMSI 复用

标记为"疑似报文污染"

R3

越陆移动

相邻两点连线穿越海陆栅格的陆地

海岸线精度、内河/运河

用高精度海陆掩膜,排除运河

R4

航迹—航向矛盾

COG 与两点实际方位差 > 90° 且持续 > 3 个报文

强流、锚泊回转

结合 SOG 判定

R5

SOG 与位移不符

SOG > 8 kn 但实际位移对应 < 1 kn,或反之

停泊时 GPS 抖动

用 10 分钟滑窗

R6

报文间隔异常

单船报文中位间隔的 10 倍以上、且不在低覆盖区

卫星过境间隙

进入 L2 的 gap 分析

R7

静态信息改写

同一 MMSI 的船名/呼号/尺寸在 30 天内变更

合法改名/换旗

与登记变更记录对照

R8

身份伪装

船型∈ {游艇, 渔船, Class B} 且总长 > 50 m

船型字段错填

用影像/登记长度交叉验证

R9

禁区滞留

在禁区内连续 > 2 h 且 SOG < 3 kn

边界精度、合法通行

叠加许可清单

R10

异常到港

目的地字段与实际靠港不一致(连续 2 次以上)

船员不改 ETA/目的地

仅作为弱证据

阈值起点建议:R1、R2 用"物理上限"(30 kn、100 km/10 min)而不是"统计学分位",因为这层的目标是零漏网的粗筛;真正的排序交给 L3/L4。本地论文的配对实验也印证了"门限不能一味放大"——见第 5 节。

4. L2 行为层:把"异常"变成可比较的特征

4.1 静默缺口(gap)的特征化——本指南的核心

不要只记录"中断了 6 小时",要把它拆成一组可比特征,否则无法区分"设备坏了"和"关掉了":

特征

计算方式

为什么有用

gap 时长

t_end − t_start

与卫星重访周期、覆盖栅格对照才有意义

gap 前 30 min 平均 SOG/COG

滑窗统计

突然减速后关机 vs 高速中关机,含义不同

gap 两端位移与方位

大圆距离 / 方位角

与"按最后 SOG 直线推算"的位置比对,偏差即证据

gap 期间是否被 SAR/光学观测到

与影像检测结果求交

这是唯一能把"没报告"升级为"在但不报告"的证据

gap 起点距最近港口/锚地距离

空间查询

一出港就关,和在大洋中间关,性质不同

同海域并发 gap 比例

时空邻域统计

高并发⇒ 区域干扰/覆盖问题,不是个体行为

gap 后首次出现位置合理性

与可达半径比对

超出 v_max·Δt 的"跳跃"是伪造的强信号

本地论文给了一个极其实用的数量级:一艘 30 kn 的船,每静默 1 小时可以合法移动约 55.6 km;因此任何"用固定 5 km 距离门去匹配 SAR 与 AIS"的做法,都会把正常的快速船误判成"位置伪造"。这正是论文里 legacy 静态门限产生 105,549 条"疑似欺骗"告警、把分析员彻底淹掉的原因。

4.2 停留、并靠与转运(STS)

可复现的判据(本地论文部署规则,可直接借鉴):

·STS 转运候选:两船 SOG < 3 kn(缺失按 0 处理),同一 5 分钟时间桶内位置相距 < 1 km,且共享时间桶的首末间隔 ≥ 0.5 h(不必连续);排除平均位置距港口 < 2 n mile 的配对;且至少一方为货船/油轮,或双方船型未知。

·到港:至少 3 个 SOG < 1 kn 的位置落在某港口(有 UN/LOCODE)2 n mile(3704 m)内。

这两条规则的价值在于把"漂航"从噪声里分离出来:港口内的低速是常态,必须显式排除,否则告警里 90% 是锚地。

4.3 绕行与规避

·建立"常规航路栅格"(把历史轨迹栅格化后取高频格),统计单船轨迹落在常规栅格内的比例;比例骤降且伴随航程变长 ⇒ 绕行。

·叠加敏感图层:海洋保护区、电缆/管道走廊、专属经济区边界、制裁相关水域。绕行 + 禁区边缘擦边 + 目的地含糊三者同时出现,才是高价值线索。

4.4 预测误差法(无需标签的通用手段)

Electronics 2025 的做法值得直接照搬:用 LSTM 学习单船历史航迹,预测下一时刻的位置、COG、SOG,把"预测—实测"偏差与由航海惯例、AIS 精度、经验灵敏度共同标定的阈值比较,超阈即异常。优点是不需要人工标注,且能捕捉"莫名其妙改向/减速"这类软异常;缺点是阈值对海域敏感,必须逐海域标定(该文在北海南部—波罗的海验证)。

工程上更稳的组合是:

6.逐船基线(同一 MMSI 自身历史分位,如 P99)+ 同类型船基线(同船型/同尺度/同海域);

7.双基线都超阈才报警,可显著降低"特殊作业船"带来的长期误报;

8.把预测误差、gap 特征、STS 命中、禁区命中合成一个 0–100 的可解释分数,而不是训练一个黑箱分类器。

5. L3 遥感复核:把"没报告"变成"在但不报告"

AIS 只能看见愿意被看见的船。要突破这个结构性盲区,必须引入非合作传感(SAR 全天时全天候、光学受云影响)。这一层的工程细节决定了整个流水线是否可用。

5.1 关联的核心:动态运动学门(DKG)

把每个 AIS 船位按 SOG/COG 外推到卫星过境时刻,再与影像检测到的目标做二分图匹配。接受半径按下式放大(本地论文式 3):

g_j = min( g_max , max( g_0 , 2·CEP_j , κ·√(1 + v_j/v_ref) ) + v_max·Δt_j )

参数

含义

部署取值

实务解读

g_0

门限下限

200 m

约等于 Sentinel-1 的 20 像素,吸收几何定位与拼接误差

κ

速度不确定系数

50 m/kn

吸收速度相关的抖动

v_max

水面船速度上限

30 kn(15.43 m/s)

静默 1 h ⇒ 半径 +55.6 km

g_max

门限硬上限

50 km

超过约 0.9 h 静默后半径即封顶

τ_sparse

时间稀疏阈值

3 h

超过则降级为"低置信度",不再计入欺骗告警

把静默时长与半径的关系记住一句话就够:门限随静默时间线性膨胀,封顶后不再膨胀;超过 3 小时的静默交给"降级规则"处理,而不是继续放大半径。

5.2 五种结果标签(也是你的告警分类)

标签

定义

处置

确认Confirmed

影像目标与 AIS 轨迹在门限内匹配

常规跟踪,不报警

暗船Dark

影像目标在门限内找不到任何 AIS

高优先级,进入归因

疑似欺骗Spoof candidate

AIS 广播在门限内找不到影像目标,且未触发降级

中优先级,需二次影像

身份伪装Identity laundering

AIS 声明小艇但影像包围盒 > 50 m

高优先级,物理证据最硬

低置信时间稀疏

静默 > 3 h,且存在影像目标落在 v_max·Δt 可达半径内

不进入操作员队列,仅存档

5.3 门限取舍:这是最容易做错的地方

本地论文在 200 个受控合成场景上给出的对照,几乎是一份"反面教材清单":

关联策略

真匹配召回

欺骗告警

错误确认

固定 1 km

0.204

4234

17

固定 5 km

0.705

2878

184

固定 10 km

0.909

2187

391

固定 50 km

0.879

1757

891

传统封顶静态门(≤5 km)

0.650

3107

85

DKG(部署版,含降级)

0.878

764

893

DKG(10 km 上限)

0.909

829

388

三条可直接落地的结论:

9.告警下降 4.1 倍(3107→764)来自"降级规则",不是来自放大半径——放大半径只会制造错误确认。

10.错误确认是致命伤:固定 50 km 门限下,605 个合成暗船目标里有 604 个被"确认"到了某条无关 AIS 轨迹上,等于把暗船从分析员视野里彻底抹掉。你的门限越宽,漏掉的暗船越多。

11.上限应显著小于 50 km:10–25 km 在实验中同时取得更高召回与更少错误确认。建议按海域调:开阔洋面 20–30 km,港口/海峡密集区 5–10 km。

5.4 检测器本身的可靠性(必须写进结论的免责条款)

本地论文的跨数据集测试给出了硬约束:在 SSDD 上 AP@0.50 高达 0.938–0.941 的检测器,不做域内微调时,在 LS-SSDD 与 HRSID 的近岸子集上 AP@0.50 只有 0.052–0.185,85%–89% 的小目标被漏检;离岸(较大目标)能迁移到 0.86–0.87,但在 Sentinel-1 宽幅影像上仍只有 0.39–0.48。

实务含义:

·近岸/港口的暗船检测最不可信,而这恰好是走私与规避最集中的地方;

·论文运营语料中 1606 个暗船检测里,114 个位于港口 5 n mile 内——这批必须单独标注"高误报风险";

·任何"暗船数量"结论都必须附上"检测器在近岸的漏检率"与"影像分辨率下限"。

5.5 匹配算法选择

·密集场景(港内、锚地):用匈牙利/最优分配(论文实测 0.853 vs 贪心 0.793);

·稀疏混合场景:贪心最近邻不劣,甚至略优(0.903 vs 0.878),因为"最大化配对数"的分配目标会把暗船强行配对;

·落地方案:先按海域密度切换策略;或改造代价函数,让"多配一对"不再获得奖励。

6. L4 归因:从一条可疑轨迹到一个能写进报告的身份

6.1 IMO 是唯一可靠的主键

·IMO 号有校验位,造假成本高于 MMSI;本地论文对 2000 艘抽样船验证:IMO 校验位 100% 通过,且 97.7% 的 IMO 唯一映射到一个 MMSI。

·流程:MMSI → 静态信息里的 IMO → 注册/检验/所有权文档 → 制裁名单。

·一致性而非准确性:论文测得注册文档与 AIS 申报的名称一致率 90.1%,船旗一致率 71.8%(在可比对的 83.2% 船舶中)。不一致是复查线索,不是欺诈证据(改名、换旗都会造成不一致)。

6.2 所有权链是最薄的一环

同一样本中:99.1% 的船有所有权记录,但只有 37.1% 有公司字段、11.4% 有受益所有人字段。这意味着:

·不要指望自动化"查出实际控制人",要把人力放在这 11.4% 上;

·公司名做模糊合并(如 token-sort 相似度 ≥ 92)会错误合并名称相近的不同公司,合并结果必须人工确认后才能进图谱;

·注册信息天然滞后(换旗/过户数周才更新),时间戳必须一起存。

6.3 制裁筛查:名称匹配远远不够

论文用公开 OFAC SDN 名单(19,391 条、1,540 艘船、其中 1,525 艘带 IMO)做了离线对照:按"名称+船旗"匹配只能召回 51.4%,仅按名称匹配 67.0%——只有按 IMO 匹配才能接近全覆盖。因此:

12.首选 IMO 精确匹配;

13.名称匹配作为补充,必须人工复核;

14.记录名单版本日期(论文里名单比数据新约半年,会造成"当时不在名单"的误判)。

6.4 网络视角:把单船放进关系图

本地论文的五类边定义可直接复用:

边类型

判定

船—船(STS)

见 4.2 节(<3 kn、<1 km、5 分钟桶、≥0.5 h、排除港内 2 n mile)

船—港

≥3 个 SOG < 1 kn 的位置落在港口 2 n mile 内

船—公司 / 公司—公司

来自所有权与公司文档,公司名规范化后按相似度合并

船—船旗

来自静态表的国家字段(注意:若导出数据缺该字段,这类边会全空)

暗船邻近

两次 SAR 关联置信度 ≥ 0.6 的船,末位位置相距约 50 n mile 且时间差 < 24 h

图上用 Louvain 做社区划分,用介数中心性找"桥船"(连接两个本不相连的社区)。但必须诚实:论文在一个月、27,991 个节点的波斯湾真实图上没有发现明显的桥船,图结构被港口枢纽主导。所以:

网络分析的正确用法是"给已由融合/卷宗标记出的船提供上下文",不是独立的风险排序来源。

7. 打分、分级与队列治理

7.1 证据强度分级(比分数更重要)

档位

证据组合

处置

建议占比

A 级

影像确认"在但不报告" + 物理尺寸与声明矛盾(或 IMO 与登记矛盾)

24 h 内人工复核,进入执法/合规流程

≤ 5%

B 级

影像不可见 + gap 特征异常 + 目的地/航线异常

72 h 内复核,等待下一次过境影像

15%–25%

C 级

仅 AIS 侧行为异常,无外部证据

批量统计、趋势监控,不单独立案

其余

7.2 可解释打分示例(权重可调)

因子

分值

说明

gap 期间被影像观测到

+40

最强单一证据

物理尺寸与申报船型矛盾

+35

确定性规则,误报极低

gap 后位置超出 v_max·Δt 可达范围

+25

需要可靠的时间戳

同海域并发异常比例 < 10%(排除区域干扰)

+15

反向条件,用于排除

目的地与实际靠港不一致≥2 次

+10

弱证据

命中 STS 规则且不在港区

+10

需人工确认

位于低覆盖区 / 港口 5 n mile 内 / 检测器近岸退化区

−30

误报抑制项

7.3 队列治理的三条硬规则

15.同一事件去重:同一 gap 只产生一条告警,后续报文刷新它而不是新建。

16.降级优先于删除:静默 > 3 h 的条目转入"低置信"存档(论文做法),保留可追溯性,同时不占用分析员注意力。

17.每条告警必须带"为什么":规则名、命中字段、阈值、证据文档的报告类型。本地论文把这一点写成原则——告警是"规则可解释的假设",不是黑箱分数。

8. 七日落地 SOP

天

任务

交付物

验收标准

D1

接入 AIS(≥30 天历史)+ 海陆栅格 + 港口表;跑质检

质检报告、低覆盖区图层、干净 MMSI 清单

脏数据比例 < 3%

D2

实现 R1–R10 硬规则;对全量跑一遍

L1 候选池(含规则命中明细)

抽样 100 条人工核对,误报可解释

D3

计算 gap 特征表、STS、到港、绕行指标

单船特征宽表

特征覆盖率 > 90%

D4

接入 SAR/光学检测结果,实现 DKG 匹配

五类标签结果表

门限按海域分档;记录错误确认抽样

D5

对 A/B 级候选做 OSINT:IMO→注册/所有权/制裁

证据卷宗

每份卷宗含 3 类以上文档

D6

构建 SNA 子图(2 跳内),算社区与介数

关联船组清单

明确标注"仅作上下文"

D7

分级交付、复盘误报、标定阈值

周报 + 阈值调整记录

误报率与漏报抽检均留档

第一个月不要追求"自动发现犯罪",先追求"每条告警都能在 10 分钟内被人工证实或证伪"。可解释性先行,模型后置。

9. 代码骨架(pandas / PostGIS 思路)

import numpy as np, pandas as pd
R_E = 6371.0          # km
V_MAX_KN = 30.0       # 水面船上限
GATE_FLOOR_M = 200.0
KAPPA_M_PER_KN = 50.0
GATE_CEIL_M = 25_000.0    # 建议 10–30 km,不用 50 km
SPARSE_H = 3.0            # 时间稀疏阈值
def haversine_km(lat1, lon1, lat2, lon2):
    p = np.radians
    dlat, dlon = p(lat2 - lat1), p(lon2 - lon1)
    a = np.sin(dlat/2)**2 + np.cos(p(lat1))*np.cos(p(lat2))*np.sin(dlon/2)**2
    return 2 * R_E * np.arcsin(np.sqrt(a))
def check_kinematics(df, v_max=V_MAX_KN):
    """R1/R2:速度与瞬移。df 需按 mmsi, ts 排序。"""
    df = df.sort_values(["mmsi", "ts"])
    g = df.groupby("mmsi")
    df["dt_h"] = g["ts"].diff().dt.total_seconds() / 3600
    df["dist_km"] = haversine_km(g["lat"].shift(), g["lon"].shift(), df["lat"], df["lon"])
    with np.errstate(divide="ignore", invalid="ignore"):
        df["implied_kn"] = df["dist_km"] / 1.852 / df["dt_h"]
    df["flag_speed"] = (df["implied_kn"] > v_max * 1.5) & (df["implied_kn"].notna())
    df["flag_jump"]  = (df["dist_km"] > 100) & (df["dt_h"] < 1/6)
    return df
def gate_radius_m(sog_kn, cep_m, dt_h, v_max=V_MAX_KN,
                  g0=GATE_FLOOR_M, kappa=KAPPA_M_PER_KN, gmax=GATE_CEIL_M):
    """DKG:随静默时长膨胀,封顶。dt_h 为 SAR 时刻与末次 AIS 的时间差(小时)。"""
    base = max(g0, 2 * cep_m, kappa * np.sqrt(1 + sog_kn))
    return min(gmax, base + v_max * 0.514444 * dt_h * 3600)
def classify(d, gate_m, dt_h, sar_len_m=None, ais_type=None):
    """五类标签;d 为推算位置与影像目标的距离(米)。"""
    if d <= gate_m:
        if ais_type in ("Pleasure", "Fishing", "ClassB") and (sar_len_m or 0) > 50:
            return "identity_laundering"
        return "confirmed"
    if dt_h > SPARSE_H:
        return "low_confidence_temporal_sparsity"
    return "spoof_candidate"   # AIS 无影像对应
def sts_candidates(pts, dist_km=1.0, sog_max=3.0, bucket_min=5, min_span_h=0.5,
                   port_exclusion_km=3.7):
    """简化的并靠检测:同 5 分钟桶内、低速度、近距、持续 ≥30 分钟。"""
    pts = pts[pts.sog.fillna(0) < sog_max].copy()
    pts["bucket"] = pts.ts.dt.floor(f"{bucket_min}min")
    hits = []
    for (b, mmsi), grp in pts.groupby(["bucket", "mmsi"]):
        near = pts[(pts.bucket == b) & (pts.mmsi != mmsi)]
        for _, a in grp.iterrows():
            for _, o in near.iterrows():
                if haversine_km(a.lat, a.lon, o.lat, o.lon) <= dist_km:
                    hits.append((a.mmsi, o.mmsi, b))
    pairs = pd.DataFrame(hits, columns=["a", "b", "bucket"]).drop_duplicates()
    span = pairs.groupby(["a", "b"]).bucket.agg(["min", "max", "count"])
    span["span_h"] = (span["max"] - span["min"]).dt.total_seconds() / 3600
    return span[(span.span_h >= min_span_h) & (span["count"] >= 2)]

要点:所有阈值都放进配置而不是散落在代码里,并按海域/季节分别标定;每次调参都要留版本号,因为"漏报"往往在几个月后才被发现。

10. 常见陷阱与合规红线

陷阱

后果

对策

把"gap"直接当"关闭 AIS"

80% 以上是覆盖/设备/卫星间隙

先叠覆盖栅格,只在覆盖良好的海域计证据

用固定距离门做 SAR–AIS 匹配

快速船全部误判为欺骗;宽门限把暗船"确认"掉

用速度与静默时长自适应的门限,且上限≤ 25 km

忽略区域性 GPS 欺骗

整片海域的船被集体打成嫌疑人

先算"同海域并发异常率",高则整片屏蔽

只做 AIS 侧分析

结构性盲区:不广播的船永远看不见

必须上非合作传感(SAR/光学)

用名称匹配做制裁筛查

召回仅 51%–67%

以 IMO 为主键,名称仅作补充

认为"所有权可自动查清"

仅 11.4% 有受益所有人字段

人力聚焦高价值样本,模糊合并须人工确认

把图分析当风险排序

真实图被港口枢纽主导,可能没有"桥船"

图只做上下文,不做独立排序

忽略检测器域偏移

近岸 AP 可跌到 0.05–0.19,漏检 85%+

近岸单独标定、域内微调、结论附免责

直接对外指名"暗船"

法律与声誉风险

输出"待裁定候选"+"证据链",人工复核后再定性

合规要点:AIS 数据的使用受数据提供方许可约束(商用数据通常禁止再分发);涉及个人/船舶指控的材料应遵循当地证据标准;保留名单与数据的版本与时间戳,确保结论可追溯、可复现。本地论文明确把系统定位为"决策支持 + 人工复核 + 审计留痕",而非自动执法。

11. 资料清单

本地文件

文件

说明

futureinternet-18-00559.pdf

本地论文:SAR–AIS 融合 + OSINT + SNA 的暗船筛查框架(Future Internet2026, 18, 559)

refs/mdpi-ais-review-2022.pdf

AIS 轨迹异常检测综述(J. Mar. Sci. Eng.2022, 10, 112;覆盖 44 篇论文,给出 Lane 五类异常分类)

refs/mdpi-ship-movement-anomalies-2025.pdf

基于 LSTM 预测误差的航行异常识别(Electronics2025, 14, 4733)

refs/arxiv-darkvessselnet-2606.00445.pdf

DarkVesselNet:SAR + 光学 + AIS 轨迹推理与缺口检测(arXiv 2606.00445,预印本)

refs/arxiv-gps-spoofing-2609.37676.pdf

全球海运 GPS 欺骗的大规模测量:36.7 万艘船、31 个热点(arXiv 2609.37676)

检索得到的在线出处

·Albaqami & Haq, A Computational Framework for Dark-Vessel Screening— https://www.mdpi.com/1999-5903/18/10/559

·Rolfsen et al., Anomaly Detection in Maritime AIS Tracks: A Review of Recent Approaches— https://www.mdpi.com/2077-1312/10/1/112

·Wielgosz et al., Investigations of Anomalies in Ship Movement During a Voyage— https://www.mdpi.com/2079-9292/14/23/4733

·Sharma, DarkVesselNet— https://arxiv.org/abs/2606.00445

·Raymaker et al., She Spoofed Sea Ships by the Sea Shore— https://arxiv.org/abs/2609.37676

附:最小可用产出模板

船舶候选卡片
─────────────
MMSI / IMO / 船名 / 船旗 / 船型 / 总长(申报 · 影像)
异常类型:A 静默 / B 伪造 / C 身份伪装 / D 行为
时间线:末次正常报文→ gap 起止 → 复现位置(含推算误差半径)
影像证据:卫星/过境时刻/检测置信度/包围盒尺寸/与推算位置距离
归因证据:登记文档类型 + 一致性结论(名称/船旗/所有权)
网络上下文:同港同窗船、STS、共有公司(标注"仅上下文")
证据强度:A / B / C      建议动作:立即复核 / 等待下次过境 / 存档监控
复核人 / 时间 / 结论:待填

本指南中的阈值均为工程起点,须按所在海域、数据源与法规环境重新标定;所有"异常"在人工裁定前只是候选,不构成对任何船舶或个人的指控。

指南文档及参考资料已上传知识星球

长按识别下面的二维码可加入星球

里面已有万余篇资料可供下载

续费五折优惠

图片

图片

跳转微信打开

本文转载自微信公众号「丁爸情报分析师的工具箱」,查看原文。版权归原作者所有,如有侵权请联系删除。