如何找到仅相互接触的所有多边形对,并且只使用PostGIS在PostgreSQL中列出每对一对? 就像图片上显示的循环一样:
我写了以下查询:
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
但是这个查询引起了严重的性能问题,并且它返回了所有对两次(反向对)
这种方法根本不是解决方案。
那么是否有人可以帮助我或给我任何提示?
答案 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将有助于加快几何查询的速度。如果您已完成所有这些,请告诉我,我可以编辑我的答案。