Карту можно открыть внутри <iframe> в своём веб-приложении и использовать как выбор
населённого пункта. Как только пользователь выбирает город, ваше окно получает его климатические
параметры сообщением postMessage. Регистрация, ключи и серверная часть не нужны.
<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.ru | https://map.teploov.ru |
Встраивайте тот, который вам удобнее, но в allowlist добавьте оба, если
адрес iframe может измениться. Обратите внимание: домен кириллический, и в
event.origin браузер отдаёт его в punycode —
https://xn--80aaamxcajckck1abv6ag.xn--p1ai, а не https://картаклиматологии.рф.
Сравнение со строкой в кириллице не сработает.
// Кириллический домен в 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.
Тип 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 }. Пользователь также может выбрать зону вручную —
её значение попадёт в это же поле.
climateКлючи одинаковы для обеих редакций СП — их всегда 31. Названия ключей стабильны и являются частью контракта: переименовываться они не будут. Значения передаются «как в норме», без единиц измерения в самой строке — единица берётся из таблицы ниже.
| Ключ | Ед. | Параметр по СП |
|---|---|---|
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 °С |
| Ключ | Ед. | Параметр по СП |
|---|---|---|
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 | гПа | Барометрическое давление |
climateЗначения передаются ровно так, как напечатаны в таблицах СП. Обе базы приведены к единому виду, поэтому особенностей осталось всего две — но их нужно учесть обязательно.
"-"
В таблицах СП отсутствующие значения помечены прочерком. В обеих базах он передаётся
одинаково — строкой "-", в том числе в числовых полях.
Ключи при этом всегда присутствуют: у каждого пункта передаются все 31.
| Ключ | Пунктов с прочерком, СП 2025 | СП 2020 |
|---|---|---|
temp_cold_avg_0 | 8 | 7 |
wind_cold_speed_max_jan | 5 | 3 |
wind_warm_min_avg | 2 | 3 |
pressure | 2 | — |
precip_warm_max_day | 1 | 1 |
wind_cold_speed_avg_8 | — | 4 |
Пример: у Сочи, Ялты и Феодосии нет периода со средней суточной температурой ≤ 0 °С,
поэтому temp_cold_avg_0 равно "-".
parseFloat("-")
вернёт NaN, и он способен разойтись по всему расчёту незамеченным.
Используйте нормализатор из 5.3.
wind_cold_direction и wind_warm_direction содержат один или
несколько равнозначных румбов, если в норме указано несколько.
Разделитель — запятая, одинаково в обеих редакциях:
"Ю", "СЗ, ЮВ", "С, В, СЗ".
Румбы кириллические: С, СВ, В, ЮВ,
Ю, ЮЗ, З, СЗ. Не разбирайте это поле
как перечисление с фиксированным набором значений — показывайте строкой; если нужен
разбор, режьте по запятой и обрезайте пробелы.
"0,0". Значение передаётся как есть — так же, как напечатано в норме.
Карта отображает его как северное ("С", азимут 0°); тот же разбор делает
нормализатор ниже. Другой трактовки у этого значения нет.
// Число или 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 перед расчётом. Если параметр, нужный вашей
методике, отсутствует у выбранного пункта — корректнее показать это пользователю и предложить
другой пункт, чем подставить значение по умолчанию.
isNearest: true.Каждый выбор перезаписывает предыдущий: храните у себя последнее полученное сообщение.
Параллельно с climamap:selection отправляется устаревшее сообщение
KAVRIS_CLIMATE_SELECTED — оно сохранено для ранее подключённых приложений.
В новых интеграциях используйте только climamap:selection, а сообщения других
типов отфильтровывайте по полю type.
Формат открытый: подключить карту может любой желающий, согласование не требуется. Если нужны дополнительные поля или у вас есть замечания к контракту — напишите через раздел «Контакты» на главной странице.