Диаграмма Вороного представляет собой разбиение плоскости на области влияния точек-наблюдателей (seed points). Для каждой исходной точки формируется полигон, содержащий все точки пространства, которые ближе к данной точке, чем к любым другим.
Формально:
[ d(x, p_i) d(x, p_j), j i]
где ( d ) — евклидово расстояние.
Границы диаграммы формируются серединными перпендикулярами между парами точек, а вершины — пересечениями этих перпендикуляров.
Библиотека Turf.js реализует вычисление диаграммы Вороного через функцию:
turf.voronoi(points, options)
Функция работает с:
points — FeatureCollection<Point> в
формате GeoJSONПример структуры:
const points = turf.featureCollection([
turf.point([37.62, 55.75]),
turf.point([37.61, 55.76]),
turf.point([37.63, 55.74])
]);
Ключевым параметром является bbox, который задаёт
границы вычисления диаграммы:
const options = {
bbox: [37.50, 55.70, 37.70, 55.80]
};
Формат bbox:
[minX, minY, maxX, maxY]
Без этого ограничения алгоритм не может корректно завершить построение полигонов, поскольку Вороной-ячейки в теории являются бесконечными.
import * as turf from "@turf/turf";
const points = turf.featureCollection([
turf.point([0, 0]),
turf.point([10, 0]),
turf.point([5, 10])
]);
const bbox = [ -5, -5, 15, 15 ];
const voronoiPolygons = turf.voronoi(points, { bbox });
console.log(voronoiPolygons);
Результат:
FeatureCollection<Polygon>null-результаты при недостатке данныхКаждый полигон Вороного:
Свойства:
Внутри Turf.js используется геометрический подход:
bboxКлючевой момент:
Диаграмма Вороного в Turf.js работает в декартовой интерпретации координат, поэтому:
Практическое следствие:
Полигональные ячейки на границах bbox:
Причина:
const map = L.map("map").setView([55.75, 37.62], 12);
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(map);
L.geoJSON(voronoiPolygons, {
style: {
color: "#3388ff",
weight: 2,
fillOpacity: 0.2
}
}).addTo(map);
Поверх слоя Вороного обычно накладываются исходные точки:
L.geoJSON(points, {
pointToLayer: (feature, latlng) => L.circleMarker(latlng)
}).addTo(map);
Диаграмма Вороного в геопространственных задачах используется для:
Каждая точка — объект инфраструктуры, полигон — зона влияния.
Анализ равномерности распределения станций, складов, датчиков.
Визуальная сегментация плотности точек.
Генерация территорий влияния фракций или объектов.
При использовании Turf.js проявляются следующие ограничения:
Особенно критично:
Возможные ситуации:
Возникает при:
Причины:
Диаграмма Вороного и триангуляция Делоне являются дуальными структурами:
Следствие:
При работе с Turf.js применяются подходы:
При увеличении количества точек:
Практический предел зависит от окружения, но уже несколько тысяч точек могут быть вычислительно тяжёлыми без оптимизации.
Проблемы устойчивости возникают при:
Это приводит к:
Выход Turf.voronoi:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [...]
},
"properties": {}
}
]
}
Каждый полигон соответствует одной входной точке, но связь не всегда явно сохраняется в свойствах, поэтому при необходимости выполняется сопоставление по индексу входного массива.
В отличие от серверных библиотек:
В отличие от computational geometry библиотек: