Урок 14: Візуалізація OSINT-даних — мережевий аналіз та GEOINT

Навігація курсу: Хаб: Уроки

Попередній: Урок-13-Bias-та-упередження | Наступний: Урок-15-Майбутнє-OSINT

Інструменти уроку: Gephi · gephi-ai · QGIS · Kepler.gl · Neo4j · Sigma.js · Maltego


Слайди (Презентаційний текст)


ЧАСТИНА І — МЕРЕЖЕВИЙ АНАЛІЗ ТА ГРАФ-ВІЗУАЛІЗАЦІЯ


Слайд 1 — Заголовок

Візуалізація OSINT-даних

Мережевий аналіз та GEOINT

Урок 14 | AI для OSINT 2026

«Граф показує, хто з ким. Карта показує, де і коли. Разом — вони розповідають усю історію.»


Слайд 2 — Два виміри OSINT-візуалізації

Більшість аналітиків зупиняються на одному вимірі. Досвідчені — поєднують обидва.

Вимір 1 — Реляційний (граф):

  • Хто з ким пов’язаний?
  • Хто контролює потік інформації?
  • Де координація, а де органічна активність?
  • Інструменти: Gephi, Maltego, Neo4j

Вимір 2 — Просторовий (GEOINT):

  • Де фізично відбуваються події?
  • Як переміщуються люди, техніка, контент?
  • Де сконцентрована інфраструктура?
  • Інструменти: QGIS, Kepler.gl, Google Earth Pro

Коли їх поєднувати:

  • Telegram-кластер (граф) → учасники геолоковані на карті → візначення реального регіону операції
  • Мережа IP-адрес (граф) → ASN → фізична локація серверів (карта)
  • Рух підозрюваного (карта) + зустрічі = соціальний граф (граф)

Слайд 3 — Словник: ключові терміни теорії графів

ТермінВизначенняПриклад в OSINT
Вузол (Node / Vertex)Окремий об’єкт у мережіАкаунт, IP, домен, особа
Ребро (Edge / Link)Зв’язок між двома вузламиПідписка, репост, транзакція
Ступінь (Degree)Кількість ребер вузлаКількість підписників/підписок
Шлях (Path)Послідовність ребер між вузламиЛанцюжок координації між каналами
Діаметр (Diameter)Найдовший з найкоротших шляхівМіра «розтягнутості» мережі
Компонент (Component)Підграф з’єднаних вузлівІзольована мережа без зовнішніх зв’язків
Атрибут (Attribute)Властивість вузла або ребраКількість підписників, дата реєстрації
Вага (Weight)Числова інтенсивність ребраЧастота взаємодій між двома акаунтами

Слайд 4 — Типи графів: що вибирати для OSINT

Орієнтований граф (Directed graph / Digraph)

  • Ребро має напрям: A → B ≠ B → A
  • Приклад: підписки в Twitter (X), форварди в Telegram
  • Коли використовувати: аналіз ієрархій, потоків інформації, ланцюжків командування

Зважений граф (Weighted graph)

  • Кожне ребро має числову вагу
  • Приклад: частота згадок між акаунтами за тиждень
  • Алгоритми враховують вагу при обрахунку метрик

Двочастковий граф (Bipartite graph)

  • Два типи вузлів; ребра лише між різними типами
  • Приклад: акаунти ↔ канали, особи ↔ організації
  • Особливо корисний для membership-аналізу

Мультиграф (Multigraph)

  • Кілька типів ребер між одними і тими ж вузлами
  • Приклад: ті самі актори пов’язані через Telegram і через реєстр компаній

Часовий граф (Temporal / Dynamic graph)

  • Ребра і вузли мають мітки часу; структура змінюється
  • Приклад: граф Telegram-каналів у розрізі тижнів до/після виборів

Слайд 5 — Центральність: навіщо вимірювати «важливість»

Центральність (Centrality) — клас метрик, що відповідає на питання:

«Який вузол у мережі найважливіший?»

Але «важливість» — неоднозначне поняття. Різні метрики вимірюють різний тип впливу:

ПитанняМетрика
Хто має найбільше прямих зв’язків?Degree
Хто контролює потік інформації?Betweenness
Хто швидше за всіх охопить всю мережу?Closeness
Хто пов’язаний з найвпливовішими?Eigenvector / PageRank

Практичне правило: Завжди рахуйте мінімум три різних метрики центральності. Вузли, що потрапляють в топ-10% за кількома метриками одночасно, — найбільш критичні точки мережі.


Слайд 6 — Degree та Betweenness Centrality

Degree Centrality — найпростіша:

  • In-degree: кількість вхідних ребер (хто посилається на вузол)
  • Out-degree: кількість вихідних ребер (на кого посилається вузол)
  • Приклад: канал @propagandachannel має in-degree = 87 (87 каналів переслали його контент) при середньому по мережі = 4.2 → відхилення в 20 разів → підозра на координований буст
  • Обмеження: не відрізняє якісні зв’язки від бот-трафіку

