Как рассчитать, сколько полигонов я могу поместить в полигон?

9

Я обычно использую QGIS. Я объясняю свою проблему на примере: есть лес (неправильная геометрия1) и одно дерево (geomery2). Я хочу знать максимальное количество деревьев, которое может содержать лес. Кроме того, я хочу получить шейп-файл с лучшим расположением этих деревьев в лесу.введите описание изображения здесь

ksatzu
источник
3
Хорошая проблема ....
WKT
Я не знаю, как бы я начал. Похоже, проблема / алгоритм степени магистра.
HeikkiVesanto
2
Если вы можете получить доступ к бесплатной пробной версии ArcGIS (или скачать R бесплатно), в программном обеспечении Geospatial Modeling Environment есть gencirclesinpolys (Generate Circles In Polygons)инструмент, который может быть полезен.
Джозеф
2
Вы ищете инструмент для решения проблем с
упаковкой,
1
@Joseph Я использовал инструмент Geospatial Modeling Environment, он работает. К сожалению, инструмент генерирует правильное расположение окружностей (или шестиугольников) в границах многоугольников, это подразумевает, что выходная форма не показывает (обязательно) наилучшее расположение объектов, я имею в виду максимально возможное их количество.
Ксацу

Ответы:

5

Попробуйте это приложение онлайн svgnest.com/

шаги: 1. svg создает файл (как на рисунке 1); 2. Перейдите по ссылке и загрузите svg; 3. Выберите мышью контейнер многоугольника; 4. начать

после нескольких итераций вы можете заблокировать и загрузить файл SVG (см. рисунок 2)

NB: многоугольник и круги должны быть в одном файле SVG

фигура 1

фигура 2

Pigreco
источник
4

Интересная проблема!

Я сделал то же самое с неправильными полигонами (в этом случае здания были упакованы так, чтобы не перекрываться)

введите описание изображения здесь

Используются postgresql и postgis, и python. Грубый алгоритм был

  • Найти случайную точку в ограничительной рамке многоугольника (ST_Envelope)
  • Если точка за пределами многоугольника, вернитесь на один шаг назад
  • Сделать геометрию для дерева по центру этой случайной точки
  • Если это перекрывает любое существующее размещенное дерево (ST_Overlaps), вернитесь к началу
  • Добавить дерево в точке
  • Возвращайтесь, чтобы начать

Я не могу гарантировать, что это даст глобальный оптимум, для этого вам понадобится алгоритм «круговой упаковки» (как уже упоминали другие).

Это будет продолжаться вечно, поэтому вам нужно будет добавить код, чтобы решить, когда выйти, например

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

Согласно Circle Packing в Википедии, наилучшая плотность упаковки достигается с помощью шестиугольной сетки. Может быть возможно создать такую ​​сетку, используя MMQGIS, чей интервал зависит от размера ваших деревьев, которые, как я полагаю, идентичны. Затем поместите дерево в каждую вершину. Но тогда у вас есть проблема, чтобы узнать, где разместить сетку, чтобы максимизировать количество деревьев.

Стивен Кей
источник