写一个sql脚本,在postgis的一个表中查出不重复的重叠面
时间: 2024-02-25 17:54:39 浏览: 26
好的,下面是一个简单的 SQL 脚本,用于在 PostGIS 中查找不重叠的重叠面:
```
SELECT DISTINCT a.geom
FROM table1 a, table1 b
WHERE ST_Intersects(a.geom, b.geom) AND a.id <> b.id AND NOT ST_Touches(a.geom, b.geom);
```
这个脚本的意思是,从表 table1 中选择不重叠的重叠面,其中 a.geom 和 b.geom 分别是两个表中的几何列,ST_Intersects(a.geom, b.geom) 表示两个几何体相交,a.id <> b.id 表示排除同一行,NOT ST_Touches(a.geom, b.geom) 表示两个几何体不相邻。使用 DISTINCT 关键字来排除重复结果。
相关问题
postgis去除同一个表中的面与面压盖
要去除同一个表中的面与面之间的压盖,可以使用PostGIS中的ST_Union和ST_Difference函数。
首先,使用ST_Union将所有重叠的面合并为一个单独的面。例如,如果有两个重叠的面A和B,则可以使用以下查询将其合并为一个单独的面C:
```
SELECT ST_Union(A.geom, B.geom) AS geom
FROM tableA A, tableA B
WHERE A.id <> B.id AND ST_Intersects(A.geom, B.geom);
```
接下来,使用ST_Difference函数从原始面中减去合并的面。例如,如果要从原始面A中减去合并的面C,则可以使用以下查询:
```
SELECT ST_Difference(A.geom, C.geom) AS geom
FROM tableA A, (
SELECT ST_Union(A.geom, B.geom) AS geom
FROM tableA A, tableA B
WHERE A.id <> B.id AND ST_Intersects(A.geom, B.geom)
) C
WHERE A.id = [id of original polygon];
```
这将生成一个新的几何图形,其中不再有A和B之间的重叠部分。需要注意的是,如果有多个重叠的面,则需要多次使用ST_Difference函数,每次减去一个合并的面。同时,需要指定要减去的原始面的id。
写一个postgis的sql语句样例,实现用postgis处理同一个表里的面与面压盖问题
假设我们有一个名为"polygon_table"的表,其中包含一个名为"geom"的geometry列,表示多边形。要处理这个表中的面与面压盖问题,可以使用以下PostGIS SQL语句:
```
SELECT ST_Intersection(a.geom, b.geom) AS intersection
FROM polygon_table a, polygon_table b
WHERE a.id <> b.id AND ST_Intersects(a.geom, b.geom);
```
这个SQL语句使用了PostGIS的ST_Intersects函数来判断两个多边形是否相交,然后使用ST_Intersection函数计算它们的交集。其中的"a.id <> b.id"条件确保我们不会比较同一个多边形的自交。
注意,这个SQL语句只计算了两个多边形的交集,如果需要计算多个多边形的压盖关系,需要进行更复杂的查询。