Split an edge by a node, modifying the original edge and adding a new one.
1018{
1022 const LWGEOM *oldedge_geom;
1023 const LWGEOM *newedge_geom;
1026 int ret;
1027
1028 split_col =
_lwt_EdgeSplit( topo, edge, pt, skipISOChecks, &oldedge );
1029 if ( ! split_col ) return -1;
1030 oldedge_geom = split_col->
geoms[0];
1031 newedge_geom = split_col->
geoms[1];
1032
1034 ((
LWGEOM*)newedge_geom)->srid = split_col->
srid;
1035
1036
1041 {
1045 return -1;
1046 }
1048
1051 lwerror(
"Backend coding error: "
1052 "insertNodes callback did not return node_id");
1053 return -1;
1054 }
1055
1056
1058 if ( newedge1.
edge_id == -1 ) {
1062 return -1;
1063 }
1072
1073 if ( ! newedge1.
geom ) {
1076 lwerror(
"first geometry in lwgeom_split output is not a line");
1077 return -1;
1078 }
1080 if ( ret == -1 ) {
1084 return -1;
1085 } else if ( ret == 0 ) {
1088 lwerror(
"Insertion of split edge failed (no reason)");
1089 return -1;
1090 }
1091
1092
1094
1095 if ( ! updedge.
geom ) {
1098 lwerror(
"second geometry in lwgeom_split output is not a line");
1099 return -1;
1100 }
1106 NULL, 0);
1107 if ( ret == -1 ) {
1111 return -1;
1112 } else if ( ret == 0 ) {
1115 lwerror(
"Edge being split (%d) disappeared during operations?", oldedge->
edge_id);
1116 return -1;
1117 } else if ( ret > 1 ) {
1120 lwerror(
"More than a single edge found with id %d !", oldedge->
edge_id);
1121 return -1;
1122 }
1123
1124
1125
1134 if ( ret == -1 ) {
1138 return -1;
1139 }
1140
1149 if ( ret == -1 ) {
1153 return -1;
1154 }
1155
1156
1158 if ( ! ret ) {
1162 return -1;
1163 }
1164
1167
1168
1170}
void lwcollection_free(LWCOLLECTION *col)
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
#define LWT_COL_EDGE_START_NODE
#define LWT_COL_EDGE_NEXT_RIGHT
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
#define LWT_COL_EDGE_END_NODE
#define LWT_COL_EDGE_NEXT_LEFT
#define LWT_COL_EDGE_GEOM
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
LWT_ELEMID lwt_be_getNextEdgeId(LWT_TOPOLOGY *topo)
int lwt_be_updateTopoGeomEdgeSplit(LWT_TOPOLOGY *topo, LWT_ELEMID split_edge, LWT_ELEMID new_edge1, LWT_ELEMID new_edge2)
int lwt_be_insertNodes(LWT_TOPOLOGY *topo, LWT_ISO_NODE *node, uint64_t numelems)
int lwt_be_updateEdges(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *sel_edge, int sel_fields, const LWT_ISO_EDGE *upd_edge, int upd_fields, const LWT_ISO_EDGE *exc_edge, int exc_fields)
int lwt_be_insertEdges(LWT_TOPOLOGY *topo, LWT_ISO_EDGE *edge, uint64_t numelems)
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
static LWCOLLECTION * _lwt_EdgeSplit(LWT_TOPOLOGY *topo, LWT_ELEMID edge, LWPOINT *pt, int skipISOChecks, LWT_ISO_EDGE **oldedge)
LWT_ELEMID containing_face
const LWT_BE_IFACE * be_iface