Frage st_intersects Vs st_overlaps


Was ist der Unterschied zwischen diesen beiden Abfragen?

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 ;

Wenn die erste Abfrage die richtige Ausgabe liefert, während die zweite Abfrage überhaupt keine Zeilen abruft. Die Straße, die die Polygone schneidet, überlappt sie auch, oder?


5
2018-05-07 10:14


Ursprung


Antworten:


Aus der Dokumentation von PostGIS

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

Wenn eine Geometrie oder Geographie einen Teil des Raums teilt, dann schneiden sie sich. Überlappungen, Berührungen, In allen implizieren räumliche Überschneidung. Wenn einer von   das vorhin erwähnte stimmt, dann die Geometrien auch räumlich   schneiden.

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

Gibt TRUE zurück, wenn die Geometrien sich "räumlich überlappen". Damit meinen wir   sie schneiden sich, aber eines enthält kein anderes.

Der Unterschied ist: Überlappen sich zwei Geometrien zu 100%, überlappen sie sich nicht mehr.

Hier ist ein POSTGIS Beispiel:

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

9
2018-06-10 21:03