st_intersects Vs st_overlaps

В чем разница между этими двумя запросами:

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 ; 

Где первый запрос дает правильный вывод, тогда как второй запрос не получает никаких строк вообще. Дорога, которая пересекает полигоны, также перекрывает ее, не так ли?

Из документации PostGIS

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

Если геометрия или география разделяют любую часть пространства, они пересекаются. Overlaps, Touches, In all подразумевают пространственное пересечение. Если какой-либо из вышеперечисленных возвращает 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