[PostGIS] #6096: false positive values from topology.findvertexsegmentpairsbelowdistance

PostGIS trac at osgeo.org
Sat Jul 11 02:38:25 PDT 2026


#6096: false positive values from topology.findvertexsegmentpairsbelowdistance
-------------------------------+---------------------------
 Reporter:  Lars Aksel Opsahl  |      Owner:  strk
     Type:  defect             |     Status:  new
 Priority:  medium             |  Milestone:  PostGIS 3.6.5
Component:  topology           |    Version:  3.6.x
 Keywords:                     |
-------------------------------+---------------------------
 Here i as very simple testcase involving only 3 edges and 4 nodes  (See
 attached image) where I do not understand why
 findvertexsegmentpairsbelowdistance return any rows after added last edge.

 This is tested on (this source seems to be equals to master now)
 {{{
 POSTGIS="3.7.0dev 3.6.0rc2-473-g260127869" [EXTENSION] PGSQL="160"
 GEOS="3.14.1-CAPI-1.20.5" PROJ="9.8.1 NETWORK_ENABLED=OFF
 URL_ENDPOINT=https://cdn.proj.org
 USER_WRITABLE_DIRECTORY=/Users/lop/Library/Application Support/proj
 DATABASE_PATH=/opt/homebrew/Cellar/proj/9.8.1/share/proj/proj.db"
 (compiled against PROJ 9.8.1) LIBXML="2.9.13" LIBJSON="0.18"
 LIBPROTOBUF="1.5.2" WAGYU="0.5.0 (Internal)" TOPOLOGY
 }}}

 First we create topology and add 2 edges and run
 FindVertexSegmentPairsBelowDistance  and we find no rows


 {{{
 SELECT topology.CreateTopology('test_topo', 4258);

 -- length degrees/meter 0.00012703297390676815, 7.493098741177089

 SELECT topology.TopoGeo_AddLineString(
                 'test_topo',
 '0102000020A210000002000000140ABB6EA5D71640BE3992239B764D40B0F58F6FC6D7164070DDBCB19B764D40',
                 -1
 );

 -- length degrees/meter 0.003258284155984599, 219.199284164798
 SELECT topology.TopoGeo_AddLineString(
                 'test_topo',
 '0102000020A210000043000000B0F58F6FC6D7164070DDBCB19B764D4015A3C3FEC3D71640053545C59C764D40C441CFAEC1D716403B4111D59D764D40F6773F07BFD71640992AF7FB9E764D4002C3C8D6BBD71640381A8D3DA0764D40F0138846B9D71640AB2C8464A1764D404C63BE22B7D71640E6007977A2764D400AA7863AB6D71640B4B2053DA3764D402167506CB5D716408371B33CA4764D4020EF5FAFB6D71640523997A1A5764D40E38AC2A6B7D716409C22B3FEA6764D4050102D65B9D716400377F7D0A7764D40E60D3260BAD71640CBA19F15A8764D4021CCAB5ABBD71640D1B8045BA8764D40B38AB91CBED716400553AEDCA8764D40C47D5489C1D716404ED51555A9764D400A86CD9EC7D71640A1D545E6A9764D40737BCFF4CFD71640A79FFD9EAA764D4045076813DBD7164050651F75AB764D406370ECE1E2D716406A2A3809AC764D40D870ED1FECD7164037605CB4AC764D4067929793F5D71640DA50B437AD764D401164A220FAD71640BB2EF676AD764D406F9986BD08D81640232E3624AE764D400FCA4A1D14D8164033AE9AA4AE764D40FDFC606D1FD81640E00123EDAE764D40E7FF74442AD816407FE0553BAF764D401B99230D38D816407CA5B28FAF764D407C2AAC3646D8164067C6FFCFAF764D402D2052F856D81640B882BE20B0764D400632A66763D816406826A65FB0764D40F16AEE2872D81640F9B397BEB0764D40195FBF2D7CD816403E8BC9FDB0764D40873577EE9CD81640D3DB09E7B1764D40F902DA829ED816405ED18DF3B1764D4055F67C41B2D816400F2CF38FB2764D40FE839CB5CAD81640EC61942EB3764D40CE5FA9CBD9D816403F4B4589B3764D4092BAD187ECD81640EE7D3FF2B3764D400E0637AEFBD81640AA0CF846B4764D407FCFF1420AD91640E258AD93B4764D40683A085A20D916401FFA6302B5764D403206B4E931D916405B415158B5764D4072222D0643D91640A00E5CACB5764D40166AA6EA58D91640FF603120B6764D406AA71D6366D916403542E153B6764D40E200F78D77D91640C4671D95B6764D409D69335384D91640ED7A2CBFB6764D4041AF95AA91D91640F6CD7BF0B6764D400848C2BA9BD9164025DA8D11B7764D40A36E527CA4D91640E678CC2DB7764D40B709B628B5D916406D324B5DB7764D4010A24944C6D91640BF73EF93B7764D406FA30E3AD7D9164024CC38CEB7764D40455A71A2EAD916406E52C30CB8764D408A52BAF7FDD91640C5E90955B8764D40FB0D411411DA16401004A29BB8764D40E3A3E4581DDA16403DB60AC6B8764D408235534B25DA1640652A9BDEB8764D4014D1610B34DA164039610E11B9764D40280C59AC43DA1640C452CA4EB9764D40AA5C015E4ADA164068B18D5FB9764D407D27C9EE54DA16400C1B4780B9764D40E54246D561DA16407860B2ACB9764D40A0A4E5E671DA1640170B3BE0B9764D402E7F73F781DA1640995C5524BA764D40BD0BDE2293DA1640E4CBD061BA764D40',
                 -1
 );

 SELECT * FROM topology.FindVertexSegmentPairsBelowDistance(
                                 'test_topo',
                                 1e-7
                 );

 }}}

 Then we add the last line that connects to the common node for the two
 first edges.


 {{{

 -- length degrees/meter 0.0011735358268378264, 128.4983388560817
 SELECT topology.TopoGeo_AddLineString(
                 'test_topo',
 '0102000020A210000027000000B0F58F6FC6D7164070DDBCB19B764D40CF154E71C6D716400EE6FCB09B764D40528C13F2C6D71640C0472D789B764D4052A9A2F4C8D7164096B1DB349A764D40C4D12755CAD716402AA77E7999764D4044CDE1A6CAD71640F912CE9398764D40BBA76ED9CAD71640B326A5C797764D4007B85C5ACBD71640D31470C296764D40B36EA1BCCBD716407BD6F19895764D40C4D2FD4FCCD71640482FBF8A94764D4065823702CDD71640023DDC4493764D4080D44CB1CDD71640D841A44F92764D40C59BB2DDCDD71640DBDED39A91764D403031991ECED71640AA77E08D90764D40A2F8D900CED71640489CF9638F764D40BE86A089CDD7164028A35A168E764D4039810998CCD716405A3FC74A8D764D4025FFFB8BCCD7164078068D658C764D407D923A66CCD716404A9326A28B764D4046EF061DCAD71640DFECD9EC8A764D40E146A265C7D7164015B5D14D8A764D4062ED7FC4C3D71640D002A3BE89764D407DF8A028BFD71640AFEEE29D88764D401CF1F007BCD7164086F147D187764D40C7F09DAEB9D71640FAF3F52187764D401CE0232CB9D71640D1FC7DE786764D4035481D9EB8D7164048A8FEAC86764D4068AECCB1B8D71640C607861886764D4038C9A78FB9D71640B782828E85764D40774ABFA4BCD7164082D70AE783764D40904279A9BFD716400D1B8BA182764D40669F4FE9C2D71640EA228D3C81764D40A572AC5FC3D716408406BFCA7F764D40A851BC6DC3D716404D5FC81A7E764D40996647BCC7D71640408EF21F7A764D40C8B53DFCC7D716402808A56079764D4074900168C8D716401E83457778764D40D08B1742C9D71640E2EB9F7777764D40A9439B1ECAD7164043C6A22576764D40',
                 -1
 );


 SELECT * FROM topology.FindVertexSegmentPairsBelowDistance(
                                 'test_topo',
                                 1e-7
                 );

 }}}

 and we return this 4 rows


 {{{

  seg_edge | segno | vert_edge | vertno |                     vert_geom
 ----------+-------+-----------+--------+----------------------------------------------------
         1 |     1 |         3 |      2 |
 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40
         3 |     2 |         1 |      2 |
 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40
         3 |     2 |         2 |      1 |
 0101000020A2100000B0F58F6FC6D7164070DDBCB19B764D40
         2 |     1 |         3 |      2 |
 0101000020A2100000CF154E71C6D716400EE6FCB09B764D40
 (4 rows)

 }}}

 I do understand why rows are returned.
-- 
Ticket URL: <https://trac.osgeo.org/postgis/ticket/6096>
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