Skip to content

航行通告(NOTAM)

NOTAM 是航行通告系统,用于发布影响飞行安全的重要信息。SDK 提供了完整的 NOTAM 功能支持,包括航线通告、区域通告的显示和详情查看。

注:如需要 C类通告,无法通过互联网对接,需要通过专线形式对接。

功能特性

  • 航线通告:显示 NOTAM 航线通告(线要素)
  • 区域通告:显示 NOTAM 区域通告(面要素)
  • 交互支持:支持悬停高亮和点击查看详情
  • 数据刷新:支持手动刷新和自动更新
  • 样式自定义:支持自定义图层样式

基础用法

开启 NOTAM 功能

javascript
// 方式1:使用内置数据源
sdk.notam.open(true);

// 方式2:使用自定义数据源
sdk.notam.open(false);

获取并显示 NOTAM 数据

javascript
// 开启 NOTAM 图层
sdk.notam.open(false);

// 获取 NOTAM 数据
sdk.notam.getNotamData({
  pageNo: 1,
  pageSize: 100,
  onlyGeojson: true,
  typeC: true,
}).then((features) => {
  // 更新地图显示
  sdk.notam.update(features);
  
  // 开启详情弹窗(点击通告查看详情)
  sdk.notam.openNotamDetail();
});

关闭 NOTAM 功能

javascript
sdk.notam.close();

完整示例

示例1:基础使用

javascript
let sdk;

async function initMap() {
  sdk = new navMap.MapSDK({
    container: "map",
    center: [116.39, 39.9],
    zoom: 10,
  });

  sdk.on("loadComplete", () => {
    setupNOTAM();
  });
}

async function setupNOTAM() {
  // 开启 NOTAM 图层
  sdk.notam.open(false);

  // 获取 NOTAM 数据
  const features = await sdk.notam.getNotamData({
    pageNo: 1,
    pageSize: 100,
    onlyGeojson: true,
    typeC: true,
    isInternational: true,
  });

  // 更新地图显示
  sdk.notam.update(features);

  // 开启详情弹窗
  sdk.notam.openNotamDetail();
}

initMap();

示例2:自定义样式

javascript
// 自定义线图层样式(航线通告)
const lineLayerConfig = {
  paint: {
    "line-color": "#ff0000",
    "line-width": [
      "interpolate",
      ["linear"],
      ["zoom"],
      2, 1,
      4, 2,
      6, 4,
    ],
    "line-opacity": [
      "case",
      ["boolean", ["feature-state", "hover"], false],
      0.8,
      0.6,
    ],
  },
};

// 自定义面图层样式(区域通告)
const fillLayerConfig = {
  paint: {
    "fill-color": "#ff0000",
    "fill-outline-color": "rgba(255, 0, 0, 0.5)",
    "fill-opacity": [
      "case",
      ["boolean", ["feature-state", "hover"], false],
      0.5,
      0.3,
    ],
  },
};

// 开启 NOTAM 功能
sdk.notam.open(false, lineLayerConfig, fillLayerConfig);

示例3:使用图案填充

javascript
// 使用图案填充区域通告
sdk.notam.open(false, {}, {}, true);

示例4:定时刷新

javascript
// 开启 NOTAM
sdk.notam.open(false);

// 初始加载
loadNOTAMData();

// 每5分钟刷新一次
setInterval(() => {
  loadNOTAMData();
}, 5 * 60 * 1000);

async function loadNOTAMData() {
  const features = await sdk.notam.getNotamData({
    pageNo: 1,
    pageSize: 100,
  });
  sdk.notam.update(features);
}

示例5:使用 refresh 方法

javascript
// 开启 NOTAM
sdk.notam.open(false);

// 初始加载(使用默认参数)
sdk.notam.refresh();

// 定时刷新
setInterval(() => {
  sdk.notam.refresh();
}, 5 * 60 * 1000);

示例6:自定义悬停效果

javascript
sdk.notam.open(false);

// 自定义悬停回调
sdk.notam.hover((e) => {
  const feature = e.features[0];
  console.log("悬停的通告:", feature.properties);
  
  // 可以显示自定义提示
  showCustomTooltip(feature);
});

API 参考

open()

开启 NOTAM 功能。

参数:

  • builtin (Boolean): 是否使用内置数据源
  • lineLayerConfig (可选): 线图层配置(航线通告)
  • fillLayerConfig (可选): 面图层配置(区域通告)
  • isPattern (可选): 是否使用图案填充,默认 false

示例:

javascript
// 基础开启
sdk.notam.open(true);

// 自定义样式
sdk.notam.open(false, {
  paint: {
    "line-color": "#ff0000",
    "line-width": 2,
  },
}, {
  paint: {
    "fill-color": "#ff0000",
    "fill-opacity": 0.3,
  },
});

getNotamData()

获取 NOTAM 数据。

参数:

