[postgis-tickets] [PostGIS] #3149: 3D-Distance/KNN distances don't agree sometimes

PostGIS trac at osgeo.org
Thu Jun 4 00:30:27 PDT 2015


#3149: 3D-Distance/KNN distances don't agree sometimes
---------------------+---------------------------
 Reporter:  robe     |      Owner:  pramsey
     Type:  defect   |     Status:  new
 Priority:  blocker  |  Milestone:  PostGIS 2.2.0
Component:  postgis  |    Version:  trunk
 Keywords:           |
---------------------+---------------------------
 I started putting together the knn recheck tests for 3d, all was good
 until I got into more complex types:

 -- script to create the 3d geometry table is as follows:
 {{{
 CREATE TABLE knn_recheck_geom_nd(gid serial primary key, geom geometry);
 INSERT INTO knn_recheck_geom_nd(gid,geom)
 SELECT ROW_NUMBER() OVER(ORDER BY x,y) AS gid,
 ST_MakePoint(x*0.777,y*0.887,z*1.05) As geom
 FROM generate_series(-100,1000, 7) AS x ,
     generate_series(-300,1000,9) As y,
  generate_series(1005,10000,5555) As z ;

  -- 3d lines
 INSERT INTO knn_recheck_geom_nd(gid, geom)
 SELECT 500000 + i, ST_Translate('LINESTRING(-100 300 500, 500 700 600, 400
 123 0, 500 10000 -1234, 1 1 5000)'::geometry, i*2000,0)
 FROM generate_series(0,10) i;


 -- 3d polygons
 INSERT INTO knn_recheck_geom_nd(gid, geom)
 SELECT 500100 + i, ST_Translate('POLYGON((100 800 5678, 100 700 5678, 400
 123 5678, 405 124 5678, 100 800 5678))'::geometry,0,i*2000)
 FROM generate_series(0,3) i;

 -- polyhedral surface --
 INSERT INTO knn_recheck_geom_nd(gid,geom)
 SELECT 600000 + row_number() over(), ST_Translate(the_geom,100, 450,1000)
 As the_geom
                 FROM (VALUES ( ST_GeomFromText(
 'PolyhedralSurface(
 ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
 ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0
 0)),  ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
 ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),  ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0
 1))
 )') ) ,
 ( ST_GeomFromText(
 'PolyhedralSurface(
 ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
 ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)) )') ) )
 As foo(the_geom) ;
 }}}

 The results of this test don't agree with the ST_3DDistance answer:


 {{{
 SELECT '#2nd-3' As t, gid, ST_GeometryType(geom),
     ST_3dDistance( 'MULTILINESTRING((-95 -300 5000, 100 450 1000, 100 323
 200),(-50 2000 456, 30 6000 789))'::geometry, geom)::numeric(12,4),
                    'MULTILINESTRING((-95 -300 5000, 100 450 1000, 100 323
 200),(-50 2000 456, 30 6000 789))'::geometry <<->> geom As knn_dist
 FROM knn_recheck_geom_nd
 ORDER BY 'MULTILINESTRING((-95 -300 5000, 100 450 1000, 100 323 200),(-50
 2000 456, 30 6000 789))'::geometry <<->> geom LIMIT 5;

 }}}



 {{{
    t    |  gid   | st_geometrytype | st_3ddistance |     knn_dist
 --------+--------+-----------------+---------------+------------------
  #2nd-3 | 500000 | ST_LineString   |       47.9294 | 2275.46599623022
  #2nd-3 |   4640 | ST_Point        |      447.4051 | 2500.71300499541
  #2nd-3 |   4349 | ST_Point        |      448.6050 |   2500.715907504
  #2nd-3 |   4929 | ST_Point        |      446.2682 | 2500.72193218324
  #2nd-3 |   4060 | ST_Point        |      449.8674 | 2500.73063966772
 (5 rows)
 }}}

 I think the knn_dist answer is wrong because I purposely carefully
 constructed my multilinestring so it would cut into my polyhedral surface,
 and my polyhedral surface is no where in sight in this query:


 {{{
 SELECT
  ST_3dDistance( 'MULTILINESTRING((-95 -300 5000, 100 450 1000, 100 323
 200),(-50 2000 456, 30 6000 789))'::geometry, geom)::numeric(12,4),
                    'MULTILINESTRING((-95 -300 5000, 100 450 1000, 100 323
 200),(-50 2000 456, 30 6000 789))'::geometry <<->> geom As knn_dist
  from knn_recheck_geom_nd where gid = 600001;

  st_3ddistance |     knn_dist
 ---------------+------------------
         0.0000 | 2885.41236221099
 }}}

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