[postgis-tickets] r15330 - Fix azimuth computation for 2.5D edge ends

Sandro Santilli strk at kbt.io
Sat Mar 11 08:21:18 PST 2017


Author: strk
Date: 2017-03-11 08:21:18 -0800 (Sat, 11 Mar 2017)
New Revision: 15330

Modified:
   trunk/liblwgeom/lwgeom_topo.c
   trunk/topology/test/regress/topogeo_addlinestring.sql
   trunk/topology/test/regress/topogeo_addlinestring_expected_newsnap
   trunk/topology/test/regress/topogeo_addlinestring_expected_oldsnap
Log:
Fix azimuth computation for 2.5D edge ends

The change disreguard vertical movemements of the edge and computes
azimuth of the first segment getting away from the node.

Includes automated testcase

See #3711

Modified: trunk/liblwgeom/lwgeom_topo.c
===================================================================
--- trunk/liblwgeom/lwgeom_topo.c	2017-03-11 14:33:33 UTC (rev 15329)
+++ trunk/liblwgeom/lwgeom_topo.c	2017-03-11 16:21:18 UTC (rev 15330)
@@ -1401,7 +1401,7 @@
  * Get first distinct vertex from endpoint
  * @param pa the pointarray to seek points in
  * @param ref the point we want to search a distinct one
- * @param from vertex index to start from
+ * @param from vertex index to start from (will really start from "from"+dir)
  * @param dir  1 to go forward
  *            -1 to go backward
  * @return 0 if edge is collapsed (no distinct points)
@@ -1570,7 +1570,12 @@
 
     if ( edge->start_node == node ) {
       getPoint2d_p(pa, 0, &p1);
-      getPoint2d_p(pa, 1, &p2);
+      if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, 0, 1, &p2) )
+      {
+        lwerror("Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
+                edge->edge_id, p1.x, p1.y, p2.x, p2.y);
+        return -1;
+      }
       LWDEBUGF(1, "edge %" LWTFMT_ELEMID
                   " starts on node %" LWTFMT_ELEMID
                   ", edgeend is %g,%g-%g,%g",
@@ -1627,7 +1632,12 @@
 
     if ( edge->end_node == node ) {
       getPoint2d_p(pa, pa->npoints-1, &p1);
-      getPoint2d_p(pa, pa->npoints-2, &p2);
+      if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, pa->npoints-1, -1, &p2) )
+      {
+        lwerror("Edge %d has no distinct vertices: [%.15g %.15g,%.15g %.15g]: ",
+                edge->edge_id, p1.x, p1.y, p2.x, p2.y);
+        return -1;
+      }
       LWDEBUGF(1, "edge %" LWTFMT_ELEMID " ends on node %" LWTFMT_ELEMID
                   ", edgeend is %g,%g-%g,%g",
                   edge->edge_id, node, p1.x, p1.y, p2.x, p2.y);
@@ -2362,6 +2372,7 @@
   newedge.geom = geom;
   newedge.face_left = -1;
   newedge.face_right = -1;
+  /* TODO: should do the repeated points removal in 2D space */
   cleangeom = lwgeom_remove_repeated_points( lwline_as_lwgeom(geom), 0 );
 
   pa = lwgeom_as_lwline(cleangeom)->points;
@@ -2375,18 +2386,17 @@
   span.cwFace = span.ccwFace =
   epan.cwFace = epan.ccwFace = -1;
 
-  /* Compute azimut of first edge end on start node */
+  /* Compute azimuth of first edge end on start node */
   getPoint2d_p(pa, 0, &p1);
