¿Está creando un "cuadro de límite oblicuo" con una relación máxima ancho / alto?

13

Me gustaría crear un rectángulo circundante con una relación máxima de ancho / alto ("cuadro de límite oblicuo") a partir de un conjunto de características de entrada como se muestra en la imagen a continuación:

ingrese la descripción de la imagen aquí

Por ejemplo, las funciones PostGIS ST_Envelopey los ST_Box2DTransformadores FME BoundingBoxReplacery BoundingBoxAccumulatorgenerar cuadros de límite de eje paralelo.

Cualquier sugerencia que utilice enfoques con PostGIS, QGIS o FME es muy bienvenida.

Jochen Schwarze
fuente
No es un duplicado exacto , porque el tipo no está pidiendo una solución aplicable en FME o PostGIS. Sin embargo, el script de python mencionado en la respuesta a la pregunta mencionada anteriormente es bastante útil para colocarlo en el transformador PythonCaller de FME. Si tengo un espacio de trabajo en ejecución, publicaré una solución con un script ligeramente modificado.
Jochen Schwarze el
No solo no es un duplicado, sino que la pregunta a la que se hace referencia no se ha aceptado, y hay preguntas sin respuesta sobre qué algoritmo usa y si es exacto o no.
John Powell el
Vea mi respuesta a continuación. Deberías poder hacer esto en FME. Qué versión estás usando?
Fezter

Respuestas:

9

Esto probablemente sea excesivo en el frente del procesamiento y es probable que haya una mejor solución matemática, pero como ejemplo de una forma en que podría hacerse simplemente como una 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;

Esto rota la geometría, crea los límites, invierte la rotación por cada décima de grado entre 0 y 90. El resultado es el cuadro delimitador con el área mínima. Por supuesto, esta no es una forma totalmente precisa de hacerlo y puede necesitar ajustes del valor de incremento en la serie dependiendo de sus requisitos.

MickyT
fuente
En realidad, creo que esta es una gran solución. Las soluciones exactas son extremadamente caras. Podría extenderlo fácilmente en plpgsql para registrar los mejores cuadros delimitadores x, y si dos estuvieran muy cerca, podría acercar y hacer algunas rotaciones más pequeñas para acercarse a una solución exacta. Siempre habría casos extremos, pero un buen enfoque.
John Powell el
Y como beneficio adicional, conserva el ángulo de rotación :-)
Jochen Schwarze
6

QGIS tiene un algoritmo de "cuadro de límite orientado mínimo" que hace exactamente esto.

ndawson
fuente
Se llama "Cuadro de límite mínimo orientado". Puede llamarlo desde la Caja de herramientas de procesamiento> Geoalgoritmos de QGIS> Herramientas generales de vectores.
Stefan
Supongo que esto está más allá de QGIS 2.14, porque no pude encontrarlo en 2.14.15LTR que todavía estamos usando aquí.
Jochen Schwarze el
@JochenSchwarze existe en QGIS 2.14.19. Debe buscar en la caja de herramientas Procesamiento. Directamente, puede encontrarlo debajoProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb
4

El transformador de reemplazo del cuadro delimitador , que usted mencionó, debería ser capaz de hacer esto. Según la documentación,

Reemplaza la geometría de la entidad con su cuadro delimitador bidimensional o su cuadro delimitador orientado mínimo bidimensional.

El parámetro le permite elegir un cuadro delimitador rectificado o alineado al eje.

Aparentemente, hay una mejora sugerida para incluir el ángulo del lado más largo del cuadro delimitador orientado. Este es el número de seguridad PR # 53924.

Fezter
fuente