es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Uso correcto de LATERAL FROM

Estoy tratando de usar PostGIS para realizar una serie de pasos dentro de una declaración SQL para básicamente convertir un raster en puntos, hacer un buffer, disolver y luego determinar el límite general, es decir, el casco convexo basado en un atributo.

Aquí es donde estoy, pero obtengo un error que sugiere el uso de LATERAL FROM, pero no sé qué debo hacer.

Cualquier ayuda sería muy apreciada.

[0A000] ERROR: las llamadas a funciones de agregado no pueden contener llamadas a funciones que devuelven conjuntos. Sugerencia: Es posible que puedas mover la función que devuelve conjuntos a un elemento LATERAL FROM. Posición: 123

SELECT name,
    st_union(
            st_buffer(
                    st_transform(
                            (ST_PixelAsCentroids(rast, 1)).geom
                        , 32756),
                    50, 2)
        )
FROM rasters
WHERE id < 5
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el mensaje de error, puedes intentar la siguiente modificación en tu declaración SQL:

    SELECT name,
      st_union(buffer.geom)
    FROM (
      SELECT (ST_DumpPoints(ST_Reclass(rast,1,'0-10:1', '11-1000000:0', '16BUI',NULL))).geom as geom 
      FROM rasters
      WHERE id < 5
    ) AS points
    CROSS JOIN LATERAL (
      SELECT ST_Transform(ST_ConvexHull(ST_Collect(geom)), 32756) AS geom
      FROM (
        SELECT ST_Buffer(geom, 50, 2) AS geom 
        FROM points
      ) AS buffer
    ) AS final;
    

    Explicación:

    • Usa ST_Reclass para convertir tu raster en un formato binario que pueda ser utilizado por ST_DumpPoints.
    • ST_DumpPoints hará que cada píxel se convierta en una geometría de punto, que es lo que estás intentando lograr.
    • Envuelve la declaración SELECT interna en una subconsulta, lo cual nos permitirá usar una unión LATERAL más adelante.
    • Utiliza CROSS JOIN LATERAL para realizar una operación de geometría (es decir, un buffering) en cada punto.
    • Recopila todos los puntos bufferizados (ST_Collect) y calcula el casco convexo (ST_ConvexHull).
    • Finalmente, transforma el casco convexo a la proyección deseada.

Comments are closed.