[postgis-tickets] [PostGIS] #5557: Potential bug in the ST_3DIntersects function.

PostGIS trac at osgeo.org
Thu Sep 28 22:10:17 PDT 2023


#5557: Potential bug in the ST_3DIntersects function.
---------------------+---------------------------
 Reporter:  Wenjing  |      Owner:  pramsey
     Type:  defect   |     Status:  new
 Priority:  high     |  Milestone:  PostGIS 3.4.1
Component:  postgis  |    Version:  3.4.x
 Keywords:           |
---------------------+---------------------------
 = Potential bug in the ST_3DIntersects function.

 [https://tarry-goal-613.notion.site/Potential-bug-in-the-ST_3DIntersects-
 function-d356d2cae4c448059ea1b2f88b24ca66?pvs=4| visualization report]

 == Geometry Description

 `Line a`('LINESTRING(5 4 0, 5 0 0)') intersects `Line b` ('LINESTRING(6 4
 0, 4 2 0)') at `Point c`(’POINT(5 3 0)’).

 We affine `Line a` and `Line b` using the same orthogonal matrix M and get
 `Line a1` and `Line b1` respectively.
 {{{
 M = [[-0.9248934130614574, 0.2534855979991293, 0.2834029394388001],
 [-0.2259466894528656, -0.9658860720787614, 0.12653927963108094 ],
 [0.3058108369577812, 0.05300139027692074, 0.9506158975253333]]
 }}}

 == Expected Behavior
 `Line a1` and `Line b1` should intersect at `Point c1` (affine `Point c`
 using `M`) because we only transform the coordinates.

 Point c1 is actually the intersection point of Line a1 and Line b1.

 {{{
 SELECT ST_Distance(Foo.c1, Foo.a1) As c1_to_a1, ST_Distance(Foo.c1,
 Foo.b1) As c1_to_b1
     FROM (
     SELECT ST_GeomFromText('LINESTRING(5 4 0, 5 0 0)', 0) As a
     ,ST_Affine(ST_GeomFromText('LINESTRING(5 4 0, 5 0 0)', 0),
 -0.9248934130614574, 0.2534855979991293, 0.2834029394388001,
 -0.2259466894528656, -0.9658860720787614, 0.12653927963108094,
 0.3058108369577812, 0.05300139027692074, 0.9506158975253333, 0, 0, 0) As
 a1
     ,ST_GeomFromText('LINESTRING(6 4 0, 4 2 0)', 0) As b
     ,ST_Affine(ST_GeomFromText('LINESTRING(6 4 0, 4 2 0)', 0),
 -0.9248934130614574, 0.2534855979991293, 0.2834029394388001,
 -0.2259466894528656, -0.9658860720787614, 0.12653927963108094,
 0.3058108369577812, 0.05300139027692074, 0.9506158975253333, 0, 0, 0) As
 b1
     ,ST_GeomFromText('POINT(5 3 0)', 0) As c
     ,ST_Affine(ST_GeomFromText('POINT(5 3 0)', 0), -0.9248934130614574,
 0.2534855979991293, 0.2834029394388001, -0.2259466894528656,
 -0.9658860720787614, 0.12653927963108094, 0.3058108369577812,
 0.05300139027692074, 0.9506158975253333, 0, 0, 0) As c1
     ) As Foo;

 c1_to_a1 |       c1_to_b1
 ----------+-----------------------
         0 | 4.440892098500626e-16
 (1 row)
 }}}


 == Actual Behavior
 PostGIS thinks that `Line a` and `Line b` intersect, and doesn’t think
 that `Line a1` and `Line b1` intersect.

 {{{
 SELECT ST_3DIntersects(Foo.a, Foo.b) As a_Intersects_b
 , ST_3DIntersects(Foo.a1, Foo.b1) As a1_Intersects_b1
     FROM (
     SELECT ST_GeomFromText('LINESTRING(5 4 0, 5 0 0)', 0) As a
     ,ST_Affine(ST_GeomFromText('LINESTRING(5 4 0, 5 0 0)', 0),
 -0.9248934130614574, 0.2534855979991293, 0.2834029394388001,
 -0.2259466894528656, -0.9658860720787614, 0.12653927963108094,
 0.3058108369577812, 0.05300139027692074, 0.9506158975253333, 0, 0, 0) As
 a1
     ,ST_GeomFromText('LINESTRING(6 4 0, 4 2 0)', 0) As b
     ,ST_Affine(ST_GeomFromText('LINESTRING(6 4 0, 4 2 0)', 0),
 -0.9248934130614574, 0.2534855979991293, 0.2834029394388001,
 -0.2259466894528656, -0.9658860720787614, 0.12653927963108094,
 0.3058108369577812, 0.05300139027692074, 0.9506158975253333, 0, 0, 0) As
 b1
     ) As Foo;

 -- SQL result:

 a_intersects_b | a1_intersects_b1
 ----------------+------------------
  t              | f
 (1 row)
 }}}
-- 
Ticket URL: <https://trac.osgeo.org/postgis/ticket/5557>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.


More information about the postgis-tickets mailing list