Opened 7 hours ago
#5838 new defect
Possible bug in ST_Intersects
Reported by: | rouen | Owned by: | pramsey |
---|---|---|---|
Priority: | medium | Milestone: | PostGIS 3.5.2 |
Component: | postgis | Version: | 3.5.x |
Keywords: | Cc: | rouen |
Description
POSTGIS="3.5.1 48ab069" [EXTENSION] PGSQL="160" GEOS="3.8.0-CAPI-1.13.1 " PROJ="6.3.1" LIBXML="2.9.10" LIBJSON="0.13.1" LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)"
Let's have 2 lines in chain (endpoint of one is startpoint of the other) and 3rd line intersecting (one of) them very close to that point. ST_Intersects behaves badly in this case:
WITH data AS ( SELECT 'a' AS id, st_geomfromtext('LINESTRING(20.3580062 48.3096067,20.3579669 48.3096863)',4326) AS geom UNION SELECT 'b' AS id, st_geomfromtext('LINESTRING(20.3579669 48.3096863,20.3579264 48.3097684)',4326) AS geom UNION SELECT 'c' AS id, st_geomfromtext('LINESTRING(20.3580084 48.3097278,20.3579583 48.3096777)',4326) AS geom ) SELECT st_intersects(a.geom,b.geom) AS ab_intersects, -- true st_intersects(a.geom,c.geom) AS ac_intersects, -- false st_intersects(b.geom,c.geom) AS bc_intersects -- false FROM data a, data b, data c WHERE a.id = 'a' and b.id = 'b' and c.id = 'c';
This alone is wrong (c is clearly crossing the chain of a+b). But interestingly enough, with JOIN it gives different results (c does intersects a):
WITH data AS ( SELECT 'a' AS id, st_geomfromtext('LINESTRING(20.3580062 48.3096067,20.3579669 48.3096863)',4326) AS geom UNION SELECT 'b' AS id, st_geomfromtext('LINESTRING(20.3579669 48.3096863,20.3579264 48.3097684)',4326) AS geom UNION SELECT 'c' AS id, st_geomfromtext('LINESTRING(20.3580084 48.3097278,20.3579583 48.3096777)',4326) AS geom ) SELECT c.id, x.id -- 3 + 1 FROM data c JOIN data x ON st_intersects(c.geom,x.geom) WHERE c.id='c' and x.id<>'c'
Note:
See TracTickets
for help on using tickets.