← Карта климатологииверсия 3.2

Встраивание Карты климатологии в своё приложение

Карту можно открыть внутри <iframe> в своём веб-приложении и использовать как выбор населённого пункта. Как только пользователь выбирает город, ваше окно получает его климатические параметры сообщением postMessage. Регистрация, ключи и серверная часть не нужны.

1. Встроить iframe

<iframe
  src="https://картаклиматологии.рф/?app=myapp"
  width="100%"
  height="640"
  style="border: 1px solid #ccc; border-radius: 8px"
  title="Карта климатологии">
</iframe>

Карта сама определяет, что открыта во фрейме (window.self !== window.top) — специальный параметр для этого не нужен. Необязательный параметр ?app= задаёт имя вашего приложения: оно подставляется в подсказку над панелью («Выберите город — данные передадутся в myapp»). Если параметр не передан, будет нейтральный текст «…передадутся в приложение».

Карта доступна по двум адресам — они равнозначны, отдают одно и то же приложение и одинаковые данные:

АдресOrigin для проверки
картаклиматологии.рфhttps://xn--80aaamxcajckck1abv6ag.xn--p1ai
map.teploov.ruhttps://map.teploov.ru

Встраивайте тот, который вам удобнее, но в allowlist добавьте оба, если адрес iframe может измениться. Обратите внимание: домен кириллический, и в event.origin браузер отдаёт его в punycode — https://xn--80aaamxcajckck1abv6ag.xn--p1ai, а не https://картаклиматологии.рф. Сравнение со строкой в кириллице не сработает.

2. Принять сообщение

// Кириллический домен в event.origin приходит в punycode — см. раздел 1
const ALLOWED_ORIGINS = [
  'https://xn--80aaamxcajckck1abv6ag.xn--p1ai', // картаклиматологии.рф
  'https://map.teploov.ru',
];

window.addEventListener('message', (event) => {
  // Обязательно проверяйте источник сообщения
  if (!ALLOWED_ORIGINS.includes(event.origin)) return;

  const msg = event.data;
  if (!msg || msg.type !== 'climamap:selection') return;
  if (msg.schemaVersion !== 1) return;

  console.log(msg.city.name);              // "Москва"
  console.log(msg.climate.temp_cold_098);  // -31
  console.log(msg.humidityZone.zoneType);  // 2
});
Безопасность. Сообщение отправляется с targetOrigin: '*', поэтому проверка event.origin на вашей стороне обязательна. Не доверяйте сообщениям с других источников и валидируйте schemaVersion.

3. Формат сообщения

Тип climamap:selection, текущая версия схемы — 1.

{
  "type": "climamap:selection",
  "schemaVersion": 1,
  "dataset": { "id": "sp131_2025", "name": "СП 131.13330.2025 (Актуальный)" },
  "point": { "lat": 55.753215, "lon": 37.622504 },
  "city": {
    "name": "Москва",
    "region": "Московская область",
    "coordinates": [55.753215, 37.622504],
    "isNearest": false,
    "distanceKm": null
  },
  "climate": {
    "temp_cold_098": -31,
    "temp_cold_092": -28,
    "wind_cold_direction": "З"
    /* ... остальные параметры выбранного СП ... */
  },
  "humidityZone": { "zoneType": 2, "zoneName": "2 зона - Нормальная" },
  "radiation": null
}
ПолеОписание
schemaVersion Версия схемы. Сейчас всегда 1. Новые поля могут добавляться без смены версии — неизвестные поля игнорируйте.
dataset Нормативный документ, из которого взяты значения: sp131_2025 (СП 131.13330.2025) или sp131_2020 (СП 131.13330.2020). Пользователь переключает его в панели карты.
point Фактически выбранная точка. Совпадает с координатами города, кроме случая поиска пункта, которого нет в нормах — тогда это координаты найденного адреса.
city Населённый пункт из справочника, чьи климатические данные переданы.
city.isNearest true, если пункт отсутствует в нормах и климат взят по ближайшему городу справочника. В этом случае distanceKm — расстояние до него в километрах.
climate Все климатические параметры пункта — 31 ключ. Полный справочник с единицами измерения и правилами обработки значений — в разделе 4.
humidityZone Зона влажности по СП 50.13330. zoneType: 1 — влажная, 2 — нормальная, 3 — сухая, 0 — не определена (см. примечание ниже).
radiation Зарезервировано под датасет солнечной радиации. Сейчас всегда null.
О зоне влажности. Зона рассчитывается по координатам только при включённом слое «Зоны влажности» на карте. Если пользователь его не включал, придёт { "zoneType": 0, "zoneName": null }. Пользователь также может выбрать зону вручную — её значение попадёт в это же поле.

