Создание «наклонной ограничительной рамки» с максимальным соотношением ширины и высоты?

13

Я хотел бы создать окружающий прямоугольник с максимальным отношением ширины / высоты («наклонная ограничивающая рамка») из набора входных объектов, как показано на рисунке ниже:

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

Например , функции PostGIS ST_Envelopeи ST_Box2Dкак FME Трансформаторы BoundingBoxReplacerи BoundingBoxAccumulatorгенерировать параллельно оси ограничивающей коробки.

Любые предложения с использованием подходов с PostGIS, QGIS или FME приветствуются!

Йохен Шварце
источник
Не точный дубликат, потому что парень не просит решения, применимого в FME или PostGIS. Тем не менее сценарий python, указанный в ответе на вопрос, упомянутый выше, весьма полезен для преобразования в преобразователь FME PythonCaller. Если у меня запущено рабочее пространство, я опубликую решение со слегка измененным сценарием.
Йохен Шварце
Мало того, что это не дубликат, но упомянутый вопрос не был принят, и есть оставшиеся без ответа вопросы относительно того, какой алгоритм он использует, и является ли он точным или нет.
Джон Пауэлл
Смотрите мой ответ ниже. Вы должны быть в состоянии сделать это в FME. Какую версию ты используешь?
Фезтер

Ответы:

9

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

SELECT 
   id, rotated_by, oblique_bound
  FROM 
     (
     SELECT 
        m.id,
        r rotated_by, 
        ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r) oblique_bound,
        row_number OVER (PARTITION BY id) 
                   ORDER BY ST_Area(ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r))) N
       FROM 
          generate_series(0, 90, 0.1) N(r), my_table m
    ) s
WHERE N = 1;

Это вращает геометрию, создает границы, меняет направление вращения на каждую десятую градуса от 0 до 90. В результате получается ограничивающий прямоугольник с наименьшей площадью. Конечно, это не совсем точный способ сделать это, и может потребоваться настройка значения приращения в серии в зависимости от ваших требований.

MickyT
источник
На самом деле, я думаю, что это отличное решение. Точные решения чрезвычайно дороги. Вы можете легко расширить его в plpgsql, чтобы записать лучшие x ограничивающие прямоугольники, и, если два были очень близки, вы можете увеличить масштаб и сделать несколько меньших поворотов, чтобы приблизиться к точному решению. Всегда были бы крайние случаи, но хороший подход.
Джон Пауэлл
И в качестве дополнительного преимущества он сохраняет угол поворота :-)
Йохен Шварц
6

QGIS имеет алгоритм «минимально ориентированной ограничительной рамки», который делает именно это.

ndawson
источник
Он называется «Ориентированный минимальный ограничивающий прямоугольник». Вы можете вызвать его из Инструментария обработки> Геоалгоритмы QGIS> Основные инструменты вектора.
Стефан
Я предполагаю, что это за пределами QGIS 2.14, потому что я не смог найти его в 2.14.15LTR, который мы все еще здесь используем?
Йохен Шварце
@JochenSchwarze существует в QGIS 2.14.19. Вам нужно искать в панели инструментов Обработка. Прямо, вы можете найти его подProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
Ахмадханб
4

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

Заменяет геометрию объекта либо его двухмерной ограничительной рамкой, либо его двухмерной минимально ориентированной ограничительной рамкой.

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

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

Фезтер
источник