Подсчет очков в многоугольнике с помощью Postgis


16

У меня есть простая проблема: я хочу посчитать количество точек в наборе полигонов.

У меня уже есть SQL, но он возвращает только гид полигона, который на самом деле содержит точки.

Мои таблицы: многоугольный слой с 19.000 строками и точечный слой с 450 строками.

Следующий SQL

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

вернуть только около 320 полигонов, которые на самом деле содержат точки. Но я хочу, чтобы все полигоны были возвращены, хотя количество точек равно 0.

Конечно, это связано с моим предложением WHERE. Куда мне положить мои st_contains?

Спасибо, Карстен



спасибо, но у всех них есть WHERE-предложение. Я не знаю, нужен ли он мне. Как бы вы переписали это?
hoge6b01

Ответы:


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;

Привет Никлас, получил этот ответ из списка рассылки, верно? Спасибо всем
hoge6b01

2
Нет, извините, это похоже? Что ж, внешние объединения - это не ракетостроение при работе с реляционными базами данных ;-)
Никлас Авен

1
:-) Я должен был проверить список. Посмотрите на сроки. Мой ответ здесь был до списка-ответа, но, как вы сказали, очень похож :-)
Никлас Авен

-1

По этой причине левые объединения не поддерживаются в индексах GiST.

Могу ли я рекомендовать:

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
В запросе не используются пространственные индексы: объяснение.depesz.com/s/U6Iy . Никлас отвечает следующим образом: объяснение.depesz.com
s/
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.