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。
如果我没理解错的话,你有两个正交条件:
- 所有与
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;
此查询内容类似于:"select all points that intersect the big polygons, but exclude any points that intersect with a small polygon"。
您应该避免使用 ST_Disjoint()
,因为它不使用索引。
我有两个 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。
如果我没理解错的话,你有两个正交条件:
- 所有与
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;
此查询内容类似于:"select all points that intersect the big polygons, but exclude any points that intersect with a small polygon"。
您应该避免使用 ST_Disjoint()
,因为它不使用索引。