首页 > 解决方案 > st_intersects 返回的观测值过多

问题描述

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

为此,我首先有一个列出所有点的表和一个说明是否满足条件的列(表 2)。

我还有一张包含所有多边形的表格(table1)。

这两个表具有相同的几何形状 (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 的新手。非常感谢您的帮助!

标签: postgresqlpostgis

解决方案


我认为您的查询会测试多边形是否在该点内 - 您需要反转参数,或使用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

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


推荐阅读