ADS-B
ADS-B(Automatic Dependent Surveillance-Broadcast)是一种飞机自动广播系统,SDK 提供了完整的 ADS-B 功能支持,包括飞机位置显示、航向旋转、数据推算等。
功能特性
- 飞机位置显示:实时显示飞机位置
- 航向旋转:飞机图标根据航向自动旋转
- 飞机标签:显示飞机呼号或标识
- 数据推算:支持位置推算,平滑显示飞机移动
- 性能优化:根据缩放级别和视野范围智能显示
基础用法
开启 ADS-B 功能
javascript
// 基础开启(不启用推算)
sdk.adsb.open();
// 开启并启用推算功能
sdk.adsb.open({}, {}, true);更新飞机数据
javascript
// 准备飞机数据
const features = [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [116.3974, 39.9093], // [经度, 纬度]
},
properties: {
heading: 90, // 航向(度)
speed: 500, // 速度(节)
time_stamp: "2025-01-01T12:00:00Z", // 时间戳
callsign: "CA1234", // 呼号
aircraft_id: "B-1234", // 飞机ID
icao: "780123", // ICAO编码
id: "aircraft-1", // 唯一标识
label: "CA1234", // 显示标签(可选)
},
},
// 更多飞机数据...
];
// 更新飞机数据
sdk.adsb.update(features);关闭 ADS-B 功能
javascript
sdk.adsb.close();完整示例
示例1:基础使用
javascript
let sdk;
async function initMap() {
sdk = new navMap.MapSDK({
container: "map",
center: [116.39, 39.9],
zoom: 10,
});
sdk.on("loadComplete", () => {
setupADSB();
});
}
function setupADSB() {
// 开启 ADS-B 功能
sdk.adsb.open();
// 模拟飞机数据
const aircrafts = [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [116.3974, 39.9093],
},
properties: {
heading: 90,
speed: 500,
callsign: "CA1234",
aircraft_id: "B-1234",
time_stamp: new Date().toISOString(),
},
},
];
// 更新飞机数据
sdk.adsb.update(aircrafts);
}
initMap();示例2:WebSocket 实时更新
javascript
let sdk;
let ws;
function setupADSB() {
// 开启 ADS-B 功能,启用推算
sdk.adsb.open({}, {}, true);
// 连接 WebSocket
const wsUrl = "ws://your-server.com/adsb";
ws = new WebSocket(wsUrl);
ws.onopen = () => {
console.log("ADS-B WebSocket 连接成功");
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
// 转换数据格式
const features = data.aircrafts.map((aircraft) => ({
type: "Feature",
geometry: {
type: "Point",
coordinates: [aircraft.lng, aircraft.lat],
},
properties: {
heading: aircraft.heading,
speed: aircraft.speed,
callsign: aircraft.callsign,
aircraft_id: aircraft.id,
time_stamp: aircraft.timestamp,
id: aircraft.id,
},
}));
// 更新飞机数据
sdk.adsb.update(features);
};
ws.onerror = (error) => {
console.error("WebSocket 错误:", error);
};
ws.onclose = () => {
console.log("WebSocket 连接关闭");
};
}
// 页面卸载时关闭连接
window.addEventListener("beforeunload", () => {
if (ws) {
ws.close();
}
if (sdk) {
sdk.adsb.close();
}
});示例3:自定义图层样式
javascript
// 自定义飞机图标样式
const pointLayerConfig = {
layout: {
"icon-image": "custom-aircraft-icon", // 自定义图标
"icon-size": [
"interpolate",
["linear"],
["zoom"],
2, 0.4,
8, 0.6,
12, 0.8,
],
"icon-rotate": ["get", "heading"],
"icon-rotation-alignment": "map",
},
};
// 自定义标签样式
const labelLayerConfig = {
show: true, // 是否显示标签
layout: {
"text-field": ["get", "callsign"],
"text-size": 14,
"text-offset": [0.8, 0],
"text-anchor": "left",
},
paint: {
"text-color": "#000000",
"text-halo-color": "#ffffff",
"text-halo-width": 2,
},
};
// 开启 ADS-B 功能
sdk.adsb.open(pointLayerConfig, labelLayerConfig, true);API 参考
open()
开启 ADS-B 功能。
参数:
pointLayerConfig(可选): 飞机图标图层配置labelLayerConfig(可选): 飞机标签图层配置enableInterpolation(可选): 是否启用位置推算,默认false
示例:
javascript
sdk.adsb.open(
{
layout: {
"icon-size": 0.6,
},
},
{
show: true,
},
true
);update()
更新飞机数据。
参数:
features(Array): 飞机数据数组,每个元素是一个 GeoJSON Feature 对象
Feature 格式:
javascript
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [longitude, latitude],
},
properties: {
heading: number, // 航向(度,0-360)
speed: number, // 速度(节)
time_stamp: string, // 时间戳(ISO 8601 格式)
callsign: string, // 呼号(可选)
aircraft_id: string, // 飞机ID(可选)
icao: string, // ICAO编码(可选)
id: string, // 唯一标识(必需)
label: string, // 显示标签(可选,优先于callsign)
},
}示例:
javascript
sdk.adsb.update([
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [116.3974, 39.9093],
},
properties: {
heading: 90,
speed: 500,
callsign: "CA1234",
id: "aircraft-1",
time_stamp: "2025-01-01T12:00:00Z",
},
},
]);close()
关闭 ADS-B 功能,清理所有图层和数据。
示例:
javascript
sdk.adsb.close();数据推算
启用推算
启用推算功能后,SDK 会根据飞机的速度、航向和时间戳自动推算飞机位置,实现平滑的移动效果。
javascript
// 启用推算
sdk.adsb.open({}, {}, true);推算特性
- 自动推算:每秒自动推算一次飞机位置
- 智能合并:新数据到达时智能合并,保持移动连续性
- 层级控制:缩放级别低于8时自动禁用推算
- 超时停止:超过60秒无新数据时自动停止推算
推算配置
推算功能会根据以下因素自动调整:
- 缩放级别:低于8级时禁用推算
- 视野范围:只推算视野内的飞机
- 数据更新:新数据到达时重新开始推算
性能优化
缩放级别优化
飞机图标大小会根据缩放级别自动调整:
javascript
// 默认配置
"icon-size": [
"interpolate",
["linear"],
["zoom"],
2, 0.4, // 缩放级别2时大小为0.4
8, 0.5, // 缩放级别8时大小为0.5
]注意事项
- 数据格式:确保飞机数据符合 GeoJSON Feature 格式
- 时间戳:启用推算时,
time_stamp字段很重要,用于计算位置 - 唯一标识:每个飞机必须有唯一的
id或aircraft_id - 性能考虑:大量飞机时建议启用推算和视野优化
- 图标资源:使用自定义图标时需要先注册图标
常见问题
Q: 飞机图标不显示?
A: 检查以下几点:
- 是否调用了
open()方法 - 数据格式是否正确
- 飞机是否在当前视野范围内
Q: 飞机图标不旋转?
A: 确保 properties.heading 字段存在且有效(0-360度)
Q: 如何自定义飞机图标?
A: 先注册图标,然后在 open() 时传入配置:
javascript
// 注册图标
sdk.registerIcon("custom-aircraft", iconImage, {
pixelRatio: 1,
});
// 使用自定义图标
sdk.adsb.open({
layout: {
"icon-image": "custom-aircraft",
},
});Q: 推算功能不工作?
A: 检查:
- 是否启用了推算(第三个参数为
true) - 缩放级别是否大于等于8
- 数据中是否包含
time_stamp字段
