如何解决使用 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 举报,一经查实,本站将立刻删除。