javascript
{
  pageNo: number,           // 页码,默认 1
  pageSize: number,         // 每页数量,默认 100
  onlyGeojson: boolean,     // 是否只返回 GeoJSON,默认 true
  typeC: boolean,           // 是否包含 C 类通告,默认 true
  notamOffset: string,      // 偏移量,默认 "false"
  isInternational: boolean, // 是否国际通告,默认 true
  isCompanyVersion: boolean, // 是否公司版本,默认 false
}

返回:

Promise<Array> - GeoJSON Feature 数组

示例:

javascript
const features = await sdk.notam.getNotamData({
  pageNo: 1,
  pageSize: 50,
  onlyGeojson: true,
  typeC: true,
});

update()

更新 NOTAM 数据到地图。

参数:

  • features (Array): GeoJSON Feature 数组

示例:

javascript
const features = await sdk.notam.getNotamData();
sdk.notam.update(features);

openNotamDetail()

开启通告详情弹窗。点击通告时会自动弹出详细信息。

示例:

javascript
sdk.notam.openNotamDetail();

refresh()

使用默认参数刷新 NOTAM 数据。

示例:

javascript
sdk.notam.refresh();

hover()

设置悬停回调函数。

参数:

  • callback (Function): 悬停时的回调函数

示例:

javascript
sdk.notam.hover((e) => {
  const feature = e.features[0];
  console.log("通告信息:", feature.properties);
});

close()

关闭 NOTAM 功能,清理所有图层。

示例:

javascript
sdk.notam.close();

数据格式

NOTAM Feature 格式

javascript
{
  type: "Feature",
  geometry: {
    type: "LineString" | "MultiLineString" | "Polygon" | "MultiPolygon",
    coordinates: [...],
  },
  properties: {
    notamSeries: string,    // 通告系列
    notamNoPart1: string,   // 通告编号第一部分
    notamNoPart2: string,   // 通告编号第二部分
    nof: string,            // NOF 标识
    itemA: string,          // A项(位置)
    itemB: string,          // B项(生效时间)
    itemC: string,          // C项(失效时间)
    itemD: string,          // D项(内容)
    itemE: string,          // E项(补充信息)
    // ... 更多属性
  },
}

默认参数

NOTAM 管理器提供了默认参数配置:

javascript
sdk.notam.defaultParams = {
  pageNo: 1,
  pageSize: 100,
  onlyGeojson: true,
  typeC: true,
  notamOffset: "false",
  isInternational: true,
  isCompanyVersion: false,
};

// 可以修改默认参数
sdk.notam.defaultParams.pageSize = 200;
sdk.notam.defaultParams.isInternational = false;

详情弹窗

开启 openNotamDetail() 后,点击通告会自动显示详情弹窗,包含:

  • A项:位置信息
  • B项:生效时间
  • C项:失效时间
  • D项:通告内容
  • E项:补充信息
  • 通告代码:NOTAM 代码

样式配置

线图层样式(航线通告)

javascript
const lineLayerConfig = {
  paint: {
    "line-color": "#ff0000",      // 线条颜色
    "line-width": 2,              // 线条宽度
    "line-opacity": 0.6,          // 透明度
    "line-dasharray": [2, 2],     // 虚线样式(可选)
  },
};

面图层样式(区域通告)

javascript
const fillLayerConfig = {
  paint: {
    "fill-color": "#ff0000",           // 填充颜色
    "fill-outline-color": "#ff0000",   // 轮廓颜色
    "fill-opacity": 0.3,               // 填充透明度
  },
};

悬停效果

NOTAM 支持基于 feature-state 的悬停效果:

javascript
{
  paint: {
    "line-opacity": [
      "case",
      ["boolean", ["feature-state", "hover"], false],
      0.8,  // 悬停时透明度
      0.6,  // 正常透明度
    ],
  },
}

注意事项

  1. 数据源:使用内置数据源时,确保网络连接正常
  2. 数据格式:确保返回的数据是有效的 GeoJSON 格式
  3. 性能考虑:大量通告时考虑分页加载
  4. 图层顺序:NOTAM 图层默认添加在航线图层之前
  5. 详情查询:详情弹窗需要额外的 API 调用,注意网络延迟

常见问题

Q: NOTAM 数据不显示?

A: 检查以下几点:

  • 是否调用了 open() 方法
  • 是否调用了 update() 方法更新数据
  • 数据格式是否正确
  • 网络请求是否成功

Q: 如何自定义详情弹窗样式?

A: 详情弹窗使用 Popup 组件,可以通过 CSS 自定义:

css
.maplibregl-popup-content .notam-popup {
  /* 自定义样式 */
}

Q: 如何过滤特定类型的通告?

A: 在 getNotamData() 时设置参数:

javascript
const features = await sdk.notam.getNotamData({
  typeC: false, // 不包含 C 类通告
  isInternational: false, // 只显示国内通告
});

Q: 如何实现通告搜索?

A: 可以通过 API 参数实现:

javascript
// 使用 API 直接查询
const response = await sdk.notam.api.notam_detail({
  // 搜索参数
});