AIRMET/SIGMET
AIRMET и SIGMET — официальные авиационные метеопредупреждения об опасных условиях на маршруте. AIRMET (Airmen's Meteorological Information) охватывает умеренные опасные явления; SIGMET (Significant Meteorological advisory) — явления повышенной интенсивности. Этот эндпоинт возвращает все активные предупреждения, зона действия которых пересекается с вашим ограничивающим прямоугольником (bounding box), — используйте его для наложения опасных явлений на маршруте на карты и для предполётных брифингов. Фильтруйте с помощью type=airmet или type=sigmet, если нужен только один класс серьёзности. Пустые результаты (нет активных предупреждений) — нормальная и очень частая ситуация в хорошую погоду.
Запрос
Требования
x-api-key в каждом запросе (прямая подписка). Подробнее →Отправьте GET с географическим ограничивающим прямоугольником и необязательным фильтром по типу.
https://data.skylinkapi.com/v3.1/weather/airsigmet| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
bbox | string | Да | - | Ограничивающий прямоугольник в формате lat1,lon1,lat2,lon2 — сначала юго-западный угол. Пример: 38,-90,45,-80 (коридор над Средним Западом) |
type | string | Нет | все | Фильтр: airmet или sigmet. Не указывайте, чтобы получить оба типа |
Советы по ограничивающему прямоугольнику. Подбирайте размер прямоугольника по маршруту — очень большие bbox могут перегружать обработку на стороне источника данных. Пустой массив reports означает, что ни одно активное предупреждение не пересекается с областью (обычное дело в ясную погоду).
Ответ
{
"bbox": "38.0,-90.0,45.0,-80.0",
"filter_type": "airmet",
"reports": [
{
"raw": "WAUS46 KKCI 151445 WA6S AIRMET SIERRA ...",
"bulletin_type": "AIRMET",
"report_type": "AIRMET",
"country": "US",
"issuer": "KKCI",
"area": "S",
"region": "KZAU",
"start_time": "2025-01-15T14:45:00Z",
"end_time": "2025-01-15T20:45:00Z",
"body": "AIRMET IFR...",
"observation": {
"type": "IFR",
"intensity": null,
"floor": "SFC",
"ceiling": "FL180",
"coords": [
{ "lat": 41.5, "lon": -87.5 },
{ "lat": 42.0, "lon": -86.0 }
],
"movement": null
},
"forecast": null
}
],
"total": 1
}Если ни одно предупреждение не пересекается с bbox, API возвращает "reports": [] и "total": 0.
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
bbox | string | Да | Повтор запрошенного ограничивающего прямоугольника |
reports | array | Да | Подходящие предупреждения (может быть пустым) |
total | integer | Да | Количество элементов в reports |
filter_type | string | null | Да (ключ присутствует всегда) | Применённый фильтр: "airmet", "sigmet" или null без фильтрации |
Сводка
Путь в JSON: reports[]. Гарантированно не равно null только поле raw. Все декодированные поля равны null, если их не удалось извлечь из предупреждения.
| Поле | Тип | Обязательный | Допускает null | Описание |
|---|---|---|---|---|
raw | string | Да | Никогда | Полный текст предупреждения в исходном виде |
bulletin_type | string | null | Да (ключ присутствует всегда) | Да | "AIRMET" или "SIGMET" |
report_type | string | null | Да (ключ присутствует всегда) | Да | Тип предупреждения, например "AIRMET", "SIGMET", "CONVECTIVE SIGMET" |
country | string | null | Да (ключ присутствует всегда) | Да | Код страны-эмитента, например "US" |
issuer | string | null | Да (ключ присутствует всегда) | Да | Идентификатор выпустившего органа, например "KKCI" |
area | string | null | Да (ключ присутствует всегда) | Да | Идентификатор затронутой зоны, например "S" (Sierra) |
region | string | null | Да (ключ присутствует всегда) | Да | Район полётной информации (FIR) или код региона, например "KZAU" |
start_time | string | null | Да (ключ присутствует всегда) | Да | Действует с (UTC, ISO 8601) |
end_time | string | null | Да (ключ присутствует всегда) | Да | Действует до (UTC, ISO 8601) |
body | string | null | Да (ключ присутствует всегда) | Да | Удобочитаемый текст предупреждения |
observation | object | null | Да (ключ присутствует всегда) | Да | Сведения о наблюдаемом опасном явлении — см. Наблюдение и прогноз |
forecast | object | null | Да (ключ присутствует всегда) | Да | Сведения о прогнозируемом опасном явлении — та же структура, что у observation. null, если отсутствует |
Схемы объектов и допустимость null
Каждый ключ объекта Report присутствует всегда — ничего не опускается, если раздел не декодирован. Сами объекты observation и forecast могут быть null, но если они есть, все ключи внутри них присутствуют всегда.
| Ситуация | Что вы получите | Чего не будет |
|---|---|---|
| Полигон опасного явления не декодирован | observation.coords: [] | null, отсутствующий ключ |
| Нет раздела прогноза | forecast: null | отсутствующий ключ |
| Нет раздела наблюдения | observation: null | отсутствующий ключ |
| У предупреждения нет нижней границы высоты | observation.floor: null | отсутствующий ключ или "0" |
| Нет информации о перемещении | observation.movement: null | {}, отсутствующий ключ |
| Нет активных предупреждений | reports: [], total: 0 | null, HTTP-ошибка |
| Запрос без фильтра | filter_type: null | отсутствующий ключ |
Семейства AIRMET
| Семейство | Охватываемые опасные явления |
|---|---|
| SIERRA | Условия IFR, закрытие гор облачностью |
| TANGO | Умеренная турбулентность, сильный приземный ветер |
| ZULU | Умеренное обледенение, высота нулевой изотермы |
SIGMET охватывают опасные явления на маршруте повышенной интенсивности. Конвективные SIGMET выпускаются для сильных гроз, града и торнадо над континентальной частью США.
Схемы наблюдения и прогнозаРазвернуть раздел
Путь в JSON: reports[].observation и reports[].forecast (одинаковая структура). Присутствуют, если декодированы из предупреждения; иначе null.
| Поле | Тип | Обязательный | Допускает null | Описание |
|---|---|---|---|---|
type | string | null | Да (ключ присутствует всегда) | Да | Тип явления — IFR (приборные условия), TURB (турбулентность), ICE (обледенение), VA (вулканический пепел) |
intensity | string | null | Да (ключ присутствует всегда) | Да | Обозначение интенсивности, например "MOD", "SEV" |
floor | string | null | Да (ключ присутствует всегда) | Да | Нижняя граница по высоте, например "SFC", "FL100" |
ceiling | string | null | Да (ключ присутствует всегда) | Да | Верхняя граница по высоте, например "FL180", "FL450" |
coords | array | Да | Никогда | Вершины полигона для отрисовки на карте. [], если граница не декодирована |
coords[].lat | number | Да (для каждого элемента) | Никогда | Широта вершины |
coords[].lon | number | Да (для каждого элемента) | Никогда | Долгота вершины |
movement | object | null | Да (ключ присутствует всегда) | Да | Перемещение зоны предупреждения — строки direction и speed, если указаны; null, если зона стационарна или данные не сообщаются |
Клиентские типы
"""AIRMET/SIGMET response types - matches airsigmet field tables."""from dataclasses import dataclass, field@dataclassclass AirSigmetCoord: lat: float lon: float@dataclassclass AirSigmetObservation: type: str | None = None intensity: str | None = None floor: str | None = None ceiling: str | None = None coords: list[AirSigmetCoord] = field(default_factory=list) movement: dict | None = None@dataclassclass AirSigmetReport: raw: str bulletin_type: str | None = None report_type: str | None = None start_time: str | None = None end_time: str | None = None body: str | None = None observation: AirSigmetObservation | None = None forecast: AirSigmetObservation | None = None@dataclassclass AirSigmetResponse: bbox: str reports: list[AirSigmetReport] total: int filter_type: str | None = NoneИнтеграция
Запросите активные предупреждения для bbox маршрута и постройте наложения полигонов.
Пример запрашивает bbox коридора, кэширует результат на 15 минут (предупреждения обновляются по фиксированному графику) и извлекает полигоны предупреждений со сроками действия для отрисовки на карте. Пустые результаты ожидаемы в условиях VFR — отображайте «нет активных предупреждений», а не ошибку.
import osimport timeimport requestsHEADERS = { "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3.1"CACHE: dict[str, tuple[dict, float]] = {}AIRSIG_TTL = 900 # 15 mindef fetch_airsigmets(bbox: str, advisory_type: str | None = None) -> dict: cache_key = f"airsig:{bbox}:{advisory_type or 'all'}" cached = CACHE.get(cache_key) if cached and time.time() < cached[1]: return cached[0] params: dict[str, str] = {"bbox": bbox} if advisory_type: params["type"] = advisory_type r = requests.get( f"{BASE}/weather/airsigmet", headers=HEADERS, params=params, timeout=(10, 25), ) r.raise_for_status() data = r.json() CACHE[cache_key] = (data, time.time() + AIRSIG_TTL) return datadef active_polygons(bbox: str) -> list[list[tuple[float, float]]]: """Return coord rings for map overlays (may be empty).""" payload = fetch_airsigmets(bbox, advisory_type="airmet") rings: list[list[tuple[float, float]]] = [] for report in payload.get("reports", []): obs = report.get("observation") or {} coords = obs.get("coords") or [] if coords: rings.append([(c["lat"], c["lon"]) for c in coords]) return ringsif __name__ == "__main__": import json bbox = "-74.5,40.3,-73.5,41.0" payload = fetch_airsigmets(bbox, "airmet") print(json.dumps(payload, indent=2, default=str)[:3000])Примечания по реализации
Пустой результат — это нормально. Для маршрутов в хорошую погоду часто возвращается total: 0. Слой карты может скрывать наложения, когда данных нет.
Сроки действия. Используйте start_time и end_time, чтобы снимать полигоны с отображения на стороне клиента. Не показывайте предупреждения после end_time, даже если они закэшированы. Если end_time равно null, считайте предупреждение активным до следующего опроса.
Отрисовка полигонов. Рисуйте observation.coords (или forecast.coords) как замкнутые полигоны. Если coords равно [], показывайте текст body в виде списка вместо наложения на карту. Всегда замыкайте контур полигона (последняя вершина → первая вершина) перед передачей в картографическую библиотеку.
Фильтруйте с умом. Интерфейсы предполётного брифинга часто запрашивают type=airmet для диспетчерской службы и type=sigmet для наложений с явлениями повышенной интенсивности. Не указывайте type, если нужна полная картина.
Большие bbox. Подбирайте область запроса по маршруту с небольшим запасом (примерно 1–2° по широте/долготе) и при необходимости разбивайте длинные маршруты на сегменты.
Ответы с ошибками
Здесь описаны только ошибки, специфичные для эндпоинта. Об ошибках аутентификации, валидации, ограничениях частоты запросов и ошибках сервера см. Обработка ошибок.
400 — некорректный формат bbox
{
"detail": "Invalid bounding box format. Expected 'lat1,lon1,lat2,lon2'"
}503 — источник данных недоступен
Возвращается, когда поток предупреждений временно недоступен или bbox слишком велик для обработки на стороне источника данных. Повторите запрос с экспоненциальной задержкой (backoff) и меньшим bbox.
{
"detail": "Upstream AIRMET/SIGMET service unavailable"
}Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Query Parameters
Bounding box as 'lat1,lon1,lat2,lon2' (SW corner → NE corner)
Filter by type: 'airmet' or 'sigmet'
Response Body
application/json
application/json
curl -X GET "https://data.skylinkapi.com/v3.1/weather/airsigmet?bbox=string"{
"bbox": "38,-90,45,-80",
"reports": [
{
"raw": "WAUS46 KKCI 151445 WA6S AIRMET SIERRA ...",
"bulletin_type": "AIRMET",
"report_type": "AIRMET",
"area": "S",
"body": "AIRMET IFR...",
"observation": {
"type": "IFR",
"floor": "SFC",
"ceiling": "FL180"
}
}
],
"total": 1
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string",
"input": null,
"ctx": {}
}
]
}См. также: Раздел «Погода» · PIREP · METAR · Сценарий: AIRMET на маршруте
PIREP (донесения пилотов)
Донесения пилотов (PIREP) в ограничивающем прямоугольнике: турбулентность, обледенение и погода в полёте, переданные пилотами за заданный период.
В аэропорту
Примеры интеграции METAR и TAF на уровне аэропорта — категории полётных условий, высота по плотности, прогнозы на вылет и запасные аэропорты.