Слишком много наблюдений вернуло st_intersects - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь подсчитать долю точек, которые соответствуют определенному условию в каждом полигоне. Я знаю, сколько всего наблюдений соответствует условию, и я хочу знать, как они распределяются между полигонами. Тем не менее, запрос, который я выполняю, возвращает сумму, которая больше, чем число, которое я должен иметь.

Для этого у меня сначала есть таблица, в которой перечислены все точки, и столбец, в котором указано, выполняется ли условие (таблица2).

У меня также есть таблица со всеми полигонами (таблица1).

Две таблицы имеют одинаковую геометрию (3798).

Затем я использовал st_instersects (geom1, geom1) и count (), чтобы узнать, сколько точек в каждом многоугольнике.

Я также попробовал st_within, но такая же проблема возникает.

SELECT table1.id, table1.name, count(table2.id) AS condition_met, table1.geom INTO newtable
FROM table1, table2
WHERE st_within(table1.geom, table2.geom) AND (table2.var = 4 OR table2.var = 5) 
GROUP BY table1.id, table1.name, table1.geom;

Все запросы работают, но. У меня есть множество наблюдений для каждого многоугольника, в котором есть точки, которые удовлетворяют условию. Однако, когда я перепроверяю большое количество наблюдений, наблюдений оказывается слишком много, чем предполагается.

Это запрос, который я использовал для суммирования общего количества наблюдений в таблице 1 (многоугольник):

SELECT SUM(condition_met) FROM table2.

Я думал, что есть дубликаты, но не нашел их.

Я почти уверен, что это простая ошибка, но я не могу ее найти, так как я новичок в postgis. Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 июня 2019

Я думаю, что ваш запрос в том виде, в каком он у вас есть, проверяет, находится ли многоугольник внутри точки - вам нужно изменить аргументы или использовать st_contains .. Я бы написал ваш запрос следующим образом:

SELECT table1.id, table1.name, count(table2.id) AS condition_met INTO newtable
FROM table1 
INNER JOIN table2 ON st_contains(table1.geom, table2.geom) -- I prefer join syntax
WHERE table2.var IN (4 ,5) -- IN is clearer 
GROUP BY table1.id, table1.name; -- leave out geom in the group by as it's slow

Если вы все еще получаете неожиданные результаты, возможно, ваши полигоны перекрываются, как указано @JGH, поэтому вы пересчитываете некоторые пересечения. Вы можете проверить это с помощью такого запроса, хотя вы можете проверить здесь для более сложного запроса и обсуждения:

SELECT a.id, b.id FROM
table1 a
INNER JOIN
table1 b -- join to the same table
ON
ST_Overlaps(a.geom, b.geom) OR ST_Contains(a.geom, b.geom)
WHERE a.id <> b.id

Если этот запрос возвращает что-либо, некоторые полигоны перекрываются.

...