4. Справочник ключей climate

Ключи одинаковы для обеих редакций СП — их всегда 31. Названия ключей стабильны и являются частью контракта: переименовываться они не будут. Значения передаются «как в норме», без единиц измерения в самой строке — единица берётся из таблицы ниже.

Холодный период (19 параметров)

КлючЕд.Параметр по СП
temp_cold_098°СТемпература воздуха наиболее холодных суток, обеспеченностью 0,98
temp_cold_092°СТемпература воздуха наиболее холодных суток, обеспеченностью 0,92
temp_cold_5day_098°СТемпература воздуха наиболее холодной пятидневки, обеспеченностью 0,98
temp_cold_5day_092°СТемпература воздуха наиболее холодной пятидневки, обеспеченностью 0,92 (расчётная температура наружного воздуха для теплотехники)
temp_cold_094°СТемпература воздуха, обеспеченностью 0,94
temp_cold_abs_min°САбсолютная минимальная температура воздуха
temp_cold_amp_month°ССредняя суточная амплитуда температуры воздуха наиболее холодного месяца
period_duration_cold_0сутПродолжительность периода со средней суточной температурой воздуха ≤ 0 °С
temp_cold_avg_0°ССредняя температура воздуха периода со средней суточной температурой ≤ 0 °С
period_duration_cold_8сутПродолжительность периода со средней суточной температурой воздуха ≤ 8 °С (отопительный период, для ГСОП)
temp_cold_avg_8°ССредняя температура воздуха периода со средней суточной температурой ≤ 8 °С (для ГСОП)
period_duration_cold_10сутПродолжительность периода со средней суточной температурой воздуха ≤ 10 °С
temp_cold_avg_10°ССредняя температура воздуха периода со средней суточной температурой ≤ 10 °С
humidity_cold_avg_month%Средняя месячная относительная влажность воздуха наиболее холодного месяца
humidity_cold_avg_month_15h%Средняя месячная относительная влажность воздуха в 15 ч наиболее холодного месяца
precip_coldммКоличество осадков за ноябрь – март
wind_cold_directionПреобладающее направление ветра за декабрь – февраль (строка, см. ниже)
wind_cold_speed_max_janм/сМаксимальная из средних скоростей ветра по румбам за январь
wind_cold_speed_avg_8м/сСредняя скорость ветра за период со средней суточной температурой ≤ 8 °С

Тёплый период (11 параметров)

КлючЕд.Параметр по СП
temp_warm_095°СТемпература воздуха, обеспеченностью 0,95 (параметры А)
temp_warm_098°СТемпература воздуха, обеспеченностью 0,98 (параметры Б)
temp_warm_avg_max_month°ССредняя максимальная температура воздуха наиболее тёплого месяца
temp_warm_abs_max°САбсолютная максимальная температура воздуха
temp_warm_avg_amp_month°ССредняя суточная амплитуда температуры воздуха наиболее тёплого месяца
humidity_warm_avg_month%Средняя месячная относительная влажность воздуха наиболее тёплого месяца
humidity_warm_avg_month_15h%Средняя месячная относительная влажность воздуха в 15 ч наиболее тёплого месяца
precip_warmммКоличество осадков за апрель – октябрь
precip_warm_max_dayммСуточный максимум осадков
wind_warm_directionПреобладающее направление ветра за июнь – август (строка, см. ниже)
wind_warm_min_avgм/сМинимальная из средних скоростей ветра по румбам за июль

