PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ lwt_MoveIsoNode()

int lwt_MoveIsoNode ( LWT_TOPOLOGY topo,
LWT_ELEMID  node,
LWPOINT pt 
)

Move an isolated node.

For ST_MoveIsoNode

Parameters
topothe topology to operate on
nodethe identifier of the nod to be moved
ptthe new node position
Returns
0 on success, -1 on error (liblwgeom error handler will be invoked with error message)

Definition at line 3644 of file lwgeom_topo.c.

3645 {
3646  LWT_ISO_NODE *node;
3647  int ret;
3648  int newPointFace;
3649 
3650  node = _lwt_GetIsoNode( topo, nid );
3651  if ( ! node ) return -1;
3652 
3653  if ( lwt_be_ExistsCoincidentNode(topo, pt) )
3654  {
3655  lwfree(node);
3656  lwerror("SQL/MM Spatial exception - coincident node");
3657  return -1;
3658  }
3659 
3660  if ( lwt_be_ExistsEdgeIntersectingPoint(topo, pt) )
3661  {
3662  lwfree(node);
3663  lwerror("SQL/MM Spatial exception - edge crosses node.");
3664  return -1;
3665  }
3666 
3667  /* Check that the new point is in the same containing face !
3668  * See https://trac.osgeo.org/postgis/ticket/3232 */
3669  newPointFace = lwt_GetFaceContainingPoint(topo, pt);
3670  if ( newPointFace == -1 ) {
3671  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3672  return -1;
3673  }
3674  if ( node->containing_face != newPointFace )
3675  {
3676  lwfree(node);
3677  lwerror("Cannot move isolated node across faces");
3678  return -1;
3679  }
3680 
3681  node->node_id = nid;
3682  node->geom = pt;
3683  ret = lwt_be_updateNodesById(topo, node, 1,
3685  if ( ret == -1 ) {
3686  lwfree(node);
3687  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3688  return -1;
3689  }
3690 
3691  lwfree(node);
3692  return 0;
3693 }
void lwfree(void *mem)
Definition: lwutil.c:242
#define LWT_COL_NODE_GEOM
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
int lwt_be_ExistsEdgeIntersectingPoint(LWT_TOPOLOGY *topo, LWPOINT *pt)
Definition: lwgeom_topo.c:397
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:119
LWT_ELEMID lwt_GetFaceContainingPoint(LWT_TOPOLOGY *topo, const LWPOINT *pt)
Find the face-id of the face properly containing a given point.
Definition: lwgeom_topo.c:7107
static LWT_ISO_NODE * _lwt_GetIsoNode(LWT_TOPOLOGY *topo, LWT_ELEMID nid)
Definition: lwgeom_topo.c:3618
static int lwt_be_updateNodesById(LWT_TOPOLOGY *topo, const LWT_ISO_NODE *nodes, int numnodes, int upd_fields)
Definition: lwgeom_topo.c:307
int lwt_be_ExistsCoincidentNode(LWT_TOPOLOGY *topo, LWPOINT *pt)
Definition: lwgeom_topo.c:384
LWT_ELEMID node_id
LWT_ELEMID containing_face
LWPOINT * geom
const LWT_BE_IFACE * be_iface

References _lwt_GetIsoNode(), LWT_TOPOLOGY_T::be_iface, LWT_ISO_NODE::containing_face, LWT_ISO_NODE::geom, lwerror(), lwfree(), lwt_be_ExistsCoincidentNode(), lwt_be_ExistsEdgeIntersectingPoint(), lwt_be_lastErrorMessage(), lwt_be_updateNodesById(), LWT_COL_NODE_GEOM, lwt_GetFaceContainingPoint(), and LWT_ISO_NODE::node_id.

Here is the call graph for this function: