Contar puntos en polígono con Postgis

16

Tengo un problema simple: quiero contar el número de puntos dentro de un conjunto de polígonos.

Ya tengo un SQL, pero solo devuelve el gid del polygone que realmente contiene puntos.

Mis tablas: una capa de polígono con 19,000 filas y una capa de puntos con 450 filas.

El siguiente SQL

select grid.gid, count(*) AS totale FROM grid, kioskdhd3 WHERE 
st_contains(grid.geom,kioskdhd3.geom) GROUP BY grid.gid;

devuelve solo unos 320 polígonos que realmente contienen puntos. Pero quiero que se devuelvan todos los polígonos, incluso aunque el número de puntos sea 0.

Por supuesto, tiene que ver con mi cláusula WHERE. ¿Dónde tengo que poner mis st_contains?

Gracias Carsten

hoge6b01
fuente
gracias, pero todos tienen una cláusula WHERE. No sé si necesito uno. ¿Cómo lo reescribirías?
hoge6b01

Respuestas:

23
SELECT grid.gid, count(kioskdhd3.geom) AS totale 
FROM grid LEFT JOIN kioskdhd3 
ON st_contains(grid.geom,kioskdhd3.geom) 
GROUP BY grid.gid;
Nicklas Avén
fuente
Hola Nicklas, recibí esta respuesta de la lista de correo, ¿verdad? Gracias a todos
hoge6b01
2
No, lo siento, ¿es similar? Bueno, una
unión
1
:-) Tuve que revisar la lista. Mira el momento. Mi respuesta aquí fue antes de la lista: respuesta, pero como dijiste, muy similar :-)
Nicklas Avén
-1

Por esto, las uniones izquierdas no son compatibles con los índices GiST.

¿Puedo recomendar:

SELECT grid.gid, 
       SUM(CASE WHEN st_contains(grid.geom,kioskdhd3.geom) THEN 1 ELSE 0 END) AS total
FROM grid, kioskdhd3 
GROUP BY grid.gid;
Rafael
fuente
1
La consulta no utiliza índices espaciales: explica.depesz.com/s/U6Iy . La respuesta de Nicklas sí: explica.depesz.com/s/nhH
nickves