Для розрахунку щільності небезпечних подій, викликаних збройною агресією РФ проти України, використані дані Ukraine Conflict Monitor. Враховані небезпечні події за весь час повномасштабної війни в Україні з 24 лютого 2022 року до 19 квітня 2024 року. Джерело: https://acleddata.com/ukraine-conflict-monitor/
Розрахунки здійснені з використанням бази даних PostgreSQL із розширенням PostGIS, візуалізацію карт здійснено в QGIS.
Алгоритм складання карти включає наступні дії.
- Завантажити дані із небезпечними подіями в форматі csv. Дані містять поля типу та дати події, отже на даний момент наведені події з 24 лютого 2022 року до 19 квітня 2024 року. За типом події можна побачити кількість подій.
select "Event Type", count(*)
from ukraine_data_invasion
group by "Event Type"
order by count(*) desc;
- Імпортувати цю таблицю до бази даних PostgreSQL. Додати до неї два стовпчики: id та geom.
ALTER TABLE ukraine_data_invasion
ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE ukraine_data_invasion
ADD COLUMN geom geometry(Point, 4326);
- На основі довготи та широти створюємо атрибут геометрії події.
update ukraine_data_invasion
set geom = ST_SetSRID(ST_MakePoint("Longitude", "Latitude"), 4326);
- Одержані дані вже можна нанести на карту в QGIS.

- Розрахувати кількість небезпечних подій в межах кожної старої сільської, селищної або міської ради.
create table danger_radas as
select t.fid,
t.geom,
count(k.*) as d_index
from admin_3_old as t
left join ukraine_data_invasion as k on st_contains(t.geom, k.geom)
group by t.fid;

- Схожим чином можна розрахувати щільність небезпечних подій в межах цих рад, кількість/кв. км.
create table danger_radas_2 as
select t.fid,
t.geom,
count(k.*)/area_km as d_index
from admin_3_old as t
left join ukraine_data_invasion as k on st_contains(t.geom, k.geom)
group by t.fid;

- Створити просторові індекси у таблицях, з якими працюємо (admin_3_old – таблиця “межі старих рад”; ukraine_data_invasion – таблиця “небезпечні події”).
CREATE INDEX adm3_old_idx
ON admin_3_old
USING GIST (geom);
CREATE INDEX adm3centroid_idx
ON admin_3_old
USING GIST (centroid);
CREATE INDEX uinv_idx
ON ukraine_data_invasion
USING GIST (geom);
- Додати поля для статистичних розрахунків у межах рад.
ALTER TABLE admin_3_old
ADD COLUMN ind_time DOUBLE PRECISION;
ALTER TABLE admin_3_old
ADD COLUMN ind_idw DOUBLE PRECISION;
ALTER TABLE admin_3_old
ADD COLUMN ind_total DOUBLE PRECISION;
- Врахувати час з моменту події. Адже події, які відбулися нещодавно або щойно, мають, на нашу думку, отримати більшу вагу, ніж події, які сталися рік тому. Враховується обернений вплив часу на значимість небезпечних подій за нелінійною степеневою залежністю.
update admin_3_old
set ind_time = idx_ev
from (select t.fid,
t.geom,
(sum(1 / ((to_date('04/21/24', 'MM/DD/YY') - to_date(k."Event Date", 'MM/DD/YY'))::numeric) ^ 0.3)) /
t.area_km as idx_ev
from admin_3_old as t
left join ukraine_data_invasion as k on st_contains(t.geom, k.geom)
where k.id notnull
group by t.fid) as m
where admin_3_old.fid = m.fid;

- Нобхідно врахувати відстані. Адже ради, які знаходяться поблизу небезпечних подій в сусідніх радах, також неможна вважати безпечними. Для цього слід визначити центроїди старих рад сільських, селищних та міських рад, оскільки для цієї задачі, на нашу думку достатньо буде центроїдів. Слід використати систему координат проєкції (наприклад, EPSG:3857) аби адекватно рахувати відстані.
ALTER TABLE admin_3_old
ADD COLUMN centroid geometry(Point, 3857);
update admin_3_old
set centroid = st_setsrid(st_centroid(geom), 3857);
- Врахувати звортно-зважені відстані (inverse distance weighting – IDW) пропонується в межах кожної ради спеціальним способом.
update admin_3_old as itp
set ind_idw = (select 0.1 * sum(z / d) / sum(1 / d)
from (select smpl.ind_time as z,
(0.1 + st_distance(itp.centroid, smpl.centroid)) ^ 2.0 as d
from admin_3_old as smpl
where smpl.ind_time is not null
and st_distance(itp.geom, smpl.geom) < 40000
order by itp.centroid <-> smpl.centroid
limit 50) sq);

- Загальний індекс небезпечних територій є сумою двох попередніх (індексу врахування часу та індексу врахування відстаней).
update admin_3_old
set ind_total = ind_idw + coalesce(ind_time, 0);

Запропонований підхід щодо розрахунку та візуалізації щільності небезпечних подій є певною мірою суб’єктивним. За інших параметрів, налаштувань алгоритму результат може мати інший вигляд. Але, на нашу думку, цей алгоритм демонструє наступний важливий висновок: небезпечними є території поблизу лінії фронту на відстані до 100 км, столичний регіон, окремі великі міста та значимі об’єкти. Небезпечними є території вздовж кордону з Російською Федерацією та Білоруссю як мінімум на 50-70 км. При цьому інші території є умовно безпечними, принаймні за статистичними розрахунками.

Залишити відповідь