Split an edge by a node, replacing it with two new edges.
1175{
1179 const LWGEOM *oldedge_geom;
1180 const LWGEOM *newedge_geom;
1183 int ret;
1184
1185 split_col =
_lwt_EdgeSplit( topo, edge, pt, skipISOChecks, &oldedge );
1186 if ( ! split_col ) return -1;
1187 oldedge_geom = split_col->
geoms[0];
1188 newedge_geom = split_col->
geoms[1];
1189
1191 ((
LWGEOM*)newedge_geom)->srid = split_col->
srid;
1192
1193
1198 {
1202 return -1;
1203 }
1207
1208 lwerror(
"Backend coding error: "
1209 "insertNodes callback did not return node_id");
1210 return -1;
1211 }
1212
1213
1216 if ( ret == -1 ) {
1220 return -1;
1221 }
1222
1223
1225 if ( newedges[0].edge_id == -1 ) {
1229 return -1;
1230 }
1232 if ( newedges[1].edge_id == -1 ) {
1236 return -1;
1237 }
1238
1239
1249 else
1252
1253 if ( ! newedges[0].geom ) {
1256 lwerror(
"first geometry in lwgeom_split output is not a line");
1257 return -1;
1258 }
1259
1260
1270 else
1273
1274 if ( ! newedges[1].geom ) {
1277 lwerror(
"second geometry in lwgeom_split output is not a line");
1278 return -1;
1279 }
1280
1281
1283 if ( ret == -1 ) {
1286 return -1;
1287 } else if ( ret == 0 ) {
1290 lwerror(
"Insertion of split edge failed (no reason)");
1291 return -1;
1292 }
1293
1294
1295
1302 NULL, 0);
1303 if ( ret == -1 ) {
1307 return -1;
1308 }
1309
1316 NULL, 0);
1317 if ( ret == -1 ) {
1321 return -1;
1322 }
1323
1330 NULL, 0);
1331 if ( ret == -1 ) {
1335 return -1;
1336 }
1337
1344 NULL, 0);
1345 if ( ret == -1 ) {
1349 return -1;
1350 }
1351
1352
1354 if ( ! ret ) {
1358 return -1;
1359 }
1360
1363
1364
1366}
void lwcollection_release(LWCOLLECTION *lwcollection)
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
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_deleteEdges(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *sel_edge, int sel_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