使用空间查询选择点要素
我有两个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_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但他们被选中。
回答:
如果我理解正确的话,你有两个正交条件:
- 不相交与
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
显示两个嵌套循环)。
回答:
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;
该查询读这样的:“选择相交的大多边形的所有点,但不包括与小多边形相交任何积分”。
您应该避免使用ST_Disjoint()
,因为它不使用索引。
以上是 使用空间查询选择点要素 的全部内容, 来源链接: utcz.com/qa/257347.html