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



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;

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;

1
Querry nie wykorzystuje indeksów przestrzennych: explain.depesz.com/s/U6Iy . Nicklas odpowiedź robi: explain.depesz.com/s/nhH
nickves
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.