Генерация случайных точек

Генерация случайных географических точек в Turf.js выполняется через модуль @turf/random, который предоставляет инструменты для создания псевдослучайных пространственных объектов: точек, позиций, линий и полигонов. Основная задача этих методов — формирование синтетических наборов геоданных, тестирование алгоритмов пространственного анализа, моделирование распределений и построение демонстрационных карт.

Пакет @turf/random построен вокруг генераторов, которые используют равномерное распределение в пределах заданных географических ограничений. В отличие от простого случайного выбора координат, генерация учитывает географические границы, проекции и геометрические маски.

Ключевая особенность заключается в том, что выходные данные всегда соответствуют GeoJSON-структурам, что позволяет напрямую использовать их в пространственных операциях Turf.js без дополнительной трансформации.


Генерация случайных точек: randomPoint

Основная функция для создания набора точек — randomPoint.

import { randomPoint } from "@turf/random";

Базовый вызов:

const points = randomPoint(100);

Параметр 100 определяет количество создаваемых точек. По умолчанию координаты генерируются в пределах всего мира, что соответствует глобальному bounding box: [-180, -90, 180, 90].


Ограничение области генерации через bbox

Часто требуется ограничить генерацию конкретной географической областью. Для этого используется параметр bbox.

const points = randomPoint(50, {
  bbox: [70, 40, 90, 55]
});

Формат bbox:

[minX, minY, maxX, maxY]

где:

  • minX — минимальная долгота
  • minY — минимальная широта
  • maxX — максимальная долгота
  • maxY — максимальная широта

Генерация внутри bbox выполняется равномерно, без учета административных или природных границ.


Использование маски polygon для генерации внутри геометрии

Более точный способ ограничения пространства — параметр mask. В качестве маски используется GeoJSON-полигон, внутри которого должны находиться все сгенерированные точки.

import { randomPoint } from "@turf/random";
import polygon from "@turf/helpers";

const mask = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [
      [
        [30, 10],
        [40, 40],
        [20, 40],
        [30, 10]
      ]
    ]
  }
};

const points = randomPoint(200, { mask });

Алгоритм работы с mask включает:

  1. Генерацию точки внутри bbox полигона
  2. Проверку попадания в геометрию
  3. Повтор генерации при промахе

При сложных полигонах с высокой долей пустого пространства эффективность может снижаться из-за увеличения числа повторных попыток.


randomPosition: генерация одиночной координаты

Функция randomPosition возвращает не GeoJSON-объект, а массив координат [lng, lat].

import { randomPosition } from "@turf/random";

const position = randomPosition([-10, -10, 10, 10]);

Особенности:

  • Возвращает только координаты без обёртки Feature
  • Используется в низкоуровневых алгоритмах
  • Быстрее randomPoint за счёт отсутствия структуры GeoJSON

Типичный сценарий — генерация координат для последующего ручного формирования геометрий.


Генерация линейных и полигональных объектов

Модуль @turf/random также поддерживает создание более сложных геометрий.

randomLineString

import { randomLineString } from "@turf/random";

const lines = randomLineString(10, {
  bbox: [-80, -40, 80, 40],
  num_vertices: 5
});

Параметры:

  • num_vertices — количество узлов линии
  • bbox — ограничение области генерации

Линии строятся как последовательность случайных точек, соединённых в порядке генерации.


randomPolygon

import { randomPolygon } from "@turf/random";

const polygons = randomPolygon(5, {
  bbox: [-100, -50, 100, 50],
  num_vertices: 6
});

Особенности генерации:

  • вершины создаются случайно в пределах bbox
  • автоматически формируется замкнутый контур
  • возможны самопересечения при сложной геометрии

Статистические свойства распределения

Генерация в Turf.js основана на равномерном распределении в декартовой системе координат. Однако географические координаты вводят искажения:

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

Для задач высокой точности часто применяется дополнительная нормализация или проекционные преобразования через сторонние библиотеки.


Масштабирование генерации

При создании больших наборов точек (десятки и сотни тысяч) важны следующие аспекты:

  • randomPoint работает быстрее при использовании bbox вместо mask
  • mask увеличивает вычислительную сложность из-за rejection sampling
  • генерация линий и полигонов требует больше памяти из-за вложенных координат

Оптимизация часто включает:

  • предварительное разбиение области на сетку
  • генерацию в нескольких bbox-подобластях
  • последующую агрегацию результатов

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

Случайная генерация используется для проверки корректности геоалгоритмов:

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

Пример связки генерации и проверки:

import { randomPoint } from "@turf/random";
import booleanPointInPolygon from "@turf/boolean-point-in-polygon";

const poly = {
  type: "Feature",
  geometry: {
    type: "Polygon",
    coordinates: [[[0,0],[10,0],[10,10],[0,10],[0,0]]]
  }
};

const points = randomPoint(1000);

const inside = points.features.filter(p =>
  booleanPointInPolygon(p, poly)
);

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

При генерации внутри масок возникают численные особенности:

  • точки, попадающие строго на границу полигона, могут трактоваться неоднозначно
  • при сложных многоугольниках возможны циклические пересчёты
  • при очень узких полигонах алгоритм rejection sampling становится менее стабильным

Эти эффекты особенно заметны при генерации в полигональных структурах с большим количеством вершин.


Координационные диапазоны и мировая модель

Все функции random в Turf.js работают в WGS84 координатной системе:

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

При генерации без bbox фактически используется глобальная модель мира, что делает результаты пригодными для симуляций, но не для локальных аналитических задач без дополнительной фильтрации.


Взаимодействие с другими модулями Turf.js

Генерация случайных данных часто используется совместно с:

  • @turf/centroid — вычисление центров кластеров
  • @turf/distance — анализ расстояний между точками
  • @turf/cluster — группировка случайных распределений
  • @turf/buffer — построение зон вокруг точек

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