Criando "caixa delimitadora oblíqua" com a máxima relação largura / altura?

13

Gostaria de criar um retângulo circundante com uma relação largura / altura máxima ("caixa delimitadora oblíqua") a partir de um conjunto de recursos de entrada, como mostra a imagem abaixo:

insira a descrição da imagem aqui

Por exemplo, as funções PostGIS ST_Envelopee ST_Box2Dtambém os transformadores FME BoundingBoxReplacere BoundingBoxAccumulatorgeram caixas delimitadoras de eixos paralelos.

Todas as sugestões usando abordagens com PostGIS, QGIS ou FME são muito bem-vindas!

Jochen Schwarze
fonte
Não é uma duplicata exata , porque o cara não está pedindo uma solução aplicável no FME ou no PostGIS. No entanto, o script python referido na resposta à pergunta mencionada acima é bastante útil para ser colocado no transformador FME PythonCaller. Se eu tiver um espaço de trabalho em execução, publicarei uma solução com um script ligeiramente modificado.
Jochen Schwarze
Além de não ser uma duplicata, a pergunta referenciada não foi aceita e há perguntas sem resposta sobre qual algoritmo ele usa e se é exato ou não.
John Powell
Veja minha resposta abaixo. Você deve conseguir fazer isso no FME. Qual versão você está usando?
Fezter

Respostas:

9

Provavelmente, isso é um exagero no processamento e é provável que exista uma solução matemática melhor, mas como um exemplo de como isso poderia ser feito simplesmente como uma consulta

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;

Isso gira a geometria, cria os limites, inverte a rotação para cada décimo de grau entre 0 e 90. O resultado é então a caixa delimitadora com a menor área. Obviamente, essa não é uma maneira totalmente precisa de fazê-lo e pode precisar de ajustes no valor do incremento na série, dependendo de seus requisitos.

MickyT
fonte
Na verdade, acho que essa é uma ótima solução. As soluções exatas são extremamente caras. Você pode estendê-lo facilmente no plpgsql para registrar as melhores x caixas delimitadoras e, se duas estiverem muito próximas, você poderá ampliar e fazer algumas rotações menores para se aproximar de uma solução exata. Sempre haveria casos extremos, mas uma boa abordagem.
John John Powell
E, como um benefício adicional preserva o ângulo de rotação :-)
Jochen Schwarze
6

O QGIS possui um algoritmo de "caixa delimitadora orientada mínima", que faz exatamente isso.

ndawson
fonte
É chamado de "caixa delimitadora mínima orientada". Você pode chamá-lo em Ferramentas de processamento> Geoalgoritmos do QGIS> Ferramentas gerais de vetor.
Stefan
Presumo que isso esteja além do QGIS 2.14, porque não consegui encontrá-lo no 2.14.15LTR, que ainda estamos usando aqui?
Jochen Schwarze
@JochenSchwarze existe no QGIS 2.14.19. Você precisa pesquisar na caixa de ferramentas de processamento. Diretamente, você pode encontrá-lo em #Processing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb 3/11
4

O transformador substituto da caixa delimitadora , que você mencionou, deve poder fazer isso. De acordo com a documentação,

Substitui a geometria do recurso por sua caixa delimitadora bidimensional ou sua caixa delimitadora orientada mínima bidimensional.

O parâmetro permite que você escolha a caixa delimitadora com alginidade do eixo ou retilínea.

Aparentemente, há um aprimoramento sugerido para incluir o ângulo do lado mais longo da caixa delimitadora orientada. Este é o número seguro PR # 53924.

Fezter
fonte