st_intersects返回的观察值过多

时间:2019-06-11 15:39:20

标签: postgresql postgis

我正在尝试计算每个多边形中满足特定条件的点的比例。我知道总共有多少个观测值满足条件,并且我想知道它们如何分布在多边形之间。但是,我正在执行的请求返回的总数大于我应有的总数。

为此,我首先要有一张列出所有要点的表格和一列指出是否满足条件的列(表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 :(得分:0)

我认为您要查询的查询会测试多边形是否在该点内-您需要反转参数或使用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所指出的那样重叠,因此您会重复计算一些交点。尽管可以检查here进行更复杂的查询和讨论,但您可以使用类似的查询进行测试:

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

如果该查询返回任何内容,则某些多边形会重叠。