微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ST_Disjoint() 函数会产生意想不到的结果

如何解决使用 ST_Disjoint() 函数会产生意想不到的结果

我正在摆弄这个数据集 http://s3.cleverelephant.ca/postgis-workshop-2020.zip。它用于本次研讨会http://postgis.net/workshops/postgis-intro/spatial_relationships.html

我想确定没有地铁站的所有功能。我认为这个空间连接相当简单

SELECT
  census.boroname,COUNT(census.boroname)
FROM nyc_census_blocks AS census
    JOIN nyc_subway_stations AS subway
        ON ST_disjoint(census.geom,subway.geom)
GROUP BY census.boroname;

然而,结果集太大了。

"brooklyn"  4753693
"Manhattan" 1893156
"Queens"    7244123
"Staten Island" 2473146
"The bronx" 2683246

当我运行测试时

SELECT COUNT(id) FROM nyc_census_blocks;

我得到 38794 结果。因此,nyc_census_blocks 中的特征比空间连接的结果集中少得多。

这是为什么?我犯的错误在哪里?

解决方法

问题在于,对于 ST_Disjoint,您将获得 nyc_census_block 的每条记录与 nyc_subway_stations 不相交的车站总数,这意味着在没有交叉点的情况下nyc_subway_stations (491) 的所有记录。这就是为什么您的计数如此之高。

或者,您可以计算有多少地铁和人口普查街区相交,例如在 CTE 或子查询中,并在另一个查询中计算其中有多少返回 0:

WITH j AS (
 SELECT 
   gid,census.boroname,(SELECT count(*) 
   FROM nyc_subway_stations subway
   WHERE ST_Intersects(subway.geom,census.geom)) AS qt
 FROM nyc_census_blocks AS census
)
SELECT boroname,count(*)
FROM j WHERE qt = 0
GROUP BY boroname;

   boroname    | count 
---------------+-------
 Brooklyn      |  9517
 Manhattan     |  3724
 Queens        | 14667
 Staten Island |  5016
 The Bronx     |  5396
(5 rows)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。