4 votos

Seleccionar varias filas de la tabla PostGIS donde ST_Contiene tiene varias entradas manuales

En circunstancias normales podría obtener la intersección espacial entre una tabla con multipolígonos y otra tabla con geometría de puntos utilizando alguna variante de

SELECT * 
FROM ( SELECT * FROM point_geometries) s 
JOIN polygon_geometries sg ON ST_Contains(sg.geom, s.point_geom)

Pero tengo una situación en la que en lugar de una tabla, tengo una lista de geometrías de puntos para introducir. Si sólo tengo una geometría entonces puedo hacer

SELECT * 
FROM polygon_geometries 
WHERE ST_Contains(geom, '0101000020E6100000E73B8A05101056C01F1166ED49594440')

que devuelve una única fila de polygon_geometries dándome exactamente lo que quiero.

Ahora imagina que tengo más de 100 geometrías y quiero obtener todas las filas de polygon_geometries donde ST_Contiene alguno de los puntos (en teoría devolviendo hasta 100 filas de polygon_geometries). ¿Hay alguna forma de hacerlo que no implique construir WHERE ST_Contains(geom, string1) OR ST_Contains(geom, string2)... etc?

Me encantaría poder introducir una lista de las cadenas, si es posible. Simplemente no puedo encontrar ningún ejemplo de esto.

4voto

mathieu Puntos 53

Dos opciones comunes:

  • un conjunto de materializados VALUES :

    WITH
      inputs(geom) AS [MATERIALIZED] (
        VALUES
          ('<WKB>'),
          ('<WKB>'),
          ...
      )
    SELECT ply.*
    FROM   polygon_geometries AS ply
    JOIN   inputs AS inp
      ON   ST_Contains(ply.geom, ST_SetSRID(inp.geom::GEOMETRY, <SRID>)
    ;
  • una tabla de UNNEST :

    WITH
      inputs AS [MATERIALIZED] (
        SELECT ST_SetSRID(wkb::GEOMETRY, <SRID>) AS geom
        FROM   UNNEST(ARRAY[
                 '<WKB>',
                 '<WKB>',
                 ...
               ]) AS wkb
      )
    SELECT ply.*
    FROM   polygon_geometries AS ply
    JOIN   inputs AS inp
      ON   ST_Contains(ply.geom, inp.geom)
    ;

siendo el primero ligeramente más rápido en cuanto a la creación del conjunto, y el segundo más cómodo para copiar/pegar .

MATERIALIZED sólo se aplica a PostgreSQL >= 12.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X