PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 3647 of file lwgeom_topo.c.

3648{
3649 LWT_ISO_EDGE deledge;
3650 LWT_ISO_EDGE *edge;
3651 LWT_ELEMID nid[2];
3652 LWT_ISO_NODE upd_node[2];
3653 LWT_ELEMID containing_face;
3654 uint64_t n = 1;
3655 uint64_t i;
3656
3657 edge = lwt_be_getEdgeById( topo, &id, &n, LWT_COL_EDGE_START_NODE|
3661 if ( ! edge )
3662 {
3663 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3664 return -1;
3665 }
3666 if ( ! n )
3667 {
3668 lwerror("SQL/MM Spatial exception - non-existent edge");
3669 return -1;
3670 }
3671 if ( n > 1 )
3672 {
3673 lwfree(edge);
3674 lwerror("Corrupted topology: more than a single edge have id %"
3675 LWTFMT_ELEMID, id);
3676 return -1;
3677 }
3678
3679 if ( edge[0].face_left != edge[0].face_right )
3680 {
3681 lwfree(edge);
3682 lwerror("SQL/MM Spatial exception - not isolated edge");
3683 return -1;
3684 }
3685 containing_face = edge[0].face_left;
3686
3687 nid[0] = edge[0].start_node;
3688 nid[1] = edge[0].end_node;
3689 lwfree(edge);
3690
3691 n = 2;
3692 edge = lwt_be_getEdgeByNode( topo, nid, &n, LWT_COL_EDGE_EDGE_ID );
3693 if ((n == UINT64_MAX) || (edge == NULL))
3694 {
3695 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3696 return -1;
3697 }
3698 for (i = 0; i < n; ++i)
3699 {
3700 if (edge[i].edge_id != id)
3701 {
3702 lwfree(edge);
3703 lwerror("SQL/MM Spatial exception - not isolated edge");
3704 return -1;
3705 }
3706 }
3707 lwfree(edge);
3708
3709 deledge.edge_id = id;
3710 n = lwt_be_deleteEdges( topo, &deledge, LWT_COL_EDGE_EDGE_ID );
3711 if (n == UINT64_MAX)
3712 {
3713 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3714 return -1;
3715 }
3716 if ( n != 1 )
3717 {
3718 lwerror("Unexpected error: %d edges deleted when expecting 1", n);
3719 return -1;
3720 }
3721
3722 upd_node[0].node_id = nid[0];
3723 upd_node[0].containing_face = containing_face;
3724 n = 1;
3725 if ( nid[1] != nid[0] ) {
3726 upd_node[1].node_id = nid[1];
3727 upd_node[1].containing_face = containing_face;
3728 ++n;
3729 }
3730 n = lwt_be_updateNodesById(topo, upd_node, n,
3732 if (n == UINT64_MAX)
3733 {
3734 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
3735 return -1;
3736 }
3737
3738 /* TODO: notify to caller about edge being removed ?
3739 * See https://trac.osgeo.org/postgis/ticket/3248
3740 */
3741
3742 return 0; /* success */
3743}
void lwfree(void *mem)
Definition lwutil.c:242
#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
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
static LWT_ISO_EDGE * lwt_be_getEdgeByNode(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
LWT_ISO_EDGE * lwt_be_getEdgeById(LWT_TOPOLOGY *topo, const LWT_ELEMID *ids, uint64_t *numelems, int fields)
static int lwt_be_updateNodesById(LWT_TOPOLOGY *topo, const LWT_ISO_NODE *nodes, int numnodes, int upd_fields)
int lwt_be_deleteEdges(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *sel_edge, int sel_fields)
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
#define LWTFMT_ELEMID
Definition lwgeom_topo.c:43
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_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, and LWT_ISO_EDGE::start_node.

Here is the call graph for this function: