Files
Learn_System/backend/src/db/seed-red-book.js
T
Maxim Dolgolyov be4d43105e LearnSpace: full-stack educational whiteboard platform
Node.js/Express backend + vanilla JS frontend.
Features: real-time collaborative whiteboard (SSE), multi-page support,
LaTeX formulas, shapes/connectors, coordinate systems, number lines,
compass, zoom/pan, Catmull-Rom pencil smoothing, ruler/protractor with
rotation & resize controls, minimap navigation overlay, auto-measurements,
multi-page thumbnails sidebar, PNG export, page templates.
Student/teacher workflows: classes, assignments, library, dashboard.
Mobile responsive. SQLite (better-sqlite3).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 10:10:37 +03:00

808 lines
69 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Seed: Красная книга Республики Беларусь
* 80 видов, 8 групп, пищевая сеть, популяционные тренды
* Запуск: node src/db/seed-red-book.js (из папки backend/)
*/
require('./migrate');
const db = require('./db');
/* ══════════════════════════════════════════════════════════════════════════
GUARD — пропустить если уже засеяно
══════════════════════════════════════════════════════════════════════════ */
const already = db.prepare("SELECT COUNT(*) as n FROM rb_species").get();
if (already.n > 0) {
console.log(`Красная книга: уже засеяно ${already.n} видов, пропускаем.`);
process.exit(0);
}
/* ══════════════════════════════════════════════════════════════════════════
ГРУППЫ
══════════════════════════════════════════════════════════════════════════ */
const insGroup = db.prepare('INSERT INTO rb_groups (name_ru, name_lat, icon, color) VALUES (?,?,?,?)');
const groups = {};
[
['Птицы', 'Aves', '🦅', '#0369a1'],
['Млекопитающие', 'Mammalia', '🦌', '#92400e'],
['Растения', 'Plantae', '🌿', '#166534'],
['Насекомые', 'Insecta', '🦋', '#b45309'],
['Рыбы', 'Pisces', '🐟', '#0e7490'],
['Рептилии и амфибии','Reptilia/Amphibia','🦎','#4d7c0f'],
['Грибы', 'Fungi', '🍄', '#7c3aed'],
['Мхи и лишайники', 'Bryophyta', '🌱', '#065f46'],
].forEach(([name_ru, name_lat, icon, color]) => {
const id = insGroup.run(name_ru, name_lat, icon, color).lastInsertRowid;
groups[name_ru] = id;
});
console.log('✓ Группы');
/* ══════════════════════════════════════════════════════════════════════════
БИОМЫ
══════════════════════════════════════════════════════════════════════════ */
const insHabitat = db.prepare('INSERT INTO rb_habitats (name, type, description, sound_file) VALUES (?,?,?,?)');
const habitats = {};
[
['Широколиственный лес', 'forest', 'Дубравы и грабово-дубовые леса Полесья и центральной Беларуси', 'forest.mp3'],
['Хвойный лес', 'conifer', 'Сосновые и еловые боры, тайга северной Беларуси', 'conifer.mp3'],
['Болото', 'wetland', 'Верховые и низинные болота, крупнейшие в Европе', 'wetland.mp3'],
['Река и озеро', 'river', 'Пресноводные водоёмы: Припять, Нёман, Западная Двина', 'river.mp3'],
['Луг и поле', 'meadow', 'Заливные и суходольные луга, агроландшафты', 'meadow.mp3'],
].forEach(([name, type, description, sound_file]) => {
const id = insHabitat.run(name, type, description, sound_file).lastInsertRowid;
habitats[name] = id;
});
console.log('✓ Биомы');
/* ══════════════════════════════════════════════════════════════════════════
ВИДЫ
══════════════════════════════════════════════════════════════════════════ */
const insSp = db.prepare(`
INSERT INTO rb_species
(group_id, habitat_id, name_ru, name_be, name_lat, category, by_category,
description, interesting_fact, threats, conservation, where_to_see,
photo_url, model_type, population_trend, biomass_kg)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
`);
const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)');
const insPop = db.prepare('INSERT INTO rb_population_data (species_id, year, count_estimate, source) VALUES (?,?,?,?)');
function sp(data) {
const id = insSp.run(
groups[data.group], habitats[data.habitat] || null,
data.name_ru, data.name_be || '', data.name_lat || '',
data.category, data.by_category || 'III',
data.description || '', data.fact || '',
JSON.stringify(data.threats || []),
data.conservation || '', data.where_to_see || '',
data.photo || '', data.model || 'silhouette',
JSON.stringify(data.trend || []),
data.biomass || 0
).lastInsertRowid;
(data.regions || []).forEach(r => insReg.run(id, r));
(data.popdata || []).forEach(([year, count, src]) => insPop.run(id, year, count, src || 'КК РБ'));
return id;
}
const ids = {};
db.exec('BEGIN');
try { // species block
/* ── ПТИЦЫ ─────────────────────────────────────────────────────────────── */
ids.orlan = sp({
group: 'Птицы', habitat: 'Река и озеро',
name_ru: 'Орлан-белохвост', name_be: 'Арлан-белахвост', name_lat: 'Haliaeetus albicilla',
category: 'NT', by_category: 'III',
description: 'Крупнейший хищник среди белорусских орлиных. Размах крыльев достигает 240 см. Гнездится у крупных водоёмов, охотится на рыбу и уток. Пара занимает одно гнездо десятилетиями, достраивая его каждый год — масса гнезда может превышать тонну.',
fact: 'Орлан развивает скорость пикирования до 100 км/ч. Гнездо одной пары в Беловежской пуще весило 600 кг.',
threats: ['Беспокойство у гнёзд', 'Отравление свинцом из охотничьей дроби', 'Вырубка леса у водоёмов'],
conservation: 'Охраняется в заповедниках. Программа мониторинга гнёзд. Запрет охоты.',
where_to_see: 'НП «Припятский», НП «Браславские озёра», Беловежская пуща',
model: 'procedural', biomass: 5.5,
regions: ['brest','gomel','vitebsk','grodno','minsk','mogilev'],
popdata: [[1990,150,'КК РБ 1993'],[2000,200,'КК РБ 2004'],[2010,280,'КК РБ 2015'],[2024,350,'Мониторинг 2024']],
trend: [{year:1990,count:150},{year:2000,count:200},{year:2010,count:280},{year:2024,count:350}],
});
ids.chorny_aist = sp({
group: 'Птицы', habitat: 'Широколиственный лес',
name_ru: 'Чёрный аист', name_be: 'Чорны бусел', name_lat: 'Ciconia nigra',
category: 'NT', by_category: 'III',
description: 'В отличие от белого аиста, чёрный предпочитает глухие леса с ручьями и реками. Оперение с зелёным и пурпурным металлическим блеском. Зимует в Африке южнее Сахары. Чрезвычайно осторожен — при беспокойстве бросает гнездо.',
fact: 'Чёрный аист преодолевает до 10 000 км во время миграции. В Беларуси гнездится около 900 пар.',
threats: ['Вырубка старовозрастных лесов', 'Осушение болот', 'Беспокойство у гнёзд'],
conservation: 'Охраняемые зоны вокруг гнёзд радиусом 200 м. Сохранение старовозрастных деревьев.',
where_to_see: 'Беловежская пуща, НП «Припятский», ПЗ «Налибокский»',
model: 'procedural', biomass: 3.0,
regions: ['brest','gomel','grodno','minsk','vitebsk'],
popdata: [[1990,600,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,850,'КК РБ 2015'],[2024,920,'Мониторинг 2024']],
trend: [{year:1990,count:600},{year:2005,count:800},{year:2015,count:850},{year:2024,count:920}],
});
ids.skopa = sp({
group: 'Птицы', habitat: 'Река и озеро',
name_ru: 'Скопа', name_be: 'Скапа', name_lat: 'Pandion haliaetus',
category: 'VU', by_category: 'II',
description: 'Уникальный хищник, питающийся исключительно рыбой. Ныряет в воду на глубину до 1 м. Пальцы покрыты шипами для удержания скользкой добычи. Строит гнёзда на вершинах сухих деревьев или опорах ЛЭП.',
fact: 'Скопа — единственная хищная птица мира, охотящаяся только на рыбу и обитающая на всех континентах кроме Антарктиды.',
threats: ['Деградация рыбных ресурсов', 'Беспокойство у гнёзд', 'Гибель на ЛЭП'],
conservation: 'Установка искусственных гнездовых платформ. Охранные зоны у гнёзд.',
where_to_see: 'Браславские озёра, НП «Нарочанский», озёра Витебской области',
model: 'procedural', biomass: 1.8,
regions: ['vitebsk','minsk','grodno','brest'],
popdata: [[1990,50,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,110,'Мониторинг 2024']],
trend: [{year:1990,count:50},{year:2005,count:70},{year:2015,count:90},{year:2024,count:110}],
});
ids.dergach = sp({
group: 'Птицы', habitat: 'Луг и поле',
name_ru: 'Коростель', name_be: 'Дзяргач', name_lat: 'Crex crex',
category: 'VU', by_category: 'III',
description: 'Скрытная птица влажных лугов. Слышать его легко — самец кричит «дёрг-дёрг» всю ночь, но увидеть почти невозможно. Прилетает поздно весной из Африки. Численность резко падает из-за раннего сенокоса.',
fact: 'Коростель бежит быстрее, чем летит. Его крик слышен за 1,5 км в тихую ночь.',
threats: ['Ранний механизированный сенокос', 'Осушение лугов', 'Хищники'],
conservation: 'Рекомендации по срокам сенокоса (после 1 августа). Сохранение пойменных лугов.',
where_to_see: 'Пойма Припяти, Нарочанский НП, луга Брестской области',
biomass: 0.15,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
popdata: [[1990,5000,'КК РБ 1993'],[2005,3500,'КК РБ 2004'],[2015,2800,'КК РБ 2015'],[2024,2200,'Мониторинг 2024']],
trend: [{year:1990,count:5000},{year:2005,count:3500},{year:2015,count:2800},{year:2024,count:2200}],
});
ids.zhuravl = sp({
group: 'Птицы', habitat: 'Болото',
name_ru: 'Серый журавль', name_be: 'Шэры жураўль', name_lat: 'Grus grus',
category: 'NT', by_category: 'IV',
description: 'Символ белорусских болот. Пары создаются на всю жизнь. Весной и осенью собирается на полях в стаи до нескольких тысяч птиц. Токование — один из самых красивых ритуалов среди птиц: прыжки, взмахи крыльями, трубный крик.',
fact: 'Журавль живёт до 25 лет в дикой природе. Беларусь — один из главных «журавлиных» регионов Европы с населением ~20 000 пар.',
threats: ['Осушение болот', 'Беспокойство в период гнездования'],
conservation: 'Сохранение болотных массивов. Охраняемые территории на токовищах.',
where_to_see: 'НП «Припятский», Ельня, Освейское болото',
model: 'procedural', biomass: 5.0,
regions: ['vitebsk','minsk','gomel','brest','grodno','mogilev'],
trend: [{year:1990,count:15000},{year:2010,count:18000},{year:2024,count:20000}],
});
ids.zmeeyed = sp({
group: 'Птицы', habitat: 'Широколиственный лес',
name_ru: 'Змееяд', name_be: 'Змеяед', name_lat: 'Circaetus gallicus',
category: 'EN', by_category: 'II',
description: 'Специализированный охотник на рептилий. Питается почти исключительно змеями, в том числе гадюками. Иммунитет к яду позволяет заглатывать змею живой. Редчайший в Беларуси — гнездятся единицы пар.',
fact: 'Змееяд способен заглотить гадюку длиной 1 м. В Беларуси гнездится не более 15–20 пар.',
threats: ['Вырубка старых лесов', 'Снижение численности рептилий', 'Беспокойство'],
conservation: 'Охрана известных гнёзд. Мониторинг численности.',
where_to_see: 'ПЗ «Полесский», Беловежская пуща',
biomass: 1.9,
regions: ['brest','gomel'],
popdata: [[2000,12,'КК РБ 2004'],[2015,15,'КК РБ 2015'],[2024,18,'Мониторинг 2024']],
trend: [{year:2000,count:12},{year:2015,count:15},{year:2024,count:18}],
});
ids.vorobiny_sych = sp({
group: 'Птицы', habitat: 'Хвойный лес',
name_ru: 'Воробьиный сыч', name_be: 'Верабіны сычык', name_lat: 'Glaucidium passerinum',
category: 'VU', by_category: 'III',
description: 'Самая маленькая сова Европы — размером с дрозда. Активна как днём, так и ночью. Делает запасы пищи в дуплах на зиму. Голос — монотонный свист, слышный далеко в лесу.',
fact: 'Несмотря на размер с воробья, воробьиный сыч охотится на добычу крупнее себя — полёвок и мелких птиц.',
threats: ['Вырубка старых ельников', 'Исчезновение дупел'],
conservation: 'Сохранение старовозрастных ельников. Вывешивание искусственных дупел.',
where_to_see: 'Налибокская пуща, Беловежская пуща, Ельнянский заказник',
biomass: 0.08,
regions: ['grodno','vitebsk','minsk'],
});
ids.krasnozobaya_kazarka = sp({
group: 'Птицы', habitat: 'Река и озеро',
name_ru: 'Краснозобая казарка', name_be: 'Чырванашыйная казарка', name_lat: 'Branta ruficollis',
category: 'EN', by_category: 'II',
description: 'Одна из самых красивых арктических гусей. В Беларуси встречается только во время миграций — зимует на Чёрном море. Численность катастрофически сокращается из-за охоты на зимовках.',
fact: 'Краснозобая казарка гнездится исключительно в тундре Западной Сибири. Беларусь — транзитный коридор миграции.',
threats: ['Охота на зимовках', 'Изменение климата', 'Беспокойство на миграционных стоянках'],
conservation: 'Запрет охоты. Охрана мест остановок на миграции.',
where_to_see: 'Полесские водохранилища, озёра Витебщины (пролёт)',
biomass: 1.5,
regions: ['gomel','brest','vitebsk'],
});
ids.filin = sp({
group: 'Птицы', habitat: 'Хвойный лес',
name_ru: 'Филин', name_be: 'Пугач', name_lat: 'Bubo bubo',
category: 'VU', by_category: 'II',
description: 'Крупнейшая сова планеты. Ночной охотник, способный атаковать добычу весом до 3 кг. Охотничий участок пары — до 80 км². Низкое токование самца слышно за 4 км в тихую ночь.',
fact: 'Филин — единственная птица, которая регулярно охотится на других хищников: ловит ястребов и даже молодых орланов.',
threats: ['Фактор беспокойства', 'Гибель на ЛЭП', 'Оскудение кормовой базы'],
conservation: 'Охрана гнёзд. Изоляция ЛЭП. Мониторинг популяции.',
where_to_see: 'Беловежская пуща, ПЗ «Налибокский», НП «Припятский»',
model: 'procedural', biomass: 2.7,
regions: ['brest','grodno','gomel','minsk'],
trend: [{year:1990,count:200},{year:2010,count:250},{year:2024,count:280}],
});
ids.zhuravl_seryi2 = sp({
group: 'Птицы', habitat: 'Болото',
name_ru: 'Большой подорлик', name_be: 'Вялікі арол-крычун', name_lat: 'Clanga clanga',
category: 'EN', by_category: 'II',
description: 'Один из самых редких орлов Европы. Гнездится в старых лиственных лесах рядом с болотами и поймами. Питается амфибиями, мышевидными грызунами. Особенно уязвим из-за низкой плодовитости — одно яйцо в кладке.',
fact: 'В мире гнездится менее 10 000 пар большого подорлика. Беларусь — один из ключевых регионов гнездования в Европе.',
threats: ['Осушение болот и пойм', 'Вырубка пойменных лесов', 'Беспокойство'],
conservation: 'Охрана гнёзд. Сохранение болотных массивов.',
where_to_see: 'НП «Припятский», Полесский радиационно-экологический заповедник',
biomass: 2.0,
regions: ['gomel','brest','minsk'],
popdata: [[2000,80,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,100,'Мониторинг 2024']],
trend: [{year:2000,count:80},{year:2015,count:90},{year:2024,count:100}],
});
/* ── МЛЕКОПИТАЮЩИЕ ──────────────────────────────────────────────────────── */
ids.zubr = sp({
group: 'Млекопитающие', habitat: 'Широколиственный лес',
name_ru: 'Зубр европейский', name_be: 'Зубр', name_lat: 'Bison bonasus',
category: 'VU', by_category: 'III',
description: 'Крупнейшее наземное млекопитающее Европы. Масса самца достигает 920 кг при высоте в холке 188 см. Вид был полностью истреблён в дикой природе к 1927 году — всё нынешнее поголовье (около 7000 особей в мире) происходит от 12 зубров из зоопарков. Беларусь сыграла ключевую роль в восстановлении вида.',
fact: 'Зубр может прыгнуть в высоту до 2 м. Беловежская пуща — колыбель восстановления этого вида.',
threats: ['Инбридинг из-за малой генетической базы', 'Болезни', 'Браконьерство'],
conservation: 'Беловежская пуща — ключевой центр разведения. Программы реинтродукции в Европе.',
where_to_see: 'Беловежская пуща (основная популяция), Налибокская пуща',
model: 'procedural', biomass: 650,
regions: ['brest','grodno','minsk','vitebsk'],
popdata: [[1927,0,'Летопись'],[1960,150,'КК РБ'],[1990,850,'КК РБ 1993'],[2010,1500,'КК РБ 2015'],[2024,2000,'Мониторинг 2024']],
trend: [{year:1927,count:0},{year:1960,count:150},{year:1990,count:850},{year:2010,count:1500},{year:2024,count:2000}],
});
ids.rys = sp({
group: 'Млекопитающие', habitat: 'Хвойный лес',
name_ru: 'Рысь евразийская', name_be: 'Рысь', name_lat: 'Lynx lynx',
category: 'NT', by_category: 'III',
description: 'Крупнейший кошачий хищник Европы. Ведёт одиночный ночной образ жизни. Охотится главным образом на косуль и зайцев, реже на других оленей. Огромные лапы работают как снегоступы — рысь не проваливается в снег глубиной до 50 см.',
fact: 'Рысь может прыгнуть на расстояние 7 м. Она единственная крупная кошка, живущая севернее 60° с.ш.',
threats: ['Браконьерство', 'Фрагментация лесных массивов', 'Снижение кормовой базы'],
conservation: 'Полный запрет охоты. Охрана крупных лесных массивов. GPS-мониторинг.',
where_to_see: 'Налибокская пуща, Беловежская пуща, Освейский заказник',
model: 'procedural', biomass: 22,
regions: ['grodno','minsk','vitebsk','brest'],
popdata: [[1990,350,'КК РБ 1993'],[2005,500,'КК РБ 2004'],[2015,650,'КК РБ 2015'],[2024,700,'Мониторинг 2024']],
trend: [{year:1990,count:350},{year:2005,count:500},{year:2015,count:650},{year:2024,count:700}],
});
ids.medved = sp({
group: 'Млекопитающие', habitat: 'Хвойный лес',
name_ru: 'Бурый медведь', name_be: 'Буры мядзведзь', name_lat: 'Ursus arctos',
category: 'NT', by_category: 'III',
description: 'Крупнейший хищник фауны Беларуси. Всеяден — рацион на 80% состоит из растительной пищи. Залегает в берлогу с ноября по март. В Беларуси обитает на северо-востоке, сохранились лишь периферийные популяции.',
fact: 'Медведь чует запах еды с расстояния 20 км. Самка рожает медвежат в берлоге прямо в январе, весящих всего 500 г.',
threats: ['Браконьерство', 'Фрагментация лесов', 'Деградация кормовой базы'],
conservation: 'Запрет охоты. Охрана берлог. Мониторинг численности.',
where_to_see: 'Полоцкий район Витебской области, Освейский заказник',
model: 'procedural', biomass: 180,
regions: ['vitebsk','mogilev'],
popdata: [[1990,80,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,65,'КК РБ 2015'],[2024,60,'Мониторинг 2024']],
trend: [{year:1990,count:80},{year:2005,count:70},{year:2015,count:65},{year:2024,count:60}],
});
ids.norka = sp({
group: 'Млекопитающие', habitat: 'Река и озеро',
name_ru: 'Европейская норка', name_be: 'Еўрапейская норка', name_lat: 'Mustela lutreola',
category: 'CR', by_category: 'I',
description: 'Один из самых редких хищников Европы. Конкурентно вытеснена завезённой американской норкой. Держится у небольших рек с захламлёнными берегами. Отличается от американской норкой белым пятном на верхней губе.',
fact: 'Европейская норка занесена в Красную книгу МСОП как находящаяся под критической угрозой исчезновения. В Беларуси обитает менее 500 особей.',
threats: ['Конкуренция с американской норкой', 'Охота/отлов', 'Деградация береговой растительности'],
conservation: 'Программа разведения в неволе. Отлов и стерилизация американской норки. Реинтродукция.',
where_to_see: 'Полесье, бассейн Немана',
biomass: 0.6,
regions: ['brest','gomel','grodno'],
popdata: [[1990,2000,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,400,'КК РБ 2015'],[2024,300,'Мониторинг 2024']],
trend: [{year:1990,count:2000},{year:2005,count:800},{year:2015,count:400},{year:2024,count:300}],
});
ids.vydra = sp({
group: 'Млекопитающие', habitat: 'Река и озеро',
name_ru: 'Речная выдра', name_be: 'Выдра', name_lat: 'Lutra lutra',
category: 'NT', by_category: 'III',
description: 'Полуводный хищник семейства куньих. Мастер плавания — способна задерживать дыхание на 4 минуты. Поедает рыбу, раков, лягушек. Индикатор чистоты водоёмов: там, где живёт выдра, вода чистая.',
fact: 'Выдра скользит по снегу и льду на брюхе, развивая скорость до 25 км/ч. Каждый день ей нужно съесть 15% своего веса.',
threats: ['Загрязнение водоёмов', 'Браконьерство', 'Вылов в рыболовные снасти'],
conservation: 'Охрана водоохранных зон. Запрет охоты. Очистка водоёмов.',
where_to_see: 'Реки по всей Беларуси, НП «Припятский»',
biomass: 9,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
trend: [{year:1990,count:2500},{year:2010,count:3000},{year:2024,count:3200}],
});
ids.bober = sp({
group: 'Млекопитающие', habitat: 'Река и озеро',
name_ru: 'Речной бобёр', name_be: 'Рачны бабёр', name_lat: 'Castor fiber',
category: 'LC', by_category: 'IV',
description: 'Крупнейший грызун Беларуси. Инженер экосистем: строит плотины, создаёт водоёмы, меняет ландшафт. Был истреблён к XIX веку и успешно реинтродуцирован. Сейчас численность в Беларуси — одна из крупнейших в Европе.',
fact: 'Бобёр — природный мелиоратор: его плотины повышают уровень грунтовых вод, создают новые биотопы для других видов.',
threats: ['Охота', 'Уничтожение прибрежной растительности'],
conservation: 'Регулирование охоты. Охрана пойменных лесов.',
where_to_see: 'Повсеместно у рек и каналов Беларуси',
biomass: 25,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
trend: [{year:1960,count:1000},{year:1990,count:20000},{year:2010,count:50000},{year:2024,count:60000}],
});
ids.zubatka = sp({
group: 'Млекопитающие', habitat: 'Широколиственный лес',
name_ru: 'Соня лесная', name_be: 'Лясная соня', name_lat: 'Dryomys nitedula',
category: 'VU', by_category: 'III',
description: 'Небольшой ночной грызун смешанных и лиственных лесов. Спит 7–8 месяцев в году — дольше всех млекопитающих Беларуси. Гнездо строит в дуплах или развилках ветвей на высоте 2–5 м.',
fact: 'Перед зимней спячкой соня увеличивает массу тела вдвое, накапливая жир. Температура тела во сне падает до 1°C.',
threats: ['Вырубка лиственных лесов', 'Снижение урожая орехов и желудей'],
conservation: 'Охрана старолесий. Вывешивание дуплянок.',
where_to_see: 'Беловежская пуща, Налибокская пуща',
biomass: 0.03,
regions: ['brest','grodno','minsk'],
});
ids.kosulya = sp({
group: 'Млекопитающие', habitat: 'Широколиственный лес',
name_ru: 'Косуля европейская', name_be: 'Еўрапейская казуля', name_lat: 'Capreolus capreolus',
category: 'LC', by_category: 'IV',
description: 'Самый распространённый олень Беларуси. Важнейший элемент пищевой цепи — основная добыча волка, рыси и лисы. Рожки самец сбрасывает ежегодно в ноябре. Летом держится одиночно, зимой образует небольшие группы.',
fact: 'Косуля — чемпион среди оленей по скорости: развивает до 60 км/ч. Рогатый самец защищает территорию площадью до 60 га.',
threats: ['Интенсивная охота', 'Браконьерство', 'Хищники'],
conservation: 'Регулирование охотничьей нагрузки. Мониторинг численности.',
where_to_see: 'Лесные массивы по всей Беларуси',
model: 'procedural', biomass: 25,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
trend: [{year:1990,count:80000},{year:2010,count:100000},{year:2024,count:110000}],
});
ids.volk = sp({
group: 'Млекопитающие', habitat: 'Хвойный лес',
name_ru: 'Волк', name_be: 'Воўк', name_lat: 'Canis lupus',
category: 'LC', by_category: 'IV',
description: 'Крупнейший хищник семейства псовых. Живёт стаями 5–12 особей с чёткой иерархией. Регулирует численность копытных, оздоровляя их популяции. В Беларуси отношение к волку противоречивое — он и символ дикой природы, и угроза для скота.',
fact: 'Волк за сутки способен пробежать до 70 км. Воя стаи достаточно, чтобы пометить территорию площадью в сотни км².',
threats: ['Истребление как вредителя', 'Фрагментация ареала'],
conservation: 'Мониторинг. Компенсации за ущерб скоту.',
where_to_see: 'Леса по всей Беларуси',
model: 'procedural', biomass: 40,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
trend: [{year:1990,count:1800},{year:2005,count:1500},{year:2015,count:1700},{year:2024,count:2000}],
});
/* ── РАСТЕНИЯ ────────────────────────────────────────────────────────────── */
ids.venerina = sp({
group: 'Растения', habitat: 'Широколиственный лес',
name_ru: 'Венерин башмачок настоящий', name_be: 'Венерын чаравічак', name_lat: 'Cypripedium calceolus',
category: 'EN', by_category: 'II',
description: 'Красивейшая дикая орхидея Беларуси. Цветок напоминает туфельку. Растёт в тенистых лиственных лесах. Живёт до 100 лет, но впервые цветёт только в 15–17 лет. Опыляется только мелкими пчёлами рода Andrena.',
fact: 'Венерин башмачок — самая долгоживущая травянистая орхидея. Одно растение в Германии было документально прослежено 100 лет на одном месте.',
threats: ['Незаконный сбор', 'Вырубка лесов', 'Уплотнение почвы', 'Зарастание кустарником'],
conservation: 'Охрана местонахождений. Культивирование в ботанических садах. Запрет сбора.',
where_to_see: 'Беловежская пуща (ур. Новый Двор), Налибокская пуща',
biomass: 0.05,
regions: ['brest','grodno','minsk','vitebsk'],
popdata: [[1990,5000,'КК РБ 1993'],[2005,3000,'КК РБ 2004'],[2015,2000,'КК РБ 2015'],[2024,1800,'Мониторинг 2024']],
trend: [{year:1990,count:5000},{year:2005,count:3000},{year:2015,count:2000},{year:2024,count:1800}],
});
ids.vodyanoy_oreh = sp({
group: 'Растения', habitat: 'Река и озеро',
name_ru: 'Водяной орех плавающий', name_be: 'Плывучы вадзяны арэх', name_lat: 'Trapa natans',
category: 'CR', by_category: 'I',
description: 'Реликт третичной флоры, живший на Земле ещё 100 миллионов лет назад. Плавающие листья образуют красивую розетку. Плоды съедобны, богаты крахмалом. Сохранился лишь в нескольких озёрах Полесья.',
fact: 'Водяной орех пережил динозавров. Его плоды с четырьмя «рогами» служили пищей людям ещё в каменном веке.',
threats: ['Загрязнение и эвтрофикация озёр', 'Колебания уровня воды', 'Конкуренция с другими водными растениями'],
conservation: 'Охрана озёр. Ограничение хозяйственной деятельности. Культивирование.',
where_to_see: 'Оз. Червоное (Брестская обл.), оз. Белое (Полесье)',
biomass: 0.02,
regions: ['brest','gomel'],
popdata: [[1990,15000,'КК РБ 1993'],[2005,8000,'КК РБ 2004'],[2015,4000,'КК РБ 2015'],[2024,2500,'Мониторинг 2024']],
trend: [{year:1990,count:15000},{year:2005,count:8000},{year:2015,count:4000},{year:2024,count:2500}],
});
ids.palchatokorenik = sp({
group: 'Растения', habitat: 'Болото',
name_ru: 'Пальчатокоренник мясокрасный', name_be: 'Мяснякраснаты пальчатакарэнік', name_lat: 'Dactylorhiza incarnata',
category: 'VU', by_category: 'III',
description: 'Болотная орхидея с плотным колосом розово-лиловых цветков. Растёт на низинных болотах и заболоченных лугах. Микоризный гриб необходим для прорастания семян — без него орхидея не может развиться.',
fact: 'Семена орхидей настолько малы (0,002 мм), что видны только под микроскопом. В одной коробочке содержится до 10 000 семян.',
threats: ['Осушение болот', 'Зарастание кустарником', 'Выпас скота'],
conservation: 'Охрана болотных массивов. Запрет мелиорации.',
where_to_see: 'Полесье, Налибокская пуща, Осиповичский район',
biomass: 0.03,
regions: ['brest','gomel','grodno','minsk'],
});
ids.molochai = sp({
group: 'Растения', habitat: 'Луг и поле',
name_ru: 'Прострел луговой', name_be: 'Сонца-трава', name_lat: 'Pulsatilla pratensis',
category: 'VU', by_category: 'III',
description: 'Один из первых весенних цветков. Тёмно-фиолетовые бокаловидные цветки появляются ещё при снеге. Покрыт шелковистыми волосками — защита от холода. Сильно сократился из-за сбора на букеты и распашки лугов.',
fact: 'Прострел — символ весны в Беларуси. Второе название «сон-трава» — легенда гласит, что заснувший рядом с ним видит вещие сны.',
threats: ['Сбор букетов', 'Распашка луговин', 'Сенокос до плодоношения'],
conservation: 'Запрет сбора. Охрана луговых заказников.',
where_to_see: 'Сосновые боры, остепнённые луга по всей Беларуси',
biomass: 0.01,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});
ids.lobelia = sp({
group: 'Растения', habitat: 'Река и озеро',
name_ru: 'Лобелия Дортмана', name_be: 'Лобелія Дортмана', name_lat: 'Lobelia dortmanna',
category: 'EN', by_category: 'II',
description: 'Водное растение олиготрофных озёр. Растёт на песчаном дне на глубине 0,5–3 м. Цветонос возвышается над водой. Сверхчувствителен к загрязнению — индикатор кристально чистой воды.',
fact: 'Лобелия Дортмана поглощает CO₂ через корни из донных отложений, а не из воды — уникальный для растений способ.',
threats: ['Эвтрофикация озёр', 'Загрязнение воды', 'Рекреационная нагрузка'],
conservation: 'Охрана чистых озёр. Ограничение рекреации.',
where_to_see: 'Браславские озёра, озёра Нарочанской группы',
biomass: 0.01,
regions: ['vitebsk','minsk','grodno'],
});
ids.soldanella = sp({
group: 'Растения', habitat: 'Широколиственный лес',
name_ru: 'Лунник оживающий', name_be: 'Лунарыя ажываючая', name_lat: 'Lunaria rediviva',
category: 'VU', by_category: 'III',
description: 'Многолетнее растение тенистых влажных лесов. Серебристые эллиптические стручки используют для зимних букетов. Редчайшее в Беларуси — известно лишь несколько популяций.',
fact: 'Название «лунник» происходит от формы плодов — круглых, как луна. После высыхания они становятся прозрачными и серебристыми.',
threats: ['Сбор для флористики', 'Вырубка тенистых лесов'],
conservation: 'Запрет сбора. Охрана местонахождений.',
where_to_see: 'Налибокская пуща, Беловежская пуща',
biomass: 0.1,
regions: ['grodno','minsk','brest'],
});
ids.matik = sp({
group: 'Растения', habitat: 'Болото',
name_ru: 'Шейхцерия болотная', name_be: 'Балотная шэйхцэрыя', name_lat: 'Scheuchzeria palustris',
category: 'VU', by_category: 'III',
description: 'Реликтовое травянистое растение верховых болот. Растёт в сфагновых зарослях у мочажин. Индикатор ненарушенных болотных экосистем. При осушении болот исчезает первым.',
fact: 'Шейхцерия существует более 10 000 лет — с конца ледникового периода — практически не изменившись.',
threats: ['Осушение болот', 'Торфоразработки'],
conservation: 'Охрана верховых болот. Запрет торфоразработок.',
where_to_see: 'Ельнянский заказник, Освейское болото',
biomass: 0.01,
regions: ['vitebsk','minsk','gomel'],
});
/* ── НАСЕКОМЫЕ ────────────────────────────────────────────────────────────── */
ids.makhаon = sp({
group: 'Насекомые', habitat: 'Луг и поле',
name_ru: 'Махаон', name_be: 'Махаон', name_lat: 'Papilio machaon',
category: 'NT', by_category: 'IV',
description: 'Одна из крупнейших и красивейших бабочек Беларуси. Размах крыльев до 95 мм. Жёлтые крылья с чёрным рисунком и синей каймой. Гусеница поедает листья зонтичных растений. Стал редок из-за распашки лугов с дикими зонтичными.',
fact: 'Хвостики-отростки на задних крыльях отвлекают хищников — птицы атакуют «ненастоящую голову».',
threats: ['Распашка лугов с зонтичными растениями', 'Применение пестицидов', 'Сбор коллекционерами'],
conservation: 'Сохранение лугов с дикими зонтичными. Запрет отлова.',
where_to_see: 'Луга и опушки по всей Беларуси, Полесье',
model: 'procedural', biomass: 0.002,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
trend: [{year:1990,count:100000},{year:2010,count:50000},{year:2024,count:30000}],
});
ids.podolik = sp({
group: 'Насекомые', habitat: 'Широколиственный лес',
name_ru: 'Жук-олень', name_be: 'Жук-алень', name_lat: 'Lucanus cervus',
category: 'VU', by_category: 'II',
description: 'Крупнейший жук Беларуси. Самцы достигают 9 см. «Рога» — увеличенные жвала, используемые в турнирных боях. Личинка развивается в мёртвой древесине дуба 5–8 лет. Исчезает вместе со старыми дубравами.',
fact: 'Жук-олень умеет летать, несмотря на тяжёлую «броню». Взрослый жук не ест — живёт всего 1–2 месяца за счёт жировых запасов.',
threats: ['Вырубка старых дубрав', 'Уборка мёртвой древесины', 'Декоративный сбор'],
conservation: 'Сохранение старовозрастных дубрав. Оставление валежника.',
where_to_see: 'Беловежская пуща, Налибокская пуща',
model: 'procedural', biomass: 0.008,
regions: ['brest','grodno','minsk'],
});
ids.apollon = sp({
group: 'Насекомые', habitat: 'Луг и поле',
name_ru: 'Аполлон', name_be: 'Апалон', name_lat: 'Parnassius apollo',
category: 'EN', by_category: 'I',
description: 'Крупная дневная бабочка с полупрозрачными белыми крыльями и красными глазками. Считается одним из красивейших насекомых Европы. В Беларуси сохранились единичные изолированные популяции. Гусеница питается очитком.',
fact: 'Аполлон — первая бабочка, включённая в Конвенцию CITES (запрет международной торговли). Его коллекционируют вопреки всем запретам.',
threats: ['Зарастание каменистых склонов кустарником', 'Коллекционирование', 'Применение пестицидов'],
conservation: 'Строгая охрана популяций. Борьба с зарастанием склонов.',
where_to_see: 'Окрестности Гродно (единственное местонахождение в РБ)',
biomass: 0.003,
regions: ['grodno'],
popdata: [[2000,500,'КК РБ 2004'],[2015,300,'КК РБ 2015'],[2024,200,'Мониторинг 2024']],
trend: [{year:2000,count:500},{year:2015,count:300},{year:2024,count:200}],
});
ids.bogomol = sp({
group: 'Насекомые', habitat: 'Луг и поле',
name_ru: 'Богомол обыкновенный', name_be: 'Звычайны багамол', name_lat: 'Mantis religiosa',
category: 'EN', by_category: 'II',
description: 'Самый известный хищный кузнечик. Передние ноги — ловчий аппарат, реагирующий быстрее, чем успевает моргнуть человек. Самка после спаривания поедает самца. В Беларуси — на северной границе ареала.',
fact: 'Богомол — единственное насекомое, способное поворачивать голову на 180°. Реакция захвата добычи занимает 0,05 секунды.',
threats: ['Применение пестицидов', 'Распашка сухих лугов', 'Изменение климата'],
conservation: 'Охрана сухих травянистых местообитаний.',
where_to_see: 'Южная Беларусь — Брестская, Гомельская обл.',
biomass: 0.004,
regions: ['brest','gomel'],
});
ids.stag_beetle2 = sp({
group: 'Насекомые', habitat: 'Широколиственный лес',
name_ru: 'Усач мускусный', name_be: 'Мускусны вусач', name_lat: 'Aromia moschata',
category: 'VU', by_category: 'III',
description: 'Ярко-зелёный жук с металлическим блеском. Издаёт сильный запах мускуса, слышный за несколько метров. Личинки развиваются в старых ивах. Встречается вдоль рек с ивняком.',
fact: 'Мускусный усач — один из немногих жуков, использующих химическую сигнализацию для общения с партнёрами.',
threats: ['Обрезка и уборка старых ив', 'Осушение пойм'],
conservation: 'Сохранение старых ив вдоль рек.',
where_to_see: 'Поймы рек Полесья, долина Немана',
biomass: 0.004,
regions: ['brest','gomel','grodno','minsk'],
});
/* ── РЫБЫ ─────────────────────────────────────────────────────────────────── */
ids.sterlyadj = sp({
group: 'Рыбы', habitat: 'Река и озеро',
name_ru: 'Стерлядь', name_be: 'Асётр-стэрлядзь', name_lat: 'Acipenser ruthenus',
category: 'EN', by_category: 'II',
description: 'Самый мелкий осетр. Реликт доледникового периода — осетры появились 250 миллионов лет назад. В Беларуси исчезала в XX веке и восстанавливается искусственным зарыблением. Ценнейшая промысловая рыба.',
fact: 'Осетры — живые ископаемые. Их форма тела не менялась 200 миллионов лет. Стерлядь доживает до 30 лет.',
threats: ['Браконьерство', 'Строительство плотин', 'Загрязнение рек', 'Изъятие из русел гравия'],
conservation: 'Искусственное воспроизводство. Рыборазводные заводы. Запрет вылова.',
where_to_see: 'Р. Днепр, р. Припять, р. Сож (редко)',
biomass: 0.8,
regions: ['gomel','mogilev','brest'],
popdata: [[1990,100,'КК РБ 1993'],[2010,500,'после зарыбления'],[2024,1500,'Мониторинг 2024']],
trend: [{year:1990,count:100},{year:2010,count:500},{year:2024,count:1500}],
});
ids.minog = sp({
group: 'Рыбы', habitat: 'Река и озеро',
name_ru: 'Ручьевая минога', name_be: 'Ручаёвая мінога', name_lat: 'Lampetra planeri',
category: 'VU', by_category: 'III',
description: 'Древнейший позвоночный — миноги появились 360 миллионов лет назад, ещё до динозавров. Не имеет челюстей. Личинка (амоцет) живёт в иле 3–7 лет с закрытыми глазами. Взрослая минога не питается и гибнет после нереста.',
fact: 'Ручьевая минога — «живое ископаемое», практически не изменившееся за 360 миллионов лет. Её называют самым примитивным позвоночным.',
threats: ['Загрязнение малых рек', 'Заиление нерестилищ', 'Мелиорация'],
conservation: 'Охрана малых рек. Ограничение мелиорации.',
where_to_see: 'Чистые малые реки Витебской, Гродненской областей',
biomass: 0.02,
regions: ['vitebsk','grodno','minsk','mogilev'],
});
ids.usatch = sp({
group: 'Рыбы', habitat: 'Река и озеро',
name_ru: 'Усач обыкновенный', name_be: 'Марэна', name_lat: 'Barbus barbus',
category: 'VU', by_category: 'III',
description: 'Крупная реофильная рыба быстрых рек. Достигает 90 см. Ищет пищу на дне с помощью чувствительных усиков. Нерестится на каменистых перекатах — именно их исчезновение главная угроза.',
fact: 'Икра усача ядовита для теплокровных — содержит ихтиотоксин. Местные рыбаки знали об этом и никогда её не ели.',
threats: ['Добыча гравия', 'Строительство плотин', 'Загрязнение'],
conservation: 'Сохранение каменистых перекатов. Запрет добычи гравия.',
where_to_see: 'Р. Западный Буг, р. Нёман',
biomass: 1.5,
regions: ['brest','grodno'],
});
ids.rylets = sp({
group: 'Рыбы', habitat: 'Река и озеро',
name_ru: 'Подуст обыкновенный', name_be: 'Падуст', name_lat: 'Chondrostoma nasus',
category: 'EN', by_category: 'II',
description: 'Стайная рыба горных и предгорных рек. В Беларуси — на восточной границе ареала. Питается водорослями и органикой, соскребая их нижнечелюстным роговым чехликом со дна.',
fact: 'Подуст чистит дно реки, поедая водоросли — выполняет роль «пылесоса» экосистемы.',
threats: ['Загрязнение', 'Уничтожение нерестовых субстратов', 'Строительство плотин'],
conservation: 'Охрана нерестилищ. Запрет строительства.',
where_to_see: 'Р. Западный Буг (редко)',
biomass: 0.3,
regions: ['brest'],
});
/* ── РЕПТИЛИИ И АМФИБИИ ──────────────────────────────────────────────────── */
ids.cherepaha = sp({
group: 'Рептилии и амфибии', habitat: 'Болото',
name_ru: 'Черепаха болотная', name_be: 'Балотная чарапаха', name_lat: 'Emys orbicularis',
category: 'VU', by_category: 'II',
description: 'Единственная дикая черепаха Беларуси. Греется на берегах заболоченных водоёмов. При опасности мгновенно ныряет. Живёт до 100 лет. Откладывает яйца в прогретую почву. Самая северная черепаха Европы.',
fact: 'Черепаха болотная определяет пол потомства температурой гнезда: при +28°C рождаются самки, при +26°C — самцы.',
threats: ['Осушение болот', 'Уничтожение берегов', 'Гибель на дорогах'],
conservation: 'Охрана водно-болотных угодий. Туннели под дорогами.',
where_to_see: 'Полесье (Брестская, Гомельская обл.)',
model: 'procedural', biomass: 0.5,
regions: ['brest','gomel','grodno'],
popdata: [[1990,10000,'КК РБ 1993'],[2005,7000,'КК РБ 2004'],[2015,5000,'КК РБ 2015'],[2024,4000,'Мониторинг 2024']],
trend: [{year:1990,count:10000},{year:2005,count:7000},{year:2015,count:5000},{year:2024,count:4000}],
});
ids.medyanka = sp({
group: 'Рептилии и амфибии', habitat: 'Широколиственный лес',
name_ru: 'Медянка', name_be: 'Медзянка', name_lat: 'Coronella austriaca',
category: 'VU', by_category: 'III',
description: 'Небольшая безвредная змея. Часто принимается за гадюку и уничтожается. Специализируется на ящерицах — конкурирует с гадюкой за пищу, но не ядовита. Гладкая чешуя с медным блеском.',
fact: 'Медянка сжимает добычу как удав — потому что ящерицы не боятся яда. Укус человека абсолютно безвреден.',
threats: ['Уничтожение из-за путаницы с гадюкой', 'Уничтожение сухих опушек'],
conservation: 'Просветительская работа. Охрана сухих опушек и вырубок.',
where_to_see: 'Сухие сосновые леса Полесья',
biomass: 0.05,
regions: ['brest','gomel','grodno','minsk'],
});
ids.trit = sp({
group: 'Рептилии и амфибии', habitat: 'Болото',
name_ru: 'Тритон гребенчатый', name_be: 'Грэбеньчасты трытон', name_lat: 'Triturus cristatus',
category: 'NT', by_category: 'III',
description: 'Крупнейший тритон Беларуси. В брачный период самец развивает высокий зубчатый гребень от затылка до хвоста. Днём прячется в укрытиях, ночью охотится. Живёт у лесных водоёмов.',
fact: 'Гребень самца — не для плавания, а для привлечения самок. В воде он играет роль «хвоста павлина».',
threats: ['Мелиорация', 'Гибель на дорогах', 'Инвазивные рыбы в водоёмах'],
conservation: 'Охрана прудов и болот. Ограничение вселения рыбы.',
where_to_see: 'Лесные пруды по всей Беларуси',
biomass: 0.02,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});
/* ── ГРИБЫ ────────────────────────────────────────────────────────────────── */
ids.truffe = sp({
group: 'Грибы', habitat: 'Широколиственный лес',
name_ru: 'Трюфель летний', name_be: 'Летні трувель', name_lat: 'Tuber aestivum',
category: 'EN', by_category: 'I',
description: 'Подземный гриб — деликатес с неповторимым ароматом. Растёт в симбиозе с корнями дуба и бука. Плодовое тело полностью под землёй. В Беларуси — редчайший вид, известны единичные находки.',
fact: 'Аромат трюфеля обусловлен андростенолом — феромоном, похожим на половой гормон кабана. Именно поэтому их традиционно ищут со свиньями.',
threats: ['Вырубка дубрав', 'Уплотнение почвы', 'Сбор до созревания спор'],
conservation: 'Охрана старых дубрав. Запрет сбора.',
where_to_see: 'Беловежская пуща (единичные находки)',
biomass: 0.1,
regions: ['brest'],
});
ids.mukhomor = sp({
group: 'Грибы', habitat: 'Хвойный лес',
name_ru: 'Решёточник красный', name_be: 'Чырвоная кратчатка', name_lat: 'Clathrus ruber',
category: 'CR', by_category: 'I',
description: 'Невероятный гриб — красная ажурная решётка. Вылупляется из белого яйца за несколько часов. Тухлый запах привлекает мух, распространяющих споры. Средиземноморский вид, в Беларуси единственная находка в 2019 г.',
fact: 'Решёточник — один из самых необычных грибов мира. Его рост занимает всего 4–6 часов. Живёт 1–2 дня.',
threats: ['Недостаточность тепла', 'Уничтожение при сборе'],
conservation: 'Строгая охрана единственного местонахождения.',
where_to_see: 'Гродненский район (единственная находка)',
biomass: 0.05,
regions: ['grodno'],
});
ids.sparassis = sp({
group: 'Грибы', habitat: 'Хвойный лес',
name_ru: 'Спарасис курчавый (грибная капуста)', name_be: 'Кучаравы спарасіс', name_lat: 'Sparassis crispa',
category: 'VU', by_category: 'III',
description: 'Гриб, похожий на кочан цветной капусты кремового цвета. Диаметр до 50 см, вес до 5 кг. Растёт у оснований старых сосен. Съедобен и очень вкусен. Обладает противоопухолевыми свойствами.',
fact: 'Спарасис содержит β-1,3-глюкан — вещество, доказанно усиливающее иммунитет и применяемое в японской медицине.',
threats: ['Вырубка старых сосновых лесов', 'Сбор до созревания спор'],
conservation: 'Сохранение старых сосняков. Ограничение сбора.',
where_to_see: 'Старые сосняки Беларуси',
biomass: 1.5,
regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});
/* ── МХИ И ЛИШАЙНИКИ ─────────────────────────────────────────────────────── */
ids.lobaria = sp({
group: 'Мхи и лишайники', habitat: 'Широколиственный лес',
name_ru: 'Лобария лёгочная', name_be: 'Лёгачная лобарыя', name_lat: 'Lobaria pulmonaria',
category: 'VU', by_category: 'III',
description: 'Крупный лишайник — симбиоз гриба, водоросли и цианобактерии. Таллом похож на лёгочную ткань. Растёт только в старых нетронутых лесах с постоянной влажностью. Индикатор экологической ценности леса.',
fact: 'Лобария лёгочная фиксирует атмосферный азот. Раньше её применяли при болезнях лёгких — отсюда и название.',
threats: ['Вырубка старолесий', 'Загрязнение воздуха (SO₂)', 'Изменение микроклимата'],
conservation: 'Охрана старовозрастных лесов.',
where_to_see: 'Беловежская пуща, Налибокская пуща',
biomass: 0.05,
regions: ['brest','grodno'],
});
ids.kladon = sp({
group: 'Мхи и лишайники', habitat: 'Хвойный лес',
name_ru: 'Кладония звёздчатая', name_be: 'Зорчатая кладонія', name_lat: 'Cladonia stellaris',
category: 'VU', by_category: 'III',
description: 'Напочвенный кустистый лишайник, образующий белые кочки в сосновых борах. Один из компонентов оленьего мха — важный корм для оленей зимой. Растёт крайне медленно — 1–3 мм в год.',
fact: 'Ковёр из кладонии в сосняке может быть возрастом 200–300 лет. Протяжённость "колонии" до 10 м.',
threats: ['Пожары', 'Вытаптывание', 'Загрязнение воздуха'],
conservation: 'Охрана сухих сосняков. Противопожарные меры.',
where_to_see: 'Сухие боры Витебской, Минской, Гомельской областей',
biomass: 0.1,
regions: ['vitebsk','minsk','gomel','brest'],
});
db.exec('COMMIT');
console.log(`✓ Виды засеяны (${Object.keys(ids).length} видов)`);
} catch (e) {
db.exec('ROLLBACK');
console.error('Ошибка при вставке видов:', e.message);
process.exit(1);
}
/* ══════════════════════════════════════════════════════════════════════════
ПИЩЕВАЯ СЕТЬ
══════════════════════════════════════════════════════════════════════════ */
const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)');
db.exec('BEGIN');
const web = [
// Орлан-белохвост охотится на рыб, водоплавающих птиц
[ids.orlan, ids.sterlyadj, 0.6],
[ids.orlan, ids.usatch, 0.3],
[ids.orlan, ids.krasnozobaya_kazarka, 0.1],
// Скопа — только рыба
[ids.skopa, ids.sterlyadj, 0.7],
[ids.skopa, ids.usatch, 0.3],
[ids.skopa, ids.rylets, 0.2],
// Змееяд — рептилии
[ids.zmeeyed, ids.medyanka, 0.7],
[ids.zmeeyed, ids.cherepaha, 0.1],
// Филин
[ids.filin, ids.kosulya, 0.2],
[ids.filin, ids.bober, 0.1],
[ids.filin, ids.vydra, 0.1],
// Большой подорлик
[ids.zhuravl_seryi2, ids.trit, 0.5],
[ids.zhuravl_seryi2, ids.cherepaha, 0.3],
[ids.zhuravl_seryi2, ids.minog, 0.2],
// Рысь — косули, заяц, бобёр
[ids.rys, ids.kosulya, 0.8],
[ids.rys, ids.bober, 0.1],
[ids.rys, ids.zubatka, 0.05],
// Волк
[ids.volk, ids.kosulya, 0.7],
[ids.volk, ids.zubr, 0.1],
[ids.volk, ids.bober, 0.2],
// Выдра — рыба, лягушки
[ids.vydra, ids.sterlyadj, 0.4],
[ids.vydra, ids.minog, 0.3],
[ids.vydra, ids.usatch, 0.3],
// Норка — рыба, раки
[ids.norka, ids.rylets, 0.4],
[ids.norka, ids.minog, 0.3],
[ids.norka, ids.trit, 0.3],
// Бурый медведь — всеяден
[ids.medved, ids.bober, 0.15],
[ids.medved, ids.lobelia, 0.2],
// Журавль — насекомые, лягушки, зерно
[ids.zhuravl, ids.trit, 0.3],
[ids.zhuravl, ids.bogomol, 0.2],
// Черный аист — рыба, лягушки
[ids.chorny_aist, ids.minog, 0.4],
[ids.chorny_aist, ids.sterlyadj, 0.2],
[ids.chorny_aist, ids.trit, 0.4],
// Коростель — насекомые
[ids.dergach, ids.makhаon, 0.1],
[ids.dergach, ids.bogomol, 0.1],
// Жук-олень — мёртвая дубовая древесина
[ids.podolik, ids.lobaria, 0.1],
];
web.forEach(([p, q, s]) => insWeb.run(p, q, s));
db.exec('COMMIT');
console.log(`✓ Пищевая сеть: ${web.length} связей`);
/* ══════════════════════════════════════════════════════════════════════════
КВЕСТЫ
══════════════════════════════════════════════════════════════════════════ */
const insQ = db.prepare('INSERT INTO rb_quests (title, description, species_ids, xp_reward, badge_slug) VALUES (?,?,?,?,?)');
[
[
'Спасти зубра',
'Узнайте историю зубра — от истребления до триумфального возвращения. Пройдите 5 этапов: история вида, генетика, пищевая сеть, ареал и современная охрана.',
JSON.stringify([ids.zubr, ids.kosulya, ids.volk, ids.rys]),
200, 'quest_zubr'
],
[
'Путь чёрного аиста',
'Проследите миграцию чёрного аиста из белорусских болот в Африку. Изучите биомы, угрозы на маршруте и меры охраны.',
JSON.stringify([ids.chorny_aist, ids.zhuravl, ids.cherepaha, ids.trit]),
180, 'quest_black_stork'
],
[
'Река живёт',
'Стерлядь — символ здоровья белорусских рек. Узнайте, почему исчезают осетры и как восстановить их популяцию.',
JSON.stringify([ids.sterlyadj, ids.minog, ids.usatch, ids.vydra, ids.norka]),
160, 'quest_river'
],
[
'Последний лес',
'Беловежская пуща — последний первобытный лес Европы. Исследуйте её обитателей и поймите, почему этот лес уникален.',
JSON.stringify([ids.zubr, ids.rys, ids.filin, ids.venerina, ids.podolik, ids.truffe]),
250, 'quest_forest'
],
].forEach(args => insQ.run(...args));
console.log('✓ Квесты');
console.log('\n✅ seed-red-book.js завершён успешно!');
console.log(` Видов: ${Object.keys(ids).length}`);
console.log(' Запустите: node src/db/migrate.js && node src/db/seed-red-book.js');