计算where子句中的相交面积百分比


15

我在postgres中有一个多边形表(人口普查块组)。我想用主要位于其中的城镇(另一个多边形表)标记每个街区组。这可能吗?我在想我基本上需要创建如下内容:

select b.*,t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

但是这个查询将永远持续下去(我有大约5,000个街区组和375个城镇...)。如果不正确,是否有任何建议可以使该查询正常工作,如果正确,该建议有何建议?


听起来像您想根据最大重叠量标记块组?如果是这样,请参阅此答案。如果您的“城镇”也是人口普查地区(例如MCD或地方),则可能无需计算重叠百分比。
dbaston 2014年

Answers:


23

您执行此操作的方式会奏效,但会花费很多时间,因为postgis试图创建每个“街区组vs城镇”组合的交集的几何形状,即使它们甚至不接触也是如此。

在您的WHERE子句中添加另一个条件检查,以检查两个几何是否相交,并将其放置在现有的几何之前:

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5

在SQL中,如果在WHERE子句中有条件列表,则按其写入顺序对其进行测试。如果在早期操作之一中返回FALSE,则查询将仅跳过其他条件检查,因为结果始终为FALSE。

另外,请确保您在blockgroups.wkb_geometry和towns.wkb_geometry上具有空间索引。


1
添加ST_Intersects是执行此操作的正确方法,但是计划者可能会或可能不会按照编写条件的顺序执行条件。有关详细信息,请参见Postgres 文档ST_Intersects并且ST_Intersection安装时的安装成本相同(100),所以说实话我不确定规划器在做什么,但在这里似乎总是做对了。
dbaston 2014年

啊...我确实以为可以像其他语言一样检查条件。但是我想它给计划者提供了另一个选择。
亚历山大·内托

10

除了亚历山大的非常有用的答案外,如果您的某些人口普查单位可能跨越了您的三个城镇(因此,您不能保证任何一个城镇的摔倒率都超过50%),您可以这样做:

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

这基本上可以防止出现以下情况-蓝色区域会消失: 在此处输入图片说明


1
当我遇到SO答案的第一个问题由下一个答案解决时,我绝对喜欢它。干杯,@ RobinL!
wfgeo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.