[PostGIS] #6095: add fixVertexSegmentPairsBelowDistanc

PostGIS trac at osgeo.org
Fri Jul 10 01:28:46 PDT 2026


#6095: add fixVertexSegmentPairsBelowDistanc
-------------------------------+---------------------------
 Reporter:  Lars Aksel Opsahl  |      Owner:  strk
     Type:  enhancement        |     Status:  new
 Priority:  medium             |  Milestone:  PostGIS 3.6.5
Component:  topology           |    Version:  3.6.x
 Keywords:                     |
-------------------------------+---------------------------
 In the attached dump we this case


 {{{
 [local] lop at t1=# SELECT * FROM
 topology.FindVertexSegmentPairsBelowDistance('grunnkart_037',1e-15);
  seg_edge | segno | vert_edge | vertno |                     vert_geom
 ----------+-------+-----------+--------+----------------------------------------------------
         7 |    59 |        31 |      2 |
 0101000020A2100000767C04140DD7164009093C79AE774D40

 }}}

 the problem here that when covert this topology to simple feature we get
 this error

 {{{

 SELECT
 ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8)));
 NOTICE:  00000: Self-intersection at or near point 5.7100108290768832
 58.935012010161067
 LOCATION:  pg_notice, lwgeom_pg.c:389
  st_isvalid
 ------------
  f
 (1 row)

 }}}

 Then we run this code


 {{{
 DO $$
 DECLARE
                 r RECORD;
 BEGIN
                 FOR r IN
                                 SELECT DISTINCT ON (vs.vert_geom,
 e.edge_id)
                                                         e.geom,
                                                         vs.vert_geom
                                 FROM
 topology.FindVertexSegmentPairsBelowDistance(
 'grunnkart_037',
                                                                 1e-15
                                                 ) AS vs
                                 JOIN grunnkart_037.edge e
                                         ON e.edge_id = vs.seg_edge
                                 ORDER BY vs.vert_geom, e.edge_id
                 LOOP
                                 BEGIN
                                                 PERFORM
 topology.TopoGeo_addLinestring( 'grunnkart_037', ST_ShortestLine(r.geom,
 r.vert_geom), -1 );
                                 EXCEPTION
                                                 WHEN OTHERS THEN
                                                                 RAISE
 WARNING 'Failed: %, error: %',
 ST_AsText(r.vert_geom),
 SQLERRM;
                                 END;
                 END LOOP;
 END;
 $$;


 }}}

 and the face geom is valid


 {{{
 SELECT
 ST_ISvalid(ST_GeomFromEWKT(ST_AsEWKT(topology.ST_GetFaceGeometry('grunnkart_037',20),8)));
  st_isvalid
 ------------
  t
 (1 row)

 }}}

 tested on

 {{{

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