Буферизация геометрии в веб-картографии — одна из базовых операций пространственного анализа, позволяющая строить зоны влияния объектов на заданном расстоянии. В контексте Mapbox GL JS такие вычисления выполняются не самим движком рендеринга, а внешними геопространственными библиотеками, чаще всего Turf.js, после чего результат отображается как GeoJSON-слой.
Буфер (buffer) — это область вокруг геометрического объекта, сформированная на фиксированном расстоянии. Для точки это круг, для линии — полоса, для полигона — расширенная граница.
В Turf.js операция реализуется через turf.buffer.
Буфер строится в географических координатах с учётом выбранной метрики расстояния:
import * as turf from '@turf/turf';
const point = turf.point([71.4304, 51.1284]);
const buffered = turf.buffer(point, 5, { units: 'kilometers' });
Результат — GeoJSON-полигон, который можно напрямую отобразить в Mapbox GL JS.
map.addSource('buffer', {
type: 'geojson',
data: buffered
});
map.addLayer({
id: 'buffer-fill',
type: 'fill',
source: 'buffer',
paint: {
'fill-color': '#3b82f6',
'fill-opacity': 0.3
}
});
Буфер часто используется для:
В Turf.js буфер строится с учётом сферической модели Земли. Это означает:
Для высокоточной аналитики важно учитывать:
Операция union объединяет несколько полигонов в один, устраняя внутренние границы.
В Turf.js используется turf.union.
const poly1 = turf.polygon([[
[71.0, 51.0],
[72.0, 51.0],
[72.0, 52.0],
[71.0, 52.0],
[71.0, 51.0]
]]);
const poly2 = turf.polygon([[
[71.5, 51.5],
[72.5, 51.5],
[72.5, 52.5],
[71.5, 52.5],
[71.5, 51.5]
]]);
const merged = turf.union(poly1, poly2);
map.addSource('union', {
type: 'geojson',
data: merged
});
map.addLayer({
id: 'union-fill',
type: 'fill',
source: 'union',
paint: {
'fill-color': '#10b981',
'fill-opacity': 0.4
}
});
Операция применяется в задачах:
Intersection возвращает область, общую для двух геометрий. Если
пересечения нет, результатом будет null.
В Turf.js используется turf.intersect.
const poly1 = turf.polygon([[
[71.0, 51.0],
[72.0, 51.0],
[72.0, 52.0],
[71.0, 52.0],
[71.0, 51.0]
]]);
const poly2 = turf.polygon([[
[71.5, 51.5],
[72.5, 51.5],
[72.5, 52.5],
[71.5, 52.5],
[71.5, 51.5]
]]);
const overlap = turf.intersect(poly1, poly2);
null, если пересечения нетif (overlap) {
map.addSource('intersection', {
type: 'geojson',
data: overlap
});
map.addLayer({
id: 'intersection-fill',
type: 'fill',
source: 'intersection',
paint: {
'fill-color': '#ef4444',
'fill-opacity': 0.5
}
});
}
Операция используется для:
В реальных задачах эти операции часто используются совместно.
const bufferA = turf.buffer(pointA, 3, { units: 'kilometers' });
const bufferB = turf.buffer(pointB, 3, { units: 'kilometers' });
const combined = turf.union(bufferA, bufferB);
const overlapZone = turf.intersect(combined, referenceArea);
В Mapbox GL JS важно разделять:
Mapbox GL JS не выполняет геоаналитику самостоятельно, поэтому архитектурно:
Сложность зависит от:
При увеличении precision растёт:
Наиболее тяжёлая операция из трёх:
Оптимизируется за счёт:
При десятках или сотнях объектов прямое использование union/intersection в браузере становится узким местом.
Используются подходы:
В Mapbox GL JS часто применяется:
map.addSource('points', {
type: 'geojson',
data: largeFeatureCollection,
cluster: true
});
После кластеризации буфер строится уже не для всех точек, а для центроидов кластеров.
При отображении результатов buffer/union/intersection важно учитывать:
'fill-outline-color': '#111827'
Также полезно использовать:
setDataMapbox GL JS позволяет динамически пересчитывать результат:
source.setData(newBufferedGeometry);
Это используется в сценариях:
Буферизация часто привязывается к событиям карты:
map.on('click', (e) => {
const pt = turf.point([e.lngLat.lng, e.lngLat.lat]);
const buf = turf.buffer(pt, 2, { units: 'kilometers' });
map.getSource('buffer').setData(buf);
});
Аналогично union и intersection могут пересчитываться при добавлении новых объектов или изменении фильтров.
Комбинация этих операций формирует основу пространственного анализа в веб-картах, где Mapbox GL JS выступает как визуальный слой, а геометрические вычисления выполняются внешними библиотеками и логикой приложения