Извлечение границ полигона

Полигон в формате GeoJSON описывается как структура с массивом координат, организованных в кольца. Первое кольцо всегда определяет внешний контур, последующие — отверстия (holes), если они присутствуют. Каждое кольцо представляет собой замкнутую линию, где первая и последняя координаты совпадают.

Структура полигона:

  • coordinates[0] — внешний контур
  • coordinates[1..n] — внутренние кольца (дыры)
  • каждая точка имеет формат [долгота, широта]

Пример:

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

Библиотека 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;
}

Нарушение замыкания приводит к некорректной интерпретации границы при последующих операциях: буферизации, пересечениях и визуализации.


Геометрическая интерпретация границы

После преобразования полигона в линию структура теряет свойства площади и становится одномерной. Это означает, что операции, связанные с площадями, больше не применимы напрямую.

Границы используются для:

  • вычисления периметра через длину линии
  • построения буферных зон вокруг контуров
  • анализа пересечений границ объектов
  • упрощения геометрии

Применение polygonToLine в многополигональных структурах

При работе с MultiPolygon каждая часть обрабатывается независимо, но результат может объединяться в единый набор линий.

import { polygonToLine } from "@turf/turf";

const boundary = polygonToLine(multiPolygon);

В результате формируется MultiLineString, где каждая часть полигона сохраняет собственную границу.


Типичные ошибки при извлечении границ

При работе с Turf.js и GeoJSON часто возникают следующие проблемы:

  • отсутствие замыкания кольца
  • перепутанный порядок координат (широта/долгота)
  • игнорирование внутренних колец
  • попытка трактовать LineString как Polygon
  • потеря структуры MultiPolygon при конвертации

Каждая из этих ошибок приводит к искажению геометрии, особенно при пространственных операциях пересечения и объединения.


Использование границ в последующей обработке

Линейное представление полигона используется как промежуточный слой в геообработке. После извлечения границ возможны следующие операции Turf.js:

  • length для вычисления периметра
  • buffer для расширения границ
  • simplify для уменьшения количества точек
  • lineIntersect для поиска пересечений границ

Граница становится базовым объектом, на котором строится дальнейшая геометрическая аналитика без учета площади исходной фигуры.