st_intersects与st_overlaps

Abh*_*gar 6 sql postgis spatial overlap

这两个查询之间有什么区别:

select a.gid, sum(length(b.the_geom)) 
  from polygons as a 
     , roads as b 
 where st_intersects(a.the_geom,b.the_geom) 
 group by a.gid ;

select a.gid, sum(length(b.the_geom)) 
  from polygons as a 
     , roads as b 
 where st_overlaps(a.the_geom,b.the_geom) 
 group by a.gid ;
Run Code Online (Sandbox Code Playgroud)

第一个查询提供正确输出的位置,而第二个查询根本不检索任何行.与多边形相交的道路也与它重叠,对吧?

alf*_*onx 14

来自PostGIS的文档

http://postgis.net/docs/ST_Intersects.html

如果几何或地理共享空间的任何部分,则它们相交.重叠,触摸,在所有暗示空间交叉.如果上述任何一个返回true,则几何形状也在空间上相交.

http://postgis.net/docs/ST_Overlaps.html

如果几何图形"空间重叠",则返回TRUE.我们的意思是它们相交,但一个并不完全包含另一个.

区别在于:如果两个几何重叠100%,它们不再重叠.

这是一个POSTGIS示例:

SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b, a) As b_contains_a
FROM (SELECT 
    ST_Polygon(ST_GeomFromText('LINESTRING(1 1,3 1,3 3,1 1)'), 4326)  As a,
    ST_Polygon(ST_GeomFromText('LINESTRING(1 1,3 1,3 3,1 1)'), 4326)  As b)
    As foo;
    -- INTERSECT is TRUE, OVERLAP is FALSE because B equals A

    SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b, a) As b_contains_a
FROM (SELECT 
    ST_Polygon(ST_GeomFromText('LINESTRING(1 1,3 1,3 3,1 1)'), 4326)  As a,
    ST_Polygon(ST_GeomFromText('LINESTRING(1 1,4 1,4 4,1 1)'), 4326)  As b)
    As foo;
    -- INTERSECT is TRUE, OVERLAP is FALSE because B contains A

    SELECT ST_Overlaps(a,b) As a_overlap_b, ST_Intersects(a, b) As a_intersects_b, ST_Contains(b, a) As b_contains_a
FROM (SELECT 
    ST_Polygon(ST_GeomFromText('LINESTRING(0 0,2 0,2 2,0 0)'), 4326)  As a,
    ST_Polygon(ST_GeomFromText('LINESTRING(1 1,3 1,3 3,1 1)'), 4326)  As b)
    As foo;
    -- INTERSECT is TRUE, OVERLAP is TRUE because not all of A intersects B and not all of B intersects A
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个问题是互联网时代的一个化石,但值得注意的是,'ST_Intersects(a,b)`对于几何形状a是t,b是**触摸**(即,a内部没有点是b的内部,反之亦然,但他们在各自的边界上分享点数).我的白鲸是一个没有文档的PostGIS函数,这使我能够不必编写`其中ST_Intersects(a.g1,b.g1)而不是ST_Touches(a.g1,b.g1)`(我把它设置为代码片段,所以我只需要编写`pg_tni [tab]`...但这不是重点. (3认同)