PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ lwt_RemIsoEdge()

int lwt_RemIsoEdge ( LWT_TOPOLOGY topo,
LWT_ELEMID  edge 
)

Remove an isolated edge.

For ST_RemIsoEdge

Parameters
topothe topology to operate on
edgethe identifier of the edge to be moved
Returns
0 on success, -1 on error (liblwgeom error handler will be invoked with error message)

Definition at line 3808 of file lwgeom_topo.c.

3809 {
3810  LWT_ISO_EDGE deledge;
3811  LWT_ISO_EDGE *edge;
3812  LWT_ELEMID nid[2];
3813  LWT_ISO_NODE upd_node[2];
3814  LWT_ELEMID containing_face;
3815  uint64_t n = 1;
3816  uint64_t i;
3817 
3818  edge = lwt_be_getEdgeById( topo, &id, &n, LWT_COL_EDGE_START_NODE|
3822  if ( ! edge )
3823  {
3824  PGTOPO_BE_ERROR();
3825  return -1;
3826  }
3827  if ( ! n )
3828  {
3829  lwerror("SQL/MM Spatial exception - non-existent edge");
3830  return -1;
3831  }
3832  if ( n > 1 )
3833  {
3834  lwfree(edge);
3835  lwerror("Corrupted topology: more than a single edge have id %"
3836  LWTFMT_ELEMID, id);
3837  return -1;
3838  }
3839 
3840  if ( edge[0].face_left != edge[0].face_right )
3841  {
3842  lwfree(edge);
3843  lwerror("SQL/MM Spatial exception - not isolated edge");
3844  return -1;
3845  }
3846  containing_face = edge[0].face_left;
3847 
3848  nid[0] = edge[0].start_node;
3849  nid[1] = edge[0].end_node;
3850  lwfree(edge);
3851 
3852  n = 2;
3853  edge = lwt_be_getEdgeByNode( topo, nid, &n, LWT_COL_EDGE_EDGE_ID );
3854  if ((n == UINT64_MAX) || (edge == NULL))
3855  {
3856  PGTOPO_BE_ERROR();
3857  return -1;
3858  }
3859  for (i = 0; i < n; ++i)
3860  {
3861  if (edge[i].edge_id != id)
3862  {
3863  lwfree(edge);
3864  lwerror("SQL/MM Spatial exception - not isolated edge");
3865  return -1;
3866  }
3867  }
3868  lwfree(edge);
3869 
3870  deledge.edge_id = id;
3871  n = lwt_be_deleteEdges( topo, &deledge, LWT_COL_EDGE_EDGE_ID );
3872  if (n == UINT64_MAX)
3873  {
3874  PGTOPO_BE_ERROR();
3875  return -1;
3876  }
3877  if ( n != 1 )
3878  {
3879  lwerror("Unexpected error: %" PRIu64 " edges deleted when expecting 1", n);
3880  return -1;
3881  }
3882 
3883  upd_node[0].node_id = nid[0];
3884  upd_node[0].containing_face = containing_face;
3885  n = 1;
3886  if ( nid[1] != nid[0] ) {
3887  upd_node[1].node_id = nid[1];
3888  upd_node[1].containing_face = containing_face;
3889  ++n;
3890  }
3891  n = lwt_be_updateNodesById(topo, upd_node, n,
3893  if (n == UINT64_MAX)
3894  {
3895  PGTOPO_BE_ERROR();
3896  return -1;
3897  }
3898 
3899  /* Check that the edge can be safely removed
3900  * See https://trac.osgeo.org/postgis/ticket/3248
3901  */
3902  if ( ! lwt_be_checkTopoGeomRemIsoEdge(topo, id) )
3903  {
3905  return -1;
3906  }
3907 
3908  return 0; /* success */
3909 }
void lwfree(void *mem)
Definition: lwutil.c:248
#define LWT_COL_EDGE_FACE_RIGHT
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_START_NODE
#define LWT_COL_EDGE_FACE_LEFT
#define LWT_COL_NODE_CONTAINING_FACE
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
#define LWT_COL_EDGE_END_NODE
#define PGTOPO_BE_ERROR()
#define LWTFMT_ELEMID
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:114
LWT_ISO_EDGE * lwt_be_getEdgeByNode(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
Definition: lwgeom_topo.c:227
LWT_ISO_EDGE * lwt_be_getEdgeById(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
Definition: lwgeom_topo.c:215
static int lwt_be_checkTopoGeomRemIsoEdge(LWT_TOPOLOGY *topo, LWT_ELEMID edge_id)
Definition: lwgeom_topo.c:338
static int lwt_be_updateNodesById(LWT_TOPOLOGY *topo, const LWT_ISO_NODE *nodes, int numnodes, int upd_fields)
Definition: lwgeom_topo.c:302
int lwt_be_deleteEdges(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *sel_edge, int sel_fields)
Definition: lwgeom_topo.c:310
LWT_ELEMID end_node
LWT_ELEMID face_left
LWT_ELEMID edge_id
LWT_ELEMID start_node
LWT_ELEMID node_id
LWT_ELEMID containing_face
const LWT_BE_IFACE * be_iface

References LWT_TOPOLOGY_T::be_iface, LWT_ISO_NODE::containing_face, LWT_ISO_EDGE::edge_id, LWT_ISO_EDGE::end_node, LWT_ISO_EDGE::face_left, lwerror(), lwfree(), lwt_be_checkTopoGeomRemIsoEdge(), lwt_be_deleteEdges(), lwt_be_getEdgeById(), lwt_be_getEdgeByNode(), lwt_be_lastErrorMessage(), lwt_be_updateNodesById(), LWT_COL_EDGE_EDGE_ID, LWT_COL_EDGE_END_NODE, LWT_COL_EDGE_FACE_LEFT, LWT_COL_EDGE_FACE_RIGHT, LWT_COL_EDGE_START_NODE, LWT_COL_NODE_CONTAINING_FACE, LWTFMT_ELEMID, LWT_ISO_NODE::node_id, PGTOPO_BE_ERROR, and LWT_ISO_EDGE::start_node.

Here is the call graph for this function: