[postgis-tickets] [PostGIS] #4025: Bugs in the functions ST_ClosestPointOfApproach, ST_DistanceCPA, and ST_CPAWithin

PostGIS trac at osgeo.org
Wed Feb 21 00:14:38 PST 2018


#4025: Bugs in the functions ST_ClosestPointOfApproach, ST_DistanceCPA, and
ST_CPAWithin
-------------------------------------------------+-------------------------
 Reporter:  ezimanyi                             |      Owner:  pramsey
     Type:  defect                               |     Status:  new
 Priority:  medium                               |  Milestone:  PostGIS
                                                 |  2.4.4
Component:  postgis                              |    Version:  2.4.x
 Keywords:  ST_ClosestPointOfApproach,           |
  ST_DistanceCPA, ST_CPAWithin                   |
-------------------------------------------------+-------------------------
 I have found bugs in the three PostGIS functions providing temporal
 support, that is ST_ClosestPointOfApproach, ST_DistanceCPA, ST_CPAWithin.
 In the examples below, the M values of the geometries keep the timestamps
 encoded in epoch, that is, in seconds since 1970-01-01.

 ---------------------------------------------------------------


 {{{
 select to_timestamp(ST_ClosestPointOfApproach(
 geometry 'LINESTRING M (
 3002640.82925984 5833770.09678249 1180471354.482,
 3003084.56741608 5833866.22147656 1180471411.791,
 3003325.8165722 5833942.66399188 1180471442.914,
 3003634.9521919 5834039.57644606 1180471482.436,
 3003701.57229565 5833872.50949516 1180471494.55)',

 geometry 'LINESTRING M (
 2996311.19255982 5844593.73486637 1180471513.163,
 2996310.72190852 5844712.60937002 1180471523.37,
 2996311.81673704 5844916.90864168 1180471541.171)'
 ));
 -- "2007-05-29 20:43:44+00"

 }}}

 The two geometries do not intersect in the time dimension as can be seen
 next.


 {{{
 select tstzrange(to_timestamp(1180471354.482),
 to_timestamp(1180471494.55)) as r1,
     tstzrange(to_timestamp(1180471513.163), to_timestamp(1180471541.171))
 as r2,
     tstzrange(to_timestamp(1180471354.482), to_timestamp(1180471494.55)) *
     tstzrange(to_timestamp(1180471513.163), to_timestamp(1180471541.171))
 as intersection
 -- "["2007-05-29 20:42:34.482+00","2007-05-29 20:44:54.55+00")";
 -- "["2007-05-29 20:45:13.163+00","2007-05-29 20:45:41.171+00")";
 -- "empty"

 }}}

 ---------------------------------------------------------------


 {{{
 select ST_DistanceCPA (
 geometry 'LINESTRING M (
 3002640.82925984 5833770.09678249 1180471354.482,
 3003084.56741608 5833866.22147656 1180471411.791,
 3003325.8165722 5833942.66399188 1180471442.914,
 3003634.9521919 5834039.57644606 1180471482.436,
 3003701.57229565 5833872.50949516 1180471494.55)',

 geometry 'LINESTRING M (
 2996311.19255982 5844593.73486637 1180471513.163,
 2996310.72190852 5844712.60937002 1180471523.37,
 2996311.81673704 5844916.90864168 1180471541.171)'
 );

 -- 1.84467435239537e+19
 }}}

 Again, the two geometries do not intersect in the time dimension as can be
 seen next.


 {{{
 select tstzrange(to_timestamp(1180471354.482),
 to_timestamp(1180471494.55)) as r1,
     tstzrange(to_timestamp(1180471513.163), to_timestamp(1180471541.171))
 as r2,
     tstzrange(to_timestamp(1180471354.482), to_timestamp(1180471494.55)) *
     tstzrange(to_timestamp(1180471513.163), to_timestamp(1180471541.171))
 as intersection
 -- "["2007-05-29 20:42:34.482+00","2007-05-29 20:44:54.55+00")";
 -- "["2007-05-29 20:45:13.163+00","2007-05-29 20:45:41.171+00")";
 -- "empty"

 }}}

 Another example that raises an error


 {{{
 select st_distanceCPA(
 geometry 'LINESTRING M (
 2997192.88890412 5839689.91506735 1180427687.535,
 2985681.00213108 5848959.94022801 1180428894.461,
 2985654.50641456 5848965.14626724 1180428897.729)',

 geometry 'LINESTRING M (
 3010311.09650771 5836055.09743228 1180426478.189,
 2997990.4548773 5837170.57877078 1180427568.652,
 2997958.79103681 5837131.44898043 1180427572.06)'
 )

 ERROR:  Could not find point with M=4.85636e-33 on first geom

 select tstzrange(to_timestamp(1180427687.535),
 to_timestamp(1180428897.729)) as r1,
     tstzrange(to_timestamp(1180426478.189), to_timestamp(1180427572.06))
 as r2,
     tstzrange(to_timestamp(1180427687.535), to_timestamp(1180428897.729))
 *
     tstzrange(to_timestamp(1180426478.189), to_timestamp(1180427572.06))
 as intersection

 -- "["2007-05-29 08:34:47.535+00","2007-05-29 08:54:57.729+00")";
 -- "["2007-05-29 08:14:38.189+00","2007-05-29 08:32:52.06+00")";
 -- "empty"

 }}}

 ---------------------------------------------------------------

 Finally, an example where the function raises a warning.

 {{{
 select st_cpawithin(
 geometry 'LINESTRING M (
 3019128.43134286 5840247.67862383 1180456071.042,
 3019119.61305787 5840246.74066617 1180456073.042,
 2996737.82023413 5844599.06195388 1180457771.512,
 2996737.59384604 5844601.28272594 1180457771.789)',

 geometry 'LINESTRING M (
 3009712.72081161 5845603.63178027 1180455259.727,
 3005699.98574744 5843414.54803783 1180455707.126,
 3005620.80433525 5839623.27707574 1180456050.83,
 3005625.01275697 5839609.12408978 1180456052.609)',
 10);

 NOTICE:  Could not find point with M=4.68292e-310 on first geom


 }}}
 ---------------------------------------------------------------

-- 
Ticket URL: <https://trac.osgeo.org/postgis/ticket/4025>
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