Общий параметр

КлючЕд.Параметр по СП
pressureгПаБарометрическое давление

5. Как обрабатывать значения climate

Значения передаются ровно так, как напечатаны в таблицах СП. Обе базы приведены к единому виду, поэтому особенностей осталось всего две — но их нужно учесть обязательно.

5.1. «Нет данных» — это строка "-"

В таблицах СП отсутствующие значения помечены прочерком. В обеих базах он передаётся одинаково — строкой "-", в том числе в числовых полях. Ключи при этом всегда присутствуют: у каждого пункта передаются все 31.

КлючПунктов с прочерком, СП 2025СП 2020
temp_cold_avg_087
wind_cold_speed_max_jan53
wind_warm_min_avg23
pressure2
precip_warm_max_day11
wind_cold_speed_avg_84

Пример: у Сочи, Ялты и Феодосии нет периода со средней суточной температурой ≤ 0 °С, поэтому temp_cold_avg_0 равно "-".

Не приводите значение к числу без проверки. parseFloat("-") вернёт NaN, и он способен разойтись по всему расчёту незамеченным. Используйте нормализатор из 5.3.

5.2. Направление ветра — строка, а не румб

wind_cold_direction и wind_warm_direction содержат один или несколько равнозначных румбов, если в норме указано несколько. Разделитель — запятая, одинаково в обеих редакциях: "Ю", "СЗ, ЮВ", "С, В, СЗ".

Румбы кириллические: С, СВ, В, ЮВ, Ю, ЮЗ, З, СЗ. Не разбирайте это поле как перечисление с фиксированным набором значений — показывайте строкой; если нужен разбор, режьте по запятой и обрезайте пробелы.

Одно исключение. У пункта Элиста в СП 131.13330.2020 преобладающее направление ветра за июнь – август записано в самом документе как "0,0". Значение передаётся как есть — так же, как напечатано в норме. Карта отображает его как северное ("С", азимут 0°); тот же разбор делает нормализатор ниже. Другой трактовки у этого значения нет.

5.3. Готовый нормализатор

// Число или null — годится для любого числового ключа climate
function num(climate, key) {
  const v = climate?.[key];
  if (v === undefined || v === null || v === '-') return null;
  const n = typeof v === 'number' ? v : parseFloat(String(v).replace(',', '.'));
  return Number.isFinite(n) ? n : null;
}

// Направление ветра: массив румбов
function windDirection(climate, key) {
  const v = climate?.[key];
  if (typeof v !== 'string' || v === '-') return [];
  if (v.trim() === '0,0') return ['С'];   // Элиста, СП 2020 — см. 5.2
  return v.split(',').map(s => s.trim()).filter(Boolean);
}

num(msg.climate, 'temp_cold_5day_092');            // -28
num(msg.climate, 'temp_cold_avg_0');               // null, если в норме прочерк
windDirection(msg.climate, 'wind_cold_direction'); // ["СЗ", "ЮВ"]
Проверяйте на null перед расчётом. Если параметр, нужный вашей методике, отсутствует у выбранного пункта — корректнее показать это пользователю и предложить другой пункт, чем подставить значение по умолчанию.

6. Когда приходит сообщение

Каждый выбор перезаписывает предыдущий: храните у себя последнее полученное сообщение.

7. Совместимость

Параллельно с climamap:selection отправляется устаревшее сообщение KAVRIS_CLIMATE_SELECTED — оно сохранено для ранее подключённых приложений. В новых интеграциях используйте только climamap:selection, а сообщения других типов отфильтровывайте по полю type.

8. Вопросы и подключение

Формат открытый: подключить карту может любой желающий, согласование не требуется. Если нужны дополнительные поля или у вас есть замечания к контракту — напишите через раздел «Контакты» на главной странице.