Betweenness Centrality — «брокери» мережі:

Вимірює, скільки найкоротших шляхів між усіма парами вузлів проходять через даний вузол.

BC(v) = Σ (σ(s,t|v) / σ(s,t))    s≠v≠t
  • Вузол з високим betweenness = брокер: з’єднує частини мережі, що інакше б не спілкувалися
  • Видалення такого вузла фрагментує мережу

Реальний приклад (Graphika, 2019): У Russian interference networks ретранслятори між англомовним і французьким сегментами мали betweenness у 50–100 разів вище середнього при скромному загальному degree — звичайний підрахунок підписників їх би не виявив.


Слайд 7 — Eigenvector Centrality та PageRank

Eigenvector Centrality:
Вузол важливий, якщо він з’єднаний з іншими важливими вузлами. Рекурсивне визначення.

EC(v) = (1/λ) × Σ EC(u)    u∈N(v)

де λ — найбільше власне значення матриці суміжності.

Інтуїція: Один зв’язок з «суперхабом» піднімає EC вузла. Бот-ферма, яку ретвітить CNN, матиме вищий EC, ніж тисячна органічна аудиторія нішевого блогу.

PageRank (адаптований для OSINT):

PR(v) = (1-d)/N + d × Σ (PR(u) / Out-degree(u))    u→v

де d = 0.85 (damping factor), N — кількість вузлів.

Різниця EC vs PageRank:

  • EC нестабільний на орієнтованих графах із «балотними» вузлами (без вихідних ребер)
  • PageRank стабільніший завдяки damping factor — кращий вибір для Telegram/Twitter аналізу

Запуск у Gephi: Statistics → PageRank та Statistics → Eigenvector Centrality


Слайд 8 — Closeness Centrality та порівняльна таблиця

Closeness Centrality:

CC(v) = (n-1) / Σ d(v, u)    u≠v

де d(v, u) — найкоротший шлях між v та u.

  • Вузол з високим closeness розповсюдить інформацію по мережі найшвидше
  • Виявлення «посівного» акаунта, з якого стартує дезінформаційний наратив
  • Для роздрібнених мереж → Harmonic Centrality (враховує лише досяжні вузли)

Порівняльна таблиця:

МетрикаЩо вимірюєСкладністьЗастосування в OSINT
DegreeПрямі зв’язкиO(V+E)Знайти хаби, перший скан
BetweennessКонтроль потоківO(V×E)Координатори, брокери
ClosenessШвидкість охопленняO(V²)«Сіяч» інформації
EigenvectorЗв’язок з впливовимиO(V²) iter«Ампліфікатори»
PageRankАвторитетність посиланьO(V+E) iterРеальний вплив джерела

У Gephi: Statistics → Run All → атрибути в таблиці вузлів → Appearance → Size → Ranking


Слайд 9 — Community Detection та алгоритм Лувена

Спільнота (Community) — підграф, де вузли щільніше з’єднані між собою, ніж із рештою мережі.

Навіщо в OSINT: виявлення координованої неавтентичної поведінки (CIB), розбиття великих мереж на аналітичні блоки, картографування ідеологічних кластерів.

Модулярність Q:

Q = (1/2m) × Σ [A(i,j) - k(i)×k(j)/2m] × δ(c(i), c(j))

Q > 0.3 — помітна структура; Q > 0.6 — сильна кластеризація; Q ≈ 0 — випадкова мережа.

Алгоритм Лувена (Louvain, 2008):

  • Фаза 1: кожен вузол = окрема спільнота → переміщаємо до сусідньої, якщо Q зростає → до стабілізації
  • Фаза 2: кожна спільнота стискається в «супервузол» → повторити Фазу 1
  • Складність: O(n log n) — масштабується до мільярдів вузлів

Запуск у Gephi: Statistics → Modularity → Use weights → Resolution 1.0 → Run
Результат: атрибут modularity_class → Appearance → Color → Partition → modularity_class


Слайд 10 — Leiden vs Louvain та топологія мереж

Leiden (Traag et al., 2019) — навіщо:
Louvain може генерувати внутрішньо роз’єднані спільноти (вузли в групі фізично не з’єднані між собою). Leiden гарантує, що кожна спільнота — зв’язний підграф.

import igraph as ig, leidenalg
g = ig.Graph.Read_GraphML("network.graphml")
part = leidenalg.find_partition(g, leidenalg.ModularityVertexPartition)
print(f"Q={part.quality():.4f}, кластерів: {len(part)}")

На реальних Telegram-даних (5k–50k вузлів) різниця незначна. На мережах > 500k або ретвіт-графах — Leiden стабільніший.

