Opened 13 months ago

Last modified 9 months ago

#5589 closed defect

ST_3DDistance seems not to work for LINESTRINGs in specified situation. — at Initial Version

Reported by: Wenjing Owned by: pramsey
Priority: critical Milestone: PostGIS 3.2.8
Component: postgis Version: 3.4.x
Keywords: Cc: Wenjing

Description

For the following query involving ST_3DDistance:

SELECT ST_3DDistance(b1, b2)  
FROM ST_GeomFromText('LINESTRING Z (0 0 0, 1 0 0)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 1 1 1)') As b2;
--  st_3ddistance 
---------------
--              
-- (1 row)

PostGIS returns a null result which is unexpected.

PostGIS seems not to work for LINESTRINGs (i.e., returning an unexpected null result) when (1) both LINESTRINGs start from 0,0,0 and (2) both LINESTRINGs only involve two points.

(1) For example, when a LINESTRING does not start from 0,0,0

SELECT ST_3DDistance(b1, b2)  
FROM ST_GeomFromText('LINESTRING Z (0 0 1, 0 0 0)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 0 0 1)') As b2;
--  st_3ddistance 
---------------
--              0
-- (1 row)

PostGIS can give the expected result.

(2) or when a LINESTRING involves more than two points

SELECT ST_3DDistance(b1, b2)  
FROM ST_GeomFromText('LINESTRING Z (0 0 0, 0 1 0, 0 2 0)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 1 0 0)') As b2;
--  st_3ddistance 
---------------
--              1
-- (1 row)

PostGIS also works for the case.

The unexpected behavior for ST_3DDistance also propagates to ST_3DDWithin.

For example, the following query is expected to have true while PostGIS gives false

SELECT ST_3DDWithin(b1, b2, 10000)  
FROM ST_GeomFromText('LINESTRING Z (0 0 0, 1 0 0)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 1 1 1)') As b2;
--expected{t},actual{f}

The ST_3DDWithin works correctly if we change the start point or add one more point as above.

SELECT ST_3DDWithin(b1, b2, 10000)  
FROM ST_GeomFromText('LINESTRING Z (0 0 1, 1 0 0)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 1 1 1)') As b2;
--result{t}
SELECT ST_3DDWithin(b1, b2, 10000) 
FROM ST_GeomFromText('LINESTRING Z (0 0 0, 1 0 0, 1 2 1)') As b1,
ST_GeomFromText('LINESTRING Z (0 0 0, 1 1 1)') As b2;
--result{t}

version: POSTGIS="3.5.0dev 3.4.0rc1-705-g5c3ec8392" [EXTENSION] PGSQL="170" GEOS="3.13.0dev-CAPI-1.18.0" PROJ="8.2.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db" LIBXML="2.9.13" PostgreSQL 17devel on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0- 1ubuntu1~22.04) 11.4.0, 64-bit

Change History (0)

Note: See TracTickets for help on using tickets.