postgresql - 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 的新手。非常感谢您的帮助!
解决方案
我认为您的查询会测试多边形是否在该点内 - 您需要反转参数,或使用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
如果该查询返回任何内容,则某些多边形会重叠。
推荐阅读
- go - 无法从同一目录中的文件导入函数
- performance - 启用 API 级别的诊断日志 成本和性能是什么
- django - 直接显示来自 Digitalocean 应用平台的媒体图像
- reactjs - Next.js getStaticProps localstorage 未定义
- scenekit - 在世界空间中旋转和移动 SCNNode
- python - 如何获取当前运行的子进程、他的父进程和父父进程的 PID、真实用户 ID、优先级
- firebase - '-alias' 没有组织为内部或外部终端命令
- javascript - 搜索栏功能
- reactjs - 如何修复 Spring Boot - Jhipster 上的 SameSite 问题?
- ruby-on-rails - Rails hidden_field 不生成值,尽管它可以在视图中呈现