-  getPoint2d_p(pa, 1, &pn);
-  if ( p2d_same(&p1, &pn) ) {
+  if ( ! _lwt_FirstDistinctVertex2D(pa, &p1, 0, 1, &pn) )
+  {
     lwgeom_free(cleangeom);
-    /* Can still happen, for 2-point lines */
     lwerror("Invalid edge (no two distinct vertices exist)");
     return -1;
   }
   if ( ! azimuth_pt_pt(&p1, &pn, &span.myaz) ) {
     lwgeom_free(cleangeom);
-    lwerror("error computing azimuth of first edgeend [%g,%g-%g,%g]",
+    lwerror("error computing azimuth of first edgeend [%.15g %.15g,%.15g %.15g]",
             p1.x, p1.y, pn.x, pn.y);
     return -1;
   }
@@ -2394,10 +2404,16 @@
 
   /* Compute azimuth of last edge end on end node */
   getPoint2d_p(pa, pa->npoints-1, &p2);
-  getPoint2d_p(pa, pa->npoints-2, &pn);
+  if ( ! _lwt_FirstDistinctVertex2D(pa, &p2, pa->npoints-1, -1, &pn) )
+  {
+    lwgeom_free(cleangeom);
+    /* This should never happen as we checked the edge while computing first edgend */
+    lwerror("Invalid clean edge (no two distinct vertices exist) - should not happen");
+    return -1;
+  }
   lwgeom_free(cleangeom);
   if ( ! azimuth_pt_pt(&p2, &pn, &epan.myaz) ) {
-    lwerror("error computing azimuth of last edgeend [%g,%g-%g,%g]",
+    lwerror("error computing azimuth of last edgeend [%.15g %.15g,%.15g %.15g]",
             p2.x, p2.y, pn.x, pn.y);
     return -1;
   }

Modified: trunk/topology/test/regress/topogeo_addlinestring.sql
===================================================================
--- trunk/topology/test/regress/topogeo_addlinestring.sql	2017-03-11 14:33:33 UTC (rev 15329)
+++ trunk/topology/test/regress/topogeo_addlinestring.sql	2017-03-11 16:21:18 UTC (rev 15330)
@@ -322,3 +322,13 @@
 '0102000000020000003AB42BBFEE4C22410010C5A997A6524167BB5DBDEE4C224117FE3DA85FA75241'
 ::geometry, 0);
 SELECT 't3412.end', DropTopology('bug3412');
+
+-- See http://trac.osgeo.org/postgis/ticket/3711
+SELECT 't3371.start', topology.CreateTopology('bug3711', 0, 0, true) > 1;
+SELECT 't3371.L1', topology.TopoGeo_AddLineString('bug3711',
+'LINESTRING (618369 4833784 0.88, 618370 4833784 1.93, 618370 4833780 1.90)'
+::geometry, 0);
+SELECT 't3371.L2', topology.TopoGeo_AddLineString( 'bug3711',
+'LINESTRING (618370 4833780 1.92, 618370 4833784 1.90, 618371 4833780 1.93)'
+::geometry, 0);
+SELECT 't3371.end', topology.DropTopology('bug3711');

Modified: trunk/topology/test/regress/topogeo_addlinestring_expected_newsnap
===================================================================
--- trunk/topology/test/regress/topogeo_addlinestring_expected_newsnap	2017-03-11 14:33:33 UTC (rev 15329)
+++ trunk/topology/test/regress/topogeo_addlinestring_expected_newsnap	2017-03-11 16:21:18 UTC (rev 15330)
@@ -201,3 +201,8 @@
 t3412.L2|5
 t3412.L2|4
 t3412.end|Topology 'bug3412' dropped
+t3371.start|t
+t3371.L1|1
+t3371.L2|3
+t3371.L2|2
+t3371.end|Topology 'bug3711' dropped

Modified: trunk/topology/test/regress/topogeo_addlinestring_expected_oldsnap
===================================================================
--- trunk/topology/test/regress/topogeo_addlinestring_expected_oldsnap	2017-03-11 14:33:33 UTC (rev 15329)
+++ trunk/topology/test/regress/topogeo_addlinestring_expected_oldsnap	2017-03-11 16:21:18 UTC (rev 15330)
@@ -198,3 +198,8 @@
 t3412.L2|5
 t3412.L2|4
 t3412.end|Topology 'bug3412' dropped
+t3371.start|t
+t3371.L1|1
+t3371.L2|3
+t3371.L2|2
+t3371.end|Topology 'bug3711' dropped



More information about the postgis-tickets mailing list