1 votos

ST_contiene entre dos tablas devuelve todos los resultados de una tabla multiplicados por el número de resultados de la otra tabla

Tengo una tabla PostGIS de polygons así:

polygon_id | polygon_geom

Y otra de points así:

point_id | polygon_id | point_geom

Quiero encontrar todos los puntos de la points que se encuentran dentro de un polígono específico del polygons mesa. He probado esta consulta:

SELECT points.point_id FROM points, polygons WHERE St_contains((SELECT polygons.polygon_geom FROM polygons WHERE polygons.polygon_id = 2905), points.point_geom) = 't';

Espero que el 21 point_id pero en su lugar me da todo el polygon con cada línea repetida 21 veces. ¿Cómo puedo obtener sólo las 21 filas de la tabla points ¿Mesa? Y además, ¿cómo puedo entonces asignar el polygon_id que estos puntos están dentro a la points.polygon_id para esas 21 filas del points ¿Mesa?

EDIT: Si utilizo esta consulta para comprobar si una polygon está en otra del polygon esta consulta funciona perfectamente. Así que siento que estoy cerca, pero fundamentalmente malentendido algo.

EDIT 2: cambiado polygon.id columna a polygon.polygon_id

3voto

Patrick Puntos 20392

Tu problema es la cláusula Where. El FROM points, polygons le proporciona una unión cartesiana entre ambas tablas, es decir, es sólo azúcar sintáctico para una unión unión externa completa . Por lo tanto, puede utilizar ST_Contains para devolver sólo los puntos que están dentro de un polígono. La función array_agg le devolverá todos los polígonos dentro de los que se encuentra un punto, en el caso de que pueda haber más de uno.

SELECT  
   pts.point_id, array_agg(poly.polygon_id)
 FROM
    points pts, polygons poly
 WHERE ST_Contains(poly_geom, point_geom)
 GROUP BY pts.point_id;

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