我有两个postgres表,一个多边形特征和第二个点特征,具有相同的投影。
我要做的是使用空间查询,仅选择包含在大多边形中而不包含在小多边形中的点,如下图中突出显示的那样。
下面的查询是,select
小多边形(kind=1
)中不相交/不包含的所有点,然后从大多边形(kind=2
)中包含的选定要素返回这些点。
查询结果为0 rows
。
select
*
from
(
select p.geom as point_geom,sp.geom as polygon_geom
from polygons sp, points p
where st_disjoint(sp.polygon_geom,p.point_geom) and sp.kind = 1
) as subquery
where st_contains(subquery.scale_geom,subquery.pois_geom) and subquery.kind = 2;
上面查询中的
kind
列用于区分这些多边形,其中kind = 1
表示小多边形,kind = 2
表示大多边形。同时,两个多边形重叠,这意味着包含在小多边形中的点也包含在大多边形中。更新
运行此查询后:
SELECT DISTINCT p.geom as point_geomFROM points p JOIN polygons poly1 ON ST_Disjoint(p.geom, poly1.geom) JOIN polygons poly2 ON ST_Intersects(p.geom, poly2.geom)WHERE poly1.kind = 1 AND poly2.kind = 2;
有些结果是不可接受的,例如:
包围点应仅为种类1,但已选定。
最佳答案
如果我没听错的话,你有两个正交条件:
与kind = 1
多边形不相交的所有点
与kind = 2
多边形相交的所有点
你需要它的交叉点。双联接应该:
SELECT DISTINCT p.geom as point_geom
FROM points p
JOIN polygons poly1 ON ST_Disjoint(p.geom, poly1.geom)
JOIN polygons poly2 ON ST_Intersects(p.geom, poly2.geom)
WHERE
poly1.kind = 1 AND poly2.kind = 2
;
会产生预期的结果。只有当一个点可能包含在多个多边形中时,
DISTINCT
才是必需的。不要忘记将索引放在polygons.geom
、points.geom
和polygons.kind
上,否则会非常慢(EXPLAIN
显示两个嵌套循环)。关于postgresql - 使用空间查询选择点要素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39120369/