Policz punkty w wielokącie za pomocą Postgis

16

Mam prosty problem: chcę policzyć liczbę punktów w zestawie wielokątów.

Mam już kod SQL, ale zwraca on jedynie gid wielokąta, który faktycznie zawiera punkty.

Moje tabele: warstwa wielokąta z 19 000 rzędami i warstwa punktowa z 450 rzędami.

Następujący SQL

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

zwracają tylko niektóre 320 wielokątów, które faktycznie zawierają punkty. Chcę jednak zwrócić wszystkie wielokąty, nawet jeśli liczba punktów wynosi 0.

Oczywiście ma to związek z moją klauzulą ​​WHERE. Gdzie muszę umieścić moje st_contains?

Dziękuję Carsten

hoge6b01
źródło
dzięki, ale wszyscy mają klauzulę WHERE. Nie wiem czy go potrzebuję. Jak byś to napisał?
hoge6b01

Odpowiedzi:

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
źródło
Cześć Nicklas, dostałem tę odpowiedź z listy mailingowej, prawda? Dzięki wszystkim
hoge6b01 17.03.13
2
Nie, przepraszam, czy to podobne? Cóż, zewnętrzne połączenie nie jest nauką o rakietach w relacyjnych bazach danych ;-)
Nicklas Avén
1
:-) Musiałem sprawdzić listę. Spójrz na czas. Moja odpowiedź tutaj była przed listą - odpowiedź, ale jak powiedziałeś, bardzo podobna :-)
Nicklas Avén
-1

W związku z tym lewe sprzężenia nie są obsługiwane w indeksach GiST.

Czy mogę polecić:

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
źródło
1
Querry nie wykorzystuje indeksów przestrzennych: explain.depesz.com/s/U6Iy . Nicklas odpowiedź robi: explain.depesz.com/s/nhH
nickves