如何找到在一个点上只相互接触的所有多边形对,并且只列出每对一次

时间:2018-04-11 17:24:22

标签: sql postgresql gis postgis spatial-query

如何找到相互接触的所有多边形对,并且只使用PostGIS在PostgreSQL中列出每对一对? 就像图片上显示的循环一样:

enter image description here

我写了以下查询:

with kms as (
    select
      a.county as cn1,
      b.county as cn2
    from spatial.us_counties as a, spatial.us_counties as b
    where ST_Touches(a.geom, b.geom) = 'true' and a.id != b.id and ST_GeometryType(ST_Intersection(a.geom,b.geom)) = 'ST_Point'
)
/**    below is for remove reversed pairs  **/
SELECT  t1.cn1
        ,t1.cn2
FROM kms AS t1
    LEFT OUTER JOIN kms AS t2
    ON t1.cn1 = t2.cn2
    AND t1.cn2 = t2.cn1
WHERE   t2.cn1 IS NULL
      OR t1.cn1 < t2.cn1

但是这个查询引起了严重的性能问题,并且它返回了所有对两次(反向对)

这种方法根本不是解决方案。

那么是否有人可以帮助我或给我任何提示?

1 个答案:

答案 0 :(得分:1)

我不是很确定,所以我需要你对这个答案的反馈..

尝试:

SELECT DISTINCT A.county
  FROM spatial.us_counties AS A, spatial.us_counties AS B
    WHERE ST_Touches(A.geom, B.geom) = 'true'

根据:https://postgis.net/docs/ST_Touches.html ST_Touches 应仅返回触摸多边形并且不相交,因此应该消除对where语句的需要,该语句检查它是否为点路口。选择DISTINCT应该有助于复制。

向表中添加索引https://postgis.net/docs/using_postgis_dbmanagement.html#idm2269将有助于加快几何查询的速度。如果您已完成所有这些,请告诉我,我可以编辑我的答案。