【问题标题】:Using the ST_Disjoint() Function gives unexpected result使用 ST_Disjoint() 函数会产生意想不到的结果
【发布时间】:2021-10-04 07:06:19
【问题描述】:

我正在摆弄这个数据集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 中的特征比空间连接的结果集中的特征要少。

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

【问题讨论】:

    标签: postgresql postgis geospatial spatial spatial-query


    【解决方案1】:

    问题在于,对于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)
    

    【讨论】:

    • 嗯...也许这可以解释高计数,但是:为什么它会返回所有 NYC Census Blocks 几何?然后它至少应该返回所有与地铁站不相交的几何图形?!
    • @Stophface 是吗?此查询不返回任何几何图形,只返回它们的boroname。有多个几何具有相同的boroname,因此此查询最终按几何由boronames 分组,具有零个站点。见SELECT DISTINCT boroname FROM nyc_census_blocks;
    • 对不起,我说的是我的,从我的 Q 中经过轻微编辑的查询。当我运行这个 SELECT census.boroname, census.geom FROM nyc_census_blocks AS census JOIN nyc_subway_stations AS subway ON ST_Disjoint(subway.geom, census.geom) GROUP BY census.boroname, census.geom; 时,我得到了很多几何图形......我只希望有几个,即那些没有地铁站。
    • @Stophface 当然,现在确实如此,正如您在 SELECT 语句中声明的那样。在我的查询中和在 OP 中它不是。当然,您现在得到了更多结果,因为 nyc_census_blocks 内部的几何图形是不同的,即使 boroname 相同,包含 geom 的组也会返回多行。
    • 非常感谢您的时间和解释!
    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多