Топологія мереж:

ТипХарактеристикаОзнака в OSINT
Scale-freeP(k) ~ k⁻ᵞ; кілька суперхабівТипові соціальні мережі; видалення 1–2% хабів = фрагментація 80%
Small-worldКороткі шляхи + висока кластеризаціяІнформація поширюється надзвичайно швидко
StarОдин центр + усі підключені до ньогоБотнет або керований медіапул
Core-peripheryЩільне ядро + периферія через ядроМедіаекосистема: великі медіа (ядро) + агрегатори

Слайд 11 — Gephi: workflow та формати

Три панелі Gephi:

  • Overview — побудова та стилізація графа
  • Data Laboratory — таблиця вузлів і ребер
  • Preview — фінальний рендер (SVG/PDF/PNG)

Стандартний OSINT workflow:

1. Імпорт (CSV edge list / GEXF / GraphML / Neo4j plugin)
2. Statistics → Degree, Modularity, PageRank, Betweenness
3. Appearance → Color (Partition: modularity_class)
4. Appearance → Size (Ranking: PageRank або Betweenness)
5. Layout → ForceAtlas 2 (500–2000 ітерацій)
6. Filters → Giant Component (видалити ізоляти)
7. Preview → мітки топ-N вузлів, товщина ребер
8. Export → PNG + GEXF

Cypher-запит Neo4j → Gephi CSV:

MATCH (u:User)-[:MEMBER_OF]->(g1:Group),
      (u)-[:MEMBER_OF]->(g2:Group)
WHERE id(g1) < id(g2)
WITH g1, g2, count(u) AS sharedMembers
WHERE sharedMembers >= 5
RETURN g1.title AS Source, g2.title AS Target, sharedMembers AS Weight

Слайд 12 — ForceAtlas 2, Sigma.js, Maltego

ForceAtlas 2 (Jacomy et al., 2014) — вузли відштовхуються як заряди, ребра притягують як пружини.

ПараметрРекомендація
LinLog modeВмикати для чіткіших кластерів
Gravity1.0 → більше = компактніший граф
Prevent OverlapВмикати після стабілізації
Edge Weight Influence1.0 = враховувати вагу

Процес: Yifan Hu 300 ітерацій (грубий layout) → ForceAtlas 2 + LinLog 1000 ітерацій → Prevent Overlap.

Sigma.js — WebGL-рендеринг графів у браузері. Gephi плагін SigmaExporter → File → Export → Sigma.js template → готовий index.html з інтерактивним графом для командного шерингу.

Maltego — link analysis із автоматичним збором даних через трансформи:

email@target.com
  → HaveIBeenPwned → Person
  → Passive DNS → Domains → IPs → ASN
  → Social profiles → Twitter connections

Maltego збирає дані в процесі; Gephi лише візуалізує. Оптимально: Maltego для розвідки → Gephi для глибокого аналізу великих датасетів.


Слайд 13 — gephi-ai + Claude: AI-асистований аналіз

gephi-ai = Java-плагін для Gephi + Python MCP-сервер + 73 MCP-інструменти для Claude.

Приклад аналітичного сеансу:

Аналітик → Claude: граф Telegram (~4800 вузлів, ~28000 ребер). Знайди ключових акторів.

Claude:
→ gephi_get_graph_stats()
→ gephi_compute_modularity()       → Q=0.71, 8 спільнот
→ gephi_compute_pagerank()         → топ-10 вузлів
→ gephi_compute_betweenness()      → брокери
→ gephi_color_by_partition(attr="modularity_class")
→ gephi_size_by_ranking(attr="pagerank")
→ gephi_run_layout(layout="ForceAtlas2", iterations=1500)
→ gephi_export_png(path="report.png")

Висновок: @relay_net — betweenness у 23× вище середнього при moderate degree.
Класичний broker між Спільнотою 2 і 5. Видалення його ізолює обидва кластери.

Claude пояснює аналітичне значення числових результатів — не просто виводить цифри.


Слайд 14 — Кейс: граф-аналіз Telegram-каналів (CIB)

Завдання: 47 україномовних Telegram-каналів про вибори → виявити ознаки координованої неавтентичної поведінки (CIB).

Граф 1 — Member Overlap: вузли = 47 каналів; ребро A↔B = кількість спільних учасників → 3 кластери (Louvain Q=0.68).

Граф 2 — Content Propagation: ребро A→B = форвард контенту → 11 каналів із cosine similarity > 0.87 публікують у вікні ±3 хвилини; один канал має betweenness у 14× вище середнього — ретранслює до всіх кластерів.

Результат:

  • Кластер 1 (23 канали): органічна аудиторія, низька кореляція
  • Кластер 2 (14 каналів): помірна синхронізація, «сірий» медіапул
  • Кластер 3 (10 каналів): синхронізація ±5 хв, overlap учасників 78–91%, один «seed» канал → ознаки CIB

ЧАСТИНА ІІ — GEOINT ТА ГЕОПРОСТОРОВА ВІЗУАЛІЗАЦІЯ


Слайд 15 — GEOINT: що це і місце в OSINT

GEOINT (Geospatial Intelligence) — розвідка, що базується на аналізі та інтерпретації геопросторових даних: зображень, карт, координат і просторових зв’язків.

Чим GEOINT відрізняється від «просто карти»:

«Просто карта»GEOINT
Показати деВідповісти на «що тут відбувається і чому»
Одна точкаПросторові паттерни + часова динаміка
Статичний знімокЗіставлення шарів різних джерел
ДекоративнаДоказова, відтворювана, атрибутована

Типові GEOINT-задачі в OSINT:

  • Геолокація фото/відео → прив’язка до місцевості через орієнтири
  • Мобільність → аналіз руху особи/техніки за геотегами публікацій
  • Верифікація → чи відбувалась подія там, де стверджується?
  • Інфраструктурна розвідка → локація серверів, штабів, логістичних вузлів
  • Паттерни активності → де і коли концентруються публікації певного контенту

Ключові інструменти: QGIS, Kepler.gl, Google Earth Pro, SunCalc, Shadow Calculator


Слайд 16 — Типи геопросторових даних

Перш ніж працювати в QGIS — розуміємо, з чим маємо справу.

Растровий шар (Raster layer):

  • Прямокутна сітка пікселів, кожен із колірним значенням (DN-value)
  • Роздільна здатність фіксована — масштабування погіршує якість
  • Приклади: супутникові знімки, аерофотозйомка, DEM (цифрова модель рельєфу)
  • Формати: GeoTIFF, ECW, JPG2000

Векторний шар (Vector layer):

  • Геометрії визначені математично: точки, лінії, полігони
  • Масштабується без втрати якості
  • Приклади: дороги, кордони, точки POI, будівлі
  • Формати: Shapefile (.shp), GeoJSON, KML/KMZ, GeoPackage

WMS-шар (Web Map Service):

  • Растрові тайли, що надсилає сервер на запит
  • Дозволяє підключити Google Maps, OpenStreetMap, Bing Satellite безпосередньо в QGIS
  • Не зберігається локально — потрібен інтернет
  • Використовується як фонова підложка для накладання аналітичних шарів

OSINT-правило: Завжди зберігайте локальні копії растрів, якщо вони є доказовою базою. WMS-сервіси можуть змінювати або видаляти архівні знімки.


Слайд 17 — QGIS: огляд, встановлення, інтерфейс

QGIS — безкоштовна крос-платформна геоінформаційна система (GIS) з відкритим кодом. Стандарт для OSINT-аналітиків, що не хочуть платити за ArcGIS.

Встановлення:

  • Windows: рекомендується OSGeo4W Network Installer — дає доступ до розширених інструментів (GDAL, GRASS, SAGA), яких немає в standalone installer
  • Linux: sudo apt install qgis (Ubuntu/Debian) або sudo pacman -S qgis (Arch/Manjaro)
  • macOS: офіційний installer з qgis.org

Основні елементи інтерфейсу:

ЕлементПризначення
Map CanvasОсновний вид карти
Layers PanelСписок всіх завантажених шарів (порядок = рендеринг)
Browser PanelФайлова система + бази даних + WMS-з’єднання
Attribute TableТаблиця атрибутів векторного шару (аналог БД)
Processing Toolbox500+ алгоритмів аналізу (GDAL, SAGA, GRASS, нативні)

Система координат (CRS):

  • EPSG:4326 — WGS84 (GPS координати, градуси) — найпоширеніша для OSINT даних
  • EPSG:3857 — Web Mercator (Google Maps, OSM) — для WMS підложок
  • QGIS автоматично перепроєктує шари «на льоту» — але краще явно призначати CRS імпортованим даним

Слайд 18 — QGIS: ключові плагіни для OSINT

Плагіни встановлюються через Plugins → Manage and Install Plugins.


Плагін 1 — Streetview

Миттєвий перехід з карти QGIS до Google Street View.

Як використовувати:

  1. Встановити плагін Streetview
  2. Натиснути кнопку Streetview на панелі інструментів
  3. Клікнути на точку на карті
  4. Браузер автоматично відкриє Street View за цими координатами

Навіщо в OSINT:

  • Швидка геолокаційна верифікація: порівняти орієнтири на фото з реальним виглядом місцевості
  • Перевірка стану будівлі/об’єкта на різних датах (якщо є архівні Street View)
  • Підтвердження, що маршрут/локація є фізично досяжною

Плагін 2 — QuickMapServices (QMS)

Підключення фонових картографічних підложок в один клік.

Встановлення + активація розширеного каталогу:

  1. Встановити плагін QuickMapServices
  2. Web → QuickMapServices → Settings → More services → Get contributed pack
  3. Перезавантажити QGIS

Доступні підложки:

  • Google Satellite Hybrid — супутниковий знімок + підписи — найкорисніша для OSINT
  • Google Maps / Google Terrain
  • Bing Aerial
  • OpenStreetMap Standard / Topo
  • ESRI World Imagery
  • Stamen Toner (чорно-біла для контрасту при накладанні шарів)

Як використовувати: Web → QuickMapServices → Google → Google Satellite Hybrid — підложка з’являється знизу стека шарів.


Плагін 3 — QuickOSM

Запит до OpenStreetMap через Overpass API безпосередньо з QGIS.

Як використовувати:

  1. Vector → QuickOSM → QuickOSM
  2. Заповнити форму:
    • Key — тег OSM (наприклад, amenity, shop, military)
    • Value — значення тегу (наприклад, hospital, tattoo, base)
    • Location — назва міста/регіону або bbox
  3. Run query
  4. Результат: векторний шар із точками/полігонами на карті + атрибутивна таблиця

Слайд 19 — QuickOSM: практика геопросторової розвідки

QuickOSM дозволяє витягнути будь-яку інфраструктуру з OpenStreetMap за тегами.

OSM Tag система:
OpenStreetMap використовує пари ключ=значення (key=value) для опису об’єктів.
Довідник тегів: https://wiki.openstreetmap.org/wiki/Map_features

Приклади OSINT-запитів:

KeyValueЩо отримаємо
amenityfuelВсі АЗС у регіоні (логістика, маршрути)
militarybarracks / baseВійськова інфраструктура
amenityhospitalЛікарні (верифікація медевакуації)
shoptattooТату-салони (верифікація локації за фото татуювань)
landuseindustrialПромислові зони
buildingwarehouseСклади (логістика)
amenityplace_of_worshipРелігійні об’єкти

Практичний кейс:
Є фото підозрюваного перед характерним магазином. На вивісці видно латинські букви, на задньому плані — висотка радянського стилю.

  1. QuickOSM: shop=tattoo, location=Запоріжжя → отримуємо точки всіх тату-салонів
  2. Street View кожної точки → порівняти задній план
  3. Підтвердження або виключення кожного варіанту

Обмеження QuickOSM: OSM — не офіційна карта. Дані волонтерські, можуть бути неповними або застарілими для специфічних об’єктів (особливо в зонах конфліктів).


Слайд 20 — QGIS: просунуті техніки для OSINT

Техніка 1 — Temporal Controller (Часовий контролер)

Анімація геопросторових подій у часі.

  1. Додати до векторного шару атрибут datetime (ISO 8601: 2026-01-15T14:22:00)
  2. Клікнути на шар → Properties → Temporal → увімкнути Dynamic Temporal Control
  3. View → Temporal Controller Panel
  4. Встановити часовий діапазон і крок (годину, добу, тиждень)
  5. Натиснути Play → QGIS анімує точки у часі

Застосування: Маршрут переміщення особи з гео-тегованих публікацій; поширення контенту по регіонах; динаміка пошкоджень інфраструктури.


Техніка 2 — Heatmap (KDE — Ядерна оцінка щільності)

Візуалізація концентрації точкових об’єктів.

Processing Toolbox → Interpolation → Heatmap (Kernel Density Estimation)

  • Input: векторний шар точок
  • Radius: радіус ядра (у метрах CRS)
  • Output: растровий шар де яскравіше = більша щільність

Застосування: Концентрація публікацій із певним хештегом за регіонами; зони підвищеної активності підозрюваного; кластеризація повідомлень з місць подій.


Техніка 3 — EXIF Extractor

Плагін EXIF Tool або Photo2Shape витягує GPS-координати з EXIF-метаданих фотографій і одразу наносить їх на карту як точковий шар.

# Командний рядок через ExifTool перед QGIS
exiftool -csv -GPSLatitude -GPSLongitude -DateTimeOriginal *.jpg > photo_locations.csv

Потім імпортувати CSV у QGIS: Layer → Add Layer → Add Delimited Text Layer → задати поля lat/lon.


Техніка 4 — Spatial Join

Зіставлення двох шарів за просторовим критерієм.

Vector → Data Management → Join Attributes by Location

Приклад: шар IP-адрес з геолокацією (точки) + шар адміністративних кордонів (полігони) → автоматично визначити, до якої країни/регіону належить кожен IP.


Слайд 21 — Kepler.gl: як це працює зсередини

Kepler.gl (Foursquare / колишній Uber) — open source React-застосунок для інтерактивної геовізуалізації мільйонів точок у браузері в реальному часі.

Архітектура (три шари):

