Валидация геоданных

Любые геоданные в формате GeoJSON опираются на строгую спецификацию: типы геометрий, порядок координат, допустимые диапазоны значений и правила вложенности объектов. Ошибки на этом уровне приводят к некорректным вычислениям пространственных операций, особенно при использовании Turf.js.

Базовая проверка начинается с соответствия структуры объекта стандарту GeoJSON:

  • наличие поля type на каждом уровне объекта
  • корректные типы: Feature, FeatureCollection, Point, LineString, Polygon
  • наличие geometry у Feature
  • корректный формат массива coordinates

Пример минимально корректного объекта:

const point = {
  type: "Feature",
  geometry: {
    type: "Point",
    coordinates: [30.5, 50.5]
  },
  properties: {}
};

Любое отклонение от этой структуры приводит к ошибкам при обработке в гео-библиотеках, включая Turf.js, даже если синтаксически объект валиден.


Проверка типов геометрий и приведение данных

Одной из частых проблем является смешение типов данных. Например, вместо Feature передаётся Geometry, либо коллекция содержит неоднородные объекты.

Для нормализации используется подход строгого разделения:

  • FeatureCollection обрабатывает набор объектов
  • Feature инкапсулирует геометрию и свойства
  • Geometry используется только как часть Feature

Типовая проверка:

function isFeature(obj) {
  return obj && obj.type === "Feature" && obj.geometry;
}

function isFeatureCollection(obj) {
  return obj && obj.type === "FeatureCollection" && Array.isArray(obj.features);
}

При интеграции с Turf.js важно не передавать “сырые” Geometry-объекты в функции, ожидающие Feature, если явно не предусмотрено иное.


Валидация координат и диапазонов

Координаты в GeoJSON всегда следуют порядку:

[долгота, широта]

Ключевые ограничения:

  • долгота: от -180 до 180
  • широта: от -90 до 90

Ошибки в порядке координат — одна из самых распространённых причин некорректной геометрии.

Проверка координат:

function validateCoord([lng, lat]) {
  return (
    typeof lng === "number" &&
    typeof lat === "number" &&
    lng >= -180 && lng <= 180 &&
    lat >= -90 && lat <= 90
  );
}

Для сложных геометрий выполняется рекурсивная проверка вложенных массивов координат:

function validateCoordinates(coords) {
  if (typeof coords[0] === "number") {
    return validateCoord(coords);
  }
  return coords.every(validateCoordinates);
}

Топологическая корректность геометрий

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

Для выявления таких проблем применяются геометрические проверки.

Самопересечения

Полигон с самопересечением нарушает правила топологии:

import kinks from "@turf/kinks";

const result = kinks(polygon);

Если результат содержит точки, это индикатор пересечений рёбер.


Проверка корректности полигонов

Дополнительный уровень валидации включает:

  • замкнутость кольца (первая и последняя точка совпадают)
  • отсутствие дубликатов соседних точек
  • корректное направление обхода
function isClosedRing(ring) {
  const first = ring[0];
  const last = ring[ring.length - 1];
  return first[0] === last[0] && first[1] === last[1];
}

Для исправления ориентации используется:

  • rewind (нормализация направления)
  • cleanCoords (удаление лишних точек)

Нормализация геометрии перед анализом

Перед применением пространственных операций данные часто приводятся к единому виду.

Типовой пайплайн подготовки:

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

Округление:

import truncate from "@turf/truncate";

const clean = truncate(feature, { precision: 6 });

Это уменьшает ошибки вычислений при сравнении координат и пересечениях.


Проверка пересечений и пространственной логики

Геометрическая валидность часто включает проверку логики расположения объектов относительно друг друга.

Пример проверки попадания точки в полигон:

import booleanPointInPolygon from "@turf/boolean-point-in-polygon";

const inside = booleanPointInPolygon(point, polygon);

Несоответствие ожидаемой логики часто указывает на:

  • перепутанный порядок координат
  • неверную систему координат
  • некорректную топологию полигона

Использование bounding box для предварительной валидации

Bounding box позволяет быстро отсеять явно некорректные или повреждённые данные.

import bbox from "@turf/bbox";

const bounds = bbox(feature);

Дополнительная проверка диапазонов bbox помогает выявить:

  • координаты вне допустимого диапазона
  • перепутанные широта/долгота
  • “перевернутые” геометрии

Проверка согласованности FeatureCollection

FeatureCollection требует однородности входных данных. Частая ошибка — смешение разных типов геометрий без учёта контекста.

Проверка:

function validateCollection(fc) {
  const types = new Set(fc.features.map(f => f.geometry.type));
  return types.size > 0;
}

Для строгих сценариев допускается ограничение:

  • только Points
  • только LineStrings
  • только Polygons

Обработка ошибок геоданных на этапе парсинга

Валидация должна начинаться до передачи данных в гео-операции.

Типовые ошибки:

  • coordinates is undefined
  • Invalid GeoJSON object
  • position must be numbers

Стратегия обработки:

  • ранний отказ при нарушении структуры
  • логирование проблемных объектов
  • изоляция повреждённых Feature

Проверка точности и числовой стабильности

При вычислениях в геопространстве возникают погрешности округления. Это особенно критично при сравнении координат и построении полигонов.

Рекомендуемые меры:

  • фиксированная точность (5–7 знаков после запятой)
  • нормализация через округление
  • устранение микродубликатов
function roundCoord([lng, lat], precision = 6) {
  const factor = Math.pow(10, precision);
  return [
    Math.round(lng * factor) / factor,
    Math.round(lat * factor) / factor
  ];
}

Комплексная схема валидации геообъектов

Полноценная проверка геоданных включает последовательные уровни:

  1. Проверка структуры GeoJSON
  2. Проверка типов объектов
  3. Валидация координатных диапазонов
  4. Проверка топологии
  5. Нормализация данных
  6. Пространственная проверка логики
  7. Контроль числовой точности

Каждый этап снижает вероятность появления скрытых ошибок в последующих гео-операциях.


Интеграция в пайплайн обработки данных

В реальных приложениях валидация выполняется как промежуточный слой между источником данных и аналитическими операциями Turf.js.

Типовая архитектура:

  • ingestion layer (API / файлы / базы данных)
  • validation layer (структура + координаты)
  • normalization layer (cleaning + rounding)
  • analysis layer (buffer, intersect, distance и др.)

Такая схема позволяет предотвращать распространение некорректных геометрий по цепочке вычислений и снижает стоимость повторной обработки данных.