Полигон в формате GeoJSON описывается как структура с массивом координат, организованных в кольца. Первое кольцо всегда определяет внешний контур, последующие — отверстия (holes), если они присутствуют. Каждое кольцо представляет собой замкнутую линию, где первая и последняя координаты совпадают.
Структура полигона:
[долгота, широта]Пример:
const polygon = {
type: "Polygon",
coordinates: [
[
[37.61, 55.75],
[37.62, 55.75],
[37.62, 55.76],
[37.61, 55.76],
[37.61, 55.75]
]
]
};
Геометрическая корректность полигона зависит от соблюдения замкнутости кольца и правильного порядка обхода точек (обычно против или по часовой стрелке в зависимости от стандарта и библиотеки обработки).
Граница полигона — это линейное представление его внешнего и внутренних контуров. В терминах геоинформационных систем граница рассматривается как набор LineString-объектов, которые повторяют форму всех колец полигона.
Выделяются два уровня границ:
При преобразовании полигона в границы важно учитывать сохранение топологии: порядок точек, замыкание контуров и отсутствие самопересечений.
Библиотека Turf.js предоставляет функцию преобразования полигона в
линейную геометрию через polygonToLine. Эта операция
является базовой для задач визуализации, анализа периметра и построения
маршрутов вдоль границ.
import { polygonToLine } from "@turf/turf";
const boundary = polygonToLine(polygon);
Результатом является LineString или MultiLineString, в зависимости от наличия внутренних колец.
Если требуется работа только с внешней границей, используется первый элемент массива координат полигона.
import { lineString } from "@turf/turf";
const outerRing = lineString(polygon.coordinates[0]);
Этот подход применяется, когда внутренние отверстия не влияют на анализ, например при расчёте периметра внешнего контура или генерации визуального обвода объекта.
Полигоны могут содержать несколько отверстий. Каждое внутреннее кольцо также является замкнутой линией и может быть извлечено отдельно.
const holes = polygon.coordinates.slice(1).map(ring =>
lineString(ring)
);
В задачах пространственного анализа внутренние кольца могут использоваться для:
При необходимости получить полную границу полигона в виде набора линий используется комбинированный подход.
import { featureCollection, lineString } from "@turf/turf";
function extractAllBoundaries(polygon) {
const lines = polygon.coordinates.map(ring => lineString(ring));
return featureCollection(lines);
}
Такой подход сохраняет структуру каждого кольца отдельно, что удобно для последующей аналитики или стилизации на карте.
Каждое кольцо полигона в GeoJSON должно быть замкнутым. Однако при обработке данных часто встречаются незамкнутые последовательности координат. Turf.js не всегда автоматически исправляет такие ошибки, поэтому контроль замыкания выполняется явно.
Проверка и исправление:
function closeRing(coords) {
const first = coords[0];
const last = coords[coords.length - 1];
if (first[0] !== last[0] || first[1] !== last[1]) {
coords.push(first);
}
return coords;
}
Нарушение замыкания приводит к некорректной интерпретации границы при последующих операциях: буферизации, пересечениях и визуализации.
После преобразования полигона в линию структура теряет свойства площади и становится одномерной. Это означает, что операции, связанные с площадями, больше не применимы напрямую.
Границы используются для:
При работе с MultiPolygon каждая часть обрабатывается независимо, но результат может объединяться в единый набор линий.
import { polygonToLine } from "@turf/turf";
const boundary = polygonToLine(multiPolygon);
В результате формируется MultiLineString, где каждая часть полигона сохраняет собственную границу.
При работе с Turf.js и GeoJSON часто возникают следующие проблемы:
Каждая из этих ошибок приводит к искажению геометрии, особенно при пространственных операциях пересечения и объединения.
Линейное представление полигона используется как промежуточный слой в геообработке. После извлечения границ возможны следующие операции Turf.js:
length для вычисления периметраbuffer для расширения границsimplify для уменьшения количества точекlineIntersect для поиска пересечений границГраница становится базовым объектом, на котором строится дальнейшая геометрическая аналитика без учета площади исходной фигуры.