Работа с геометрией в контексте веб-картографии строится вокруг преобразования, анализа и визуализации пространственных данных. В Mapbox GL JS геометрические операции реализуются через комбинацию встроенных методов API, GeoJSON-структур, математики проекций и внешних библиотек пространственного анализа.
Основой всех операций выступает GeoJSON. В Mapbox GL JS геометрии представлены четырьмя базовыми типами:
Каждая операция в конечном счёте сводится к преобразованию массива координат в системе WGS84 (долгота, широта) и их проекции на экран через Web Mercator.
Ключевой момент: все вычисления пользовательской геометрии выполняются в географических координатах, а отрисовка — в пиксельных координатах.
Mapbox GL JS использует Web Mercator (EPSG:3857). Это означает:
Основные методы преобразования:
map.project(lngLat) — перевод географических координат
в пикселиmap.unproject(point) — обратное преобразованиеmap.getBounds() — получение текущих границ видимой
областиПреобразования координат являются базой для всех геометрических вычислений на экране: измерений, столкновений, выделений и интерактивных операций.
Расстояние между двумя точками чаще всего вычисляется через формулу гаверсинуса или библиотеку turf:
import * as turf from '@turf/turf';
const from = [37.6173, 55.7558];
const to = [30.3351, 59.9343];
const distance = turf.distance(from, to, { units: 'kilometers' });
Использование прямой евклидовой метрики недопустимо для глобальных координат, так как приводит к существенным искажениям.
Одна из базовых операций — определение, находится ли точка внутри полигона:
const point = turf.point([37.6, 55.7]);
const polygon = turf.polygon([[
[37.0, 55.5],
[38.0, 55.5],
[38.0, 56.0],
[37.0, 56.0],
[37.0, 55.5]
]]);
const isInside = turf.booleanPointInPolygon(point, polygon);
Эта операция используется для:
Mapbox GL JS не вычисляет длину напрямую, но через Turf:
const line = turf.lineString([
[37.6, 55.7],
[38.6, 55.9]
]);
const length = turf.length(line, { units: 'kilometers' });
Используется для анимации объектов или построения маршрутов:
const segment = turf.along(line, 10, { units: 'kilometers' });
Геометрическая оптимизация формы линии:
const smooth = turf.bezierSpline(line);
Применяется для визуального улучшения маршрутов и контуров.
const area = turf.area(polygon);
Площадь вычисляется в квадратных метрах с учётом кривизны Земли.
Операции булевой геометрии:
const union = turf.union(poly1, poly2);
const intersect = turf.intersect(poly1, poly2);
Используются для:
Создание зон вокруг объектов:
const buffer = turf.buffer(point, 5, { units: 'kilometers' });
Буферизация применяется в задачах:
Mapbox GL JS позволяет работать не только с географическими координатами, но и с пиксельной сеткой.
const pixel = map.project([37.6173, 55.7558]);
const lngLat = map.unproject([x, y]);
Эти операции критичны для:
Позволяет получать геометрические данные, попадающие в область:
const features = map.queryRenderedFeatures(
[[0, 0], [300, 300]],
{ layers: ['buildings'] }
);
Используется для:
Работает на уровне источника данных:
const features = map.querySourceFeatures('my-source');
Позволяет анализировать данные до рендеринга, включая скрытые или фильтрованные объекты.
При изменении масштаба карты происходит:
Mapbox GL JS поддерживает:
Геометрически это означает применение матриц преобразования к сцене WebGL.
const bounds = map.getBounds();
Bounding box используется для:
const bbox = turf.bbox(polygon);
Хотя кластеризация воспринимается как визуальная функция, по сути это пространственное разбиение:
Mapbox GL JS поддерживает кластеризацию через источники:
map.addSource('points', {
type: 'geojson',
data: geojson,
cluster: true,
clusterRadius: 50
});
События карты возвращают координаты:
map.on('click', (e) => {
const coords = e.lngLat;
});
Дополнительно доступны:
e.point — пиксельные координатыe.lngLat — географические координатыe.features — геометрии под курсоромЭти данные используются для:
При создании редакторов карт (drawing tools) применяются операции:
Типичная схема:
Основные проблемы:
Для проверки используются:
turf.kinks(polygon);
или более сложные валидаторы топологии.
Геометрические вычисления могут быть ресурсоёмкими, поэтому применяются оптимизации:
const simplified = turf.simplify(geojson, { tolerance: 0.01 });
В custom layers геометрия передаётся напрямую в WebGL:
Это позволяет реализовывать: