Select 个使用空间查询的点要素

Select point features using spatial query

我有两个 postgres 表,一个是多边形要素,另一个是点要素,具有相同的投影。 我想要做的是 select 只有包含在大多边形中但不包含在小多边形中的点,如下图突出显示,使用空间查询。

我正在尝试用下面的查询做的是,select 小多边形 (kind=1) 中所有不 intersect/contain 的点,然后 return 来自包含在大多边形 (kind=2) 中的 selected 要素的那些点。 查询结果为 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_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 ;

有些结果不可接受,例如:

圈出的点应该只有种类 1,但它们是 selected。

如果我没理解错的话,你有两个正交条件:

  1. 所有与 kind = 1 多边形不相交的点
  2. 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 显示两个嵌套循环)。

SELECT p.geom AS point_geom, big.geom AS polygon_geom
FROM points p 
JOIN polygons big ON ST_Intersects(big.geom, p.geom) AND big.kind = 1
JOIN polygons small ON (NOT ST_Intersects(small.geom, p.geom)) AND small.kind = 2;

此查询内容类似于:"select all points that intersect the big polygons, but exclude any points that intersect with a small polygon"。

您应该避免使用 ST_Disjoint(),因为它不使用索引。