Zähle Punkte im Polygon mit Postgis

16

Ich habe ein einfaches Problem: Ich möchte die Anzahl der Punkte innerhalb eines Satzes von Polygonen zählen.

Ich habe bereits eine SQL, aber sie gibt nur die GID des Polygons zurück, das tatsächlich Punkte enthält.

Meine Tabellen: eine Polygonebene mit 19.000 Zeilen und eine Punktebene mit 450 Zeilen.

Die folgende SQL

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

Es werden nur 320 Polygone zurückgegeben, die tatsächlich Punkte enthalten. Aber ich möchte, dass alle Polygone zurückgegeben werden, auch wenn die Anzahl der Punkte 0 ist.

Das hat natürlich mit meiner WHERE-Klausel zu tun. Wo muss ich meine st_contains ablegen?

Vielen Dank Carsten

hoge6b01
quelle
Danke, aber alle haben eine WHERE-Klausel. Ich weiß nicht, ob ich einen brauche. Wie würden Sie es neu schreiben?
Hoge6b01

Antworten:

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
quelle
Hallo Nicklas, hast du diese Antwort von der Mailingliste? Vielen Dank an alle
hoge6b01
2
Nein, tut mir leid, ist es ähnlich? Nun, eine äußere Verbindung ist keine
Hexerei im
1
:-) Ich musste die Liste überprüfen. Schau dir das Timing an. Meine Antwort hier war vor der Liste-Antwort, aber wie Sie sagten, sehr ähnlich :-)
Nicklas Avén
-1

Nach diesem Link werden Joins in GiST-Indizes nicht unterstützt.

Darf ich empfehlen:

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;
Raffael
quelle
1
Der Querry verwendet keine räumlichen Indizes: explain.depesz.com/s/U6Iy . Nicklas antwortet wie folgt: explain.depesz.com/s/nhH
nickves