11

これら2つのクエリの違いは何ですか:

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 ;

最初のクエリでは正しい出力が得られますが、2 番目のクエリでは行がまったく取得されません。ポリゴンと交差する道路も重なっていますよね?

4

1 に答える 1

22

PostGISのドキュメントから

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

ジオメトリまたは地理が空間の一部を共有している場合、それらは交差します。オーバーラップ、タッチ、すべての範囲内は、空間的な交差を意味します。前述のいずれかが true を返す場合、ジオメトリも空間的に交差します。

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

ジオメトリが「空間的に重なり合う」場合に TRUE を返します。つまり、それらは交差しますが、一方が他方を完全に含むわけではありません。

違いは、2 つのジオメトリが 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
于 2015-06-10T21:03:52.690 に答える