【问题标题】:Find neighboring polygons with maximum of 3 other polygons查找具有最多 3 个其他多边形的相邻多边形
【发布时间】:2021-06-02 22:52:09
【问题描述】:

我有一个类似下图的案例

假设我有 9 个多边形,并希望得到一个与其他 3 个多边形(例如多边形 1、3、7、9(黄色)

我认为这是在 postgis 中使用 ST_Touches 完成的,但我只是想出在 postgis 代码中表示它

select a.poly_name, b.poly_name from tb a, tb b where ST_Touches(a.geom, b.geom)

说我想这样输出:

 poly_name      poly_name
     1               2
     1               4
     1               5

那么我如何得到这个想法呢?

【问题讨论】:

    标签: sql postgresql postgis touches st


    【解决方案1】:

    您对ST_Touches 的提示是正确的,但是要从与同一表中的其他记录相关的一列中获取相邻单元格的数量,您需要运行子查询或在FROM 子句中调用该表两次。

    给定名为tb ..的表格上的以下网格。

    .. 您可以像这样过滤具有三个或更少相邻单元格的单元格:

    SELECT * FROM tb q1
    WHERE (
      SELECT count(*) FROM tb q2
      WHERE ST_Touches(q2.geom,q1.geom)) <=3;
    

    如果您还想列出哪些是相邻单元格,您可能希望首先加入在WHERE 子句和子查询或CTE 中触及的单元格,计算结果:

    WITH j AS (
      SELECT 
        q1.poly_name AS p1,q2.poly_name p2, 
        COUNT(*) OVER (PARTITION BY q1.poly_name) AS qt
      FROM tb q1, tb q2
      WHERE ST_Touches(q2.geom,q1.geom))
    SELECT * FROM j
    WHERE qt <= 3;
    

    演示:db&lt;&gt;fiddle

    进一步阅读:

    【讨论】:

    • 非常感谢您的清晰解释!干杯!
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2014-12-17
    • 2012-02-09
    • 2017-09-22
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多