┌─────────────────────────────────────────────┐
│              Браузер / Jupyter               │
├─────────────────────────────────────────────┤
│  React UI (Styled-Components)               │
│  Redux store  ←→  keplerGl reducer          │
│  react-palm middleware (async side effects) │
├─────────────────────────────────────────────┤
│  deck.gl  — GPU-рендеринг шарів даних       │
│  MapLibre GL — рендеринг базової карти      │
└─────────────────────────────────────────────┘
  • deck.gl (від Uber/Vis.gl) — WebGL-бібліотека для рендерингу геопросторових шарів. Саме вона «малює» мільйони точок за 60 fps, виконуючи агрегацію (hexbin, heatmap) прямо на GPU.
  • MapLibre GL — open source рушій базової карти (форк Mapbox GL після зміни ліцензії). Відображає тайли підложки.
  • Redux — весь стан застосунку (шари, фільтри, viewport) зберігається в одному Redux-store під ключем keplerGl. Це означає: стан серіалізується в JSON і відновлюється повністю.

Формат вхідних даних:

Kepler.gl приймає дані у вигляді об’єкта з двома полями:

{
  info: { id: "my_dataset", label: "Telegram Events" },
  data: {
    fields: [
      { name: "lat",       type: "real" },
      { name: "lng",       type: "real" },
      { name: "timestamp", type: "timestamp", format: "YYYY-MM-DDTHH:mm:ssZ" },
      { name: "actor",     type: "string" },
      { name: "count",     type: "integer" }
    ],
    rows: [
      [50.4501, 30.5234, "2026-01-15T14:22:00Z", "@channel_kyiv", 143],
      [48.9226, 24.7111, "2026-01-15T14:22:00Z", "@channel_lviv", 67]
    ]
  }
}

CSV, GeoJSON, і навіть Shapefile (через конвертацію) також приймаються через drag-and-drop у веб-інтерфейсі.

Типи шарів:

ШарРендерингOSINT-застосування
PointКола/іконкиОкремі події, акаунти, пристрої
ArcКриві між парами координатПереміщення, потоки між містами
HeatmapKDE на GPUЩільність публікацій по регіонах
HexbinАгрегація по гексагонахЗведена активність по зонах
GeoJSONПолігони/лініїАдміністративні кордони, зони
TripАнімовані маршрутиРух об’єкта в часі (потребує timestamp)
GridАгрегація по прямокутних коміркахАльтернатива hexbin

Trip layer — ключовий для аналізу переміщень:

trip_id,timestamp,lng,lat
vehicle_01,2026-01-15T08:00:00Z,30.5234,50.4501
vehicle_01,2026-01-15T09:30:00Z,31.2345,49.9876
vehicle_01,2026-01-15T11:00:00Z,32.0567,49.5432

Kepler.gl анімує маршрут у часі — ідеально для демонстрації переміщення техніки або відстеження особи за геотегами.

Вбудовування у власний застосунок (React/npm):

npm install @kepler.gl/components @kepler.gl/reducers @kepler.gl/actions
import KeplerGl from '@kepler.gl/components';
import { addDataToMap } from '@kepler.gl/actions';
 
// Програмне завантаження даних
dispatch(addDataToMap({
  datasets: myDataset,
  config: savedConfig,   // відновити збережену конфігурацію
  options: { centerMap: true, readOnly: false }
}));

Збереження/відновлення конфігурації:

// Зберегти поточний стан (шари, фільтри, viewport) як JSON
const config = KeplerGlSchema.getConfigToSave(store.getState().keplerGl.map);
// → config.json можна завантажити назад і точно відтворити карту

Python / Jupyter підтримка:

from keplergl import KeplerGl
map_1 = KeplerGl(height=600)
map_1.add_data(data=df, name="telegram_events")
map_1  # відображається прямо в notebook
map_1.save_to_html(file_name="report_map.html")  # самодостатній HTML-файл

Kepler.gl vs QGIS — коли що:

ЗадачаKepler.glQGIS
Мільйони точок у браузері✅⚠️ повільно
Анімація Trip у реальному часі✅✅ (Temporal Controller)
Просторовий join, буфер, overlay❌✅
Запит до OSM Overpass❌✅ (QuickOSM)
Публікація як HTML без сервера✅⚠️ складніше
Jupyter-інтеграція✅❌
Векторний PDF/SVG-експорт❌✅

Для публікацій, брифінгів і великих датасетів → Kepler.gl. Для аналізу, запитів, overlay → QGIS.


Слайд 22 — Геолокація та верифікація: практичний pipeline

Геолокація — процес визначення точної географічної позиції за ознаками на фото/відео без GPS-даних.

Pipeline верифікації:

