我有两个postgres表,一个多边形特征和第二个点特征,具有相同的投影。
我要做的是使用空间查询,仅选择包含在大多边形中而不包含在小多边形中的点,如下图中突出显示的那样。
postgresql - 使用空间查询选择点要素-LMLPHP
下面的查询是,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;
有些结果是不可接受的,例如:
postgresql - 使用空间查询选择点要素-LMLPHP
包围点应仅为种类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.geompoints.geompolygons.kind上,否则会非常慢(EXPLAIN显示两个嵌套循环)。

关于postgresql - 使用空间查询选择点要素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39120369/

10-11 17:11