如何在PostgreSQL中查找与我的地块相邻的地块
解决方案
1. 基础正确SQL语句
你之前的SQL未筛选有效结果,也未对应实际表结构(parcels和Myparcel),试试这条语句:
SELECT p.地块编号, p.geom FROM parcels p JOIN Myparcel mp ON ST_Touches(p.geom, mp.geom);
这条语句会直接返回所有与自有地块边界接触的相邻地块编号及几何信息。
2. 排查可能的问题
如果上述语句仍无结果,检查以下几点:
- 坐标系一致性:确认
parcels和Myparcel的geom字段使用相同空间参考系。若不同,用ST_Transform统一:SELECT p.地块编号, p.geom FROM parcels p JOIN Myparcel mp ON ST_Touches(p.geom, ST_Transform(mp.geom, ST_SRID(p.geom))); - 几何有效性:检查地块几何是否合法,验证语句如下:
若存在无效几何,用-- 检查自有地块 SELECT ST_IsValid(geom) FROM Myparcel; -- 检查parcels表中无效几何的地块 SELECT 地块编号, ST_IsValid(geom) FROM parcels WHERE ST_IsValid(geom) = false;ST_MakeValid修复后再查询:SELECT p.地块编号, p.geom FROM parcels p JOIN Myparcel mp ON ST_Touches(ST_MakeValid(p.geom), ST_MakeValid(mp.geom)); - 严格边界接触:若需要仅线接触(排除点接触),改用
ST_Relate判断拓扑关系:SELECT p.地块编号, p.geom FROM parcels p JOIN Myparcel mp ON ST_Relate(p.geom, mp.geom, 'FF*TT****');
内容的提问来源于stack exchange,提问作者Dardan
相关产品推荐
相关产品推荐