1. ЗБІР ОЗНАК
   ├── Архітектурний стиль (радянська висотка, сучасний ЖК, промобудівля)
   ├── Вивіски, написи, мова (кирилиця, латиниця, мова)
   ├── Природні орієнтири (рельєф, річка, характерне дерево)
   ├── Дорожня розмітка і знаки (стандарти різних країн)
   └── Тіні (напрямок → сонце → час доби та сезон через SunCalc)

2. ГІПОТЕЗА ЛОКАЦІЇ
   ├── Google Maps / Yandex Maps текстовий пошук
   ├── QuickOSM → об'єкти в підозрілому районі
   └── Wikimapia для промислових/специфічних об'єктів

3. ВЕРИФІКАЦІЯ
   ├── Google Street View (плагін QGIS Streetview)
   ├── Google Earth Pro → Historical Imagery (порівняння за датами)
   ├── Bing Maps Bird's Eye View (похилі знімки 45°)
   └── Mapillary / KartaView (Street View від спільноти)

4. ДОКУМЕНТАЦІЯ
   ├── Скріншот знімку з джерела + скріншот карти
   ├── Координати в десятковому форматі (50.4501, 30.5234)
   └── Посилання на джерело карти + дата знімку

Важливо: Геолокація підтверджує, де зроблено знімок — не коли. Для верифікації дати потрібні: метадані файлу, тіні (SunCalc), сезонні ознаки, нумерні таблиці авто, актуальні вивіски.


Слайд 23 — Геопросторовий кейс: картографування логістики

Сценарій: Моніторинг руху важкої техніки за відеозаписами з соцмереж.

Крок 1 — Збір:

  • 47 відео з Telegram, датовані тижнем X
  • Кожне відео геолоковане вручну або з EXIF
  • Результат: 47 точок із атрибутами: дата, час, тип техніки, напрямок руху

Крок 2 — QGIS аналіз:

  • Завантажити точки як CSV шар
  • QuickMapServices → Google Satellite Hybrid підложка
  • Temporal Controller → анімація за часом → виявлення маршруту
  • Arc layer в Kepler.gl → потоки між точками → виявлення вузлових точок

Крок 3 — Просторовий аналіз:

  • Processing → Nearest Neighbor Analysis → чи є кластеризація точок?
  • Buffer 5 km навколо кожної точки → Dissolve → коридор переміщення
  • Overlay з шаром доріг (QuickOSM: highway=primary/secondary) → можливі маршрути

Крок 4 — Cross-reference з графом:

  • Telegram-канали, що опублікували ці відео → граф у Gephi
  • Чи є кореляція між географічним кластером і мережевим кластером?
  • Якщо так — можлива регіональна координаційна структура

Слайд 24 — Temporal Analysis: мережа у часі

Статичний граф = накопичений стан. Часовий граф = як мережа народжувалась і змінювалась.

Ключові часові патерни:

Burst Detection: різке зростання degree/ваги за короткий час → координований буст або «активація» сплячого акаунта.

Temporal Community Shift: вузол переходить зі спільноти A до B → pivot у наративі.

Creation Pattern: 50 акаунтів зареєстровані за 48 годин і одночасно активувались → явна координація.

GEXF з часовими даними:

<node id="n1" label="@account_x">
  <spells>
    <spell start="2025-10-01" end="2026-03-15"/>
  </spells>
</node>
<edge source="n1" target="n2">
  <spells><spell start="2025-11-20"/></spells>
</edge>

Window → Timeline у Gephi → автоматично зчитує start/end → анімація зміни графа.


Слайд 25 — Правила публікації: граф і карта для звіту

Публікований матеріал ≠ робочий матеріал.

Для графів:

  1. Видалити ізольовані вузли (Filters → Giant Component)
  2. Розмір вузла = метрика (завжди легенда)
  3. Колір = спільнота (не більше 8–10 кольорів, colorblind-friendly)
  4. Мітки лише для топ-N вузлів
  5. Завжди PNG для показу + GEXF для відтворюваності

Для карт:

  1. Масштабна лінійка та стрілка Північ — обов’язково
  2. Легенда для кожного шару з поясненням символів
  3. Джерело підложки та дата знімку (особливо для супутникових)
  4. Координатна сітка або bbox у підписі
  5. Вказати проєкцію CRS (важливо для вимірювань відстаней)
  6. Окремий шар = окрема легенда; не суміщати несумісні типи даних

Спільне правило:

Аналітична візуалізація — це доказовий матеріал. Кожен елемент має пояснення. Будь-який читач повинен відтворити вашу логіку з цієї картинки і метаданих.


Слайд 26 — Резюме та ключові виводи

Урок 14 охопив два виміри OSINT-візуалізації:

Мережевий аналіз:

  • Метрики центральності (Degree, Betweenness, Closeness, Eigenvector, PageRank)
  • Community Detection: Louvain Q-модулярність, Leiden для великих мереж
  • Топологія: Scale-free, Small-world, Star, Core-periphery
  • Gephi workflow: ForceAtlas 2, GEXF, Sigma.js, gephi-ai + Claude

GEOINT:

  • Типи геоданих: Raster, Vector, WMS
  • QGIS: OSGeo4W, Streetview, QuickMapServices, QuickOSM
  • Просунуті техніки: Temporal Controller, KDE Heatmap, EXIF, Spatial Join
  • Kepler.gl для веб-публікації та великих датасетів
  • Pipeline геолокаційної верифікації

Золоте правило:

Мережева метрика — гіпотеза. Геолокація — підтвердження. Разом вони переводять цифровий слід у реальний простір і час. Аналітик вирішує, що це означає.


Домашнє завдання — ДЗ 14

Назва: «Від мережі до карти»


Рівень 1 — Базовий (обов’язковий)

Частина А — Мережевий аналіз у Gephi:

Знайдіть або зберіть публічно доступний граф (мінімум 100 вузлів, 300 ребер):

  • Telegram-канал через Groupint
  • Датасет з SNAP (ego-Facebook, twitter_combined)
  • Датасет з Network Repository

Виконайте:

  1. Обрахуйте Degree, Modularity (Louvain), PageRank, Betweenness
  2. ForceAtlas 2 (мінімум 500 ітерацій), Giant Component filter
  3. Колір за modularity_class, розмір за PageRank, мітки топ-10 за betweenness
  4. Експортуйте PNG (1920×1080+) та GEXF

Частина Б — QGIS:

  1. Встановіть QGIS (OSGeo4W) та плагіни: QuickMapServices, QuickOSM, Streetview
  2. Підключіть підложку Google Satellite Hybrid
  3. Виконайте QuickOSM-запит для будь-якого міста на вашу тему (наприклад: amenity=hospital, military=barracks, shop=supermarket)
  4. Зробіть скріншот карти з підложкою, результатами запиту, легендою та масштабною лінійкою

Звіт (мінімум 400 слів):

  • Що виявив Louvain? Значення Q? Кількість спільнот?
  • Топ-3 вузли за betweenness — яка їх роль у мережі?
  • Що показав QuickOSM-запит? Яке аналітичне питання ви намагались вирішити цим запитом?
  • Яка топологія мережі? Обґрунтуйте через розподіл degree.

Рівень 2 — Розширений (додаткові бали)

Варіант А — Геолокаційна верифікація:

  1. Знайдіть будь-яке публічне фото з геопросторовою загадкою (місце не підписано явно)
  2. Пройдіть повний pipeline верифікації зі Слайду 22: збір ознак → гіпотеза → верифікація через Street View + Google Earth
  3. Задокументуйте кожен крок зі скріншотами
  4. Нанесіть результат на карту в QGIS: підложка + точка локації + анотація

Варіант Б — Temporal аналіз:

  1. Зберіть або підготуйте геодані з часовим атрибутом (мінімум 50 точок, 3+ різних дати)
  2. Завантажте в QGIS, налаштуйте Temporal Controller
  3. Зробіть 4–5 скріншотів у різних часових зрізах із поясненням змін
  4. Що анімація показує про паттерн активності?

Рівень 3 — Дослідницький (максимум балів)

Поєднання мережевого аналізу та GEOINT:

  1. Зберіть дані, що мають і мережевий, і просторовий вимір (наприклад: Telegram-канали з відомою географічною прив’язкою учасників або геолоковані публікації з визначеного регіону)
  2. Побудуйте граф у Gephi → виявіть кластери
  3. Нанесіть вузли/актори на карту в QGIS → чи збігаються мережеві кластери з географічними кластерами?
  4. Використайте KDE Heatmap для просторової щільності активності
  5. Зробіть Kepler.gl Arc layer, що показує потоки між локаціями

Питання для відповіді в звіті: Чи існує просторова кореляція між мережевими спільнотами та географічними регіонами? Що це може свідчити про характер мережі?


Формат здачі

  • Граф: ДЗ14_Прізвище.gephi + ДЗ14_Прізвище_graph.png
  • Карта: ДЗ14_Прізвище_map.png (скріншот QGIS із легендою)
  • Звіт: ДЗ14_Прізвище_report.md
  • Дедлайн: до наступного заняття
  • Захист: 5 хвилин — показати і граф, і карту, пояснити знахідки

Критерії оцінювання

КритерійРівень 1Рівень 2Рівень 3
Технічна правильність (Gephi)30%25%20%
Технічна правильність (QGIS)20%20%15%
Якість візуалізацій15%15%15%
Аналітична інтерпретація25%25%35%
Оформлення звіту10%10%10%
Геолокаційний pipeline / Cross-аналіз—5% бонус5% бонус

Кінець Уроку 14. Матеріали до наступного заняття: Урок-15-Майбутнє-OSINT