У меня есть функция многоугольника, и я хочу иметь возможность создавать точки внутри нее. Мне нужно это для одной задачи классификации.
Генерация случайных точек до тех пор, пока один из них не окажется внутри многоугольника, не сработает, потому что это действительно непредсказуемо.
Ответы:
Начните с разложения многоугольника на треугольники, затем создайте точки внутри них . (Для равномерного распределения, взвесьте каждый треугольник по площади.)
источник
Если вы поставите тег QGIS на этот вопрос: инструмент «Случайные точки» можно использовать с пограничным слоем.
Если вы ищете код, исходный код плагина должен помочь.
источник
Вы можете определить экстент многоугольника, а затем ограничить генерацию случайных чисел для значений X и Y в пределах этих экстентов.
Основной процесс: 1) Определите maxx, maxy, minx, miny вершин многоугольника, 2) Создайте случайные точки, используя эти значения в качестве границ 3) Проверьте каждую точку на пересечение с вашим многоугольником, 4) Прекратите генерировать, когда у вас достаточно точек, удовлетворяющих пересечению тест
Вот алгоритм (C #) для теста пересечения:
источник
Есть несколько хороших библиотек, которые делают большую часть тяжелой работы за вас.
Пример использования [shapely] [1] в python.
Или используйте,
.representative_point()
чтобы получить точку внутри объекта (как упомянуто Дейном):источник
representative_point
метод: shapely.readthedocs.io/en/latest/...Если R вариант, см.
?spsample
Вsp
пакете. Полигоны могут быть считаны из любого формата, поддерживаемого GDAL, встроенного в пакет rgdal, и затемspsample
работают непосредственно с импортированным объектом с различными вариантами выборки.источник
Я хотел бы предложить решение, которое требует очень мало с точки зрения ГИС-анализа. В частности, он не требует триангуляции каких-либо полигонов.
Следующий алгоритм, приведенный в псевдокоде, относится к некоторым простым операциям в дополнение к базовым возможностям обработки списка (создание, поиск длины, добавление, сортировка, извлечение подсписков и объединение) и генерации случайных чисел с плавающей точкой в интервале [0, 1):
Все они доступны практически в любой среде ГИС или графического программирования (и, если нет, легко кодируются).
Clip
не должен возвращать вырожденные полигоны (то есть те, которые имеют нулевую площадь).Процедура
SimpleRandomSample
эффективно получает список точек, случайно распределенных внутри многоугольника. Это оберткаSRS
, которая разбивает многоугольник на более мелкие кусочки до тех пор, пока каждый кусочек не станет достаточно компактным для эффективного отбора проб. Чтобы сделать это, он использует предварительно вычисленный список случайных чисел, чтобы решить, сколько очков выделить для каждой части.SRS можно «настроить», изменив параметр
t
. Это максимальное ограничение: отношение площадей полигонов, которое может быть допустимым. Если сделать его маленьким (но больше 1), большинство полигонов будет разбито на множество частей; увеличение его размера может привести к отклонению многих пробных точек для некоторых полигонов (извилистых, с осколками или дырявыми). Это гарантирует, что максимальное время выборки исходного полигона предсказуемо.Следующая процедура вызывает себя рекурсивно, если это необходимо. Таинственное выражение
t*N + 5*Sqrt(t*N)
консервативно оценивает верхний предел того, сколько точек потребуется, учитывая случайную изменчивость. Вероятность того, что это не удастся, составляет всего 0,3 на миллион вызовов процедур. Увеличьте 5 до 6 или даже 7, чтобы уменьшить эту вероятность, если хотите.источник
Если ваш многоугольник является выпуклым, и вы знаете все вершины, вы можете рассмотреть возможность "случайного" выпуклого взвешивания вершин, чтобы выбрать новую точку, которая гарантированно лежит внутри выпуклой оболочки (в данном случае многоугольника).
Например, скажем, у вас есть N-сторонний выпуклый многоугольник с вершинами
Тогда генерируем случайным образом N выпуклых весов
Случайно выбранная точка затем определяется как
Может быть другой способ выбрать N выпуклых весов
Когда ваш многоугольник не очень сильно невыпуклый, вы можете сначала преобразовать его в выпуклый корпус. Это должно как минимум ограничить количество точек, лежащих за пределами вашего многоугольника в значительной степени.
источник
Эту задачу очень легко решить в GRASS GIS (одна команда) с помощью v.random .
Ниже приведен пример того, как добавить 3 случайных точки в выбранные многоугольники (здесь - области с индексами города Роли, Северная Каролина) со страницы руководства. Изменяя оператор SQL «где», можно выбрать многоугольник (ы).
источник
Ссылка для ответа
https://gis.stackexchange.com/a/307204/103524
Три алгоритма, использующие разные подходы.
Git Repo Link
Функция ======================================================= ==================
Используйте функцию с простым запросом, геометрия должна быть правильной и полигон, многогранник или конверт
SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;
Результат ================================================= =====================
Вторая функция на основе Никласа Авена алгоритме . Пытался справиться с любым SRID.
Я применил следующие изменения в алгоритме.
Функция ======================================================= ==================
Используйте это с простым запросом.
SELECT I_Grid_Point(geom, 22, 15, false) from polygons;
Результат ================================================= ==================
Функция ================================================= =================
Используйте это с простым запросом.
SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons;
Результат ================================================= =========================источник