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!


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.


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.


É 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.