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

◆ _lwt_GetEqualEdge()

static LWT_ELEMID _lwt_GetEqualEdge ( LWT_TOPOLOGY topo,
LWLINE edge 
)
static

Definition at line 5243 of file lwgeom_topo.c.

5244{
5245 LWT_ELEMID id;
5246 LWT_ISO_EDGE *edges;
5247 uint64_t num, i;
5248 const GBOX *qbox = lwgeom_get_bbox( lwline_as_lwgeom(edge) );
5249 GEOSGeometry *edgeg;
5250 const int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM;
5251
5252 edges = lwt_be_getEdgeWithinBox2D( topo, qbox, &num, flds, 0 );
5253 if (num == UINT64_MAX)
5254 {
5255 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
5256 return -1;
5257 }
5258 if ( num )
5259 {
5260 initGEOS(lwnotice, lwgeom_geos_error);
5261
5262 edgeg = LWGEOM2GEOS( lwline_as_lwgeom(edge), 0 );
5263 if ( ! edgeg )
5264 {
5265 _lwt_release_edges(edges, num);
5266 lwerror("Could not convert edge geometry to GEOS: %s", lwgeom_geos_errmsg);
5267 return -1;
5268 }
5269 for (i=0; i<num; ++i)
5270 {
5271 LWT_ISO_EDGE *e = &(edges[i]);
5272 LWGEOM *g = lwline_as_lwgeom(e->geom);
5273 GEOSGeometry *gg;
5274 int equals;
5275 gg = LWGEOM2GEOS( g, 0 );
5276 if ( ! gg )
5277 {
5278 GEOSGeom_destroy(edgeg);
5279 _lwt_release_edges(edges, num);
5280 lwerror("Could not convert edge geometry to GEOS: %s", lwgeom_geos_errmsg);
5281 return -1;
5282 }
5283 equals = GEOSEquals(gg, edgeg);
5284 GEOSGeom_destroy(gg);
5285 if ( equals == 2 )
5286 {
5287 GEOSGeom_destroy(edgeg);
5288 _lwt_release_edges(edges, num);
5289 lwerror("GEOSEquals exception: %s", lwgeom_geos_errmsg);
5290 return -1;
5291 }
5292 if ( equals )
5293 {
5294 id = e->edge_id;
5295 GEOSGeom_destroy(edgeg);
5296 _lwt_release_edges(edges, num);
5297 return id;
5298 }
5299 }
5300 GEOSGeom_destroy(edgeg);
5301 _lwt_release_edges(edges, num);
5302 }
5303
5304 return 0;
5305}
char lwgeom_geos_errmsg[LWGEOM_GEOS_ERRMSG_MAXSIZE]
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
void lwgeom_geos_error(const char *fmt,...)
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:321
const GBOX * lwgeom_get_bbox(const LWGEOM *lwgeom)
Get a non-empty geometry bounding box, computing and caching it if not already there.
Definition lwgeom.c:725
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
#define LWT_COL_EDGE_GEOM
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition lwutil.c:177
static LWT_ISO_EDGE * lwt_be_getEdgeWithinBox2D(const LWT_TOPOLOGY *topo, const GBOX *box, uint64_t *numelems, int fields, uint64_t limit)
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
LWT_ELEMID edge_id
const LWT_BE_IFACE * be_iface

References _lwt_release_edges(), LWT_TOPOLOGY_T::be_iface, LWT_ISO_EDGE::edge_id, LWT_ISO_EDGE::geom, lwerror(), LWGEOM2GEOS(), lwgeom_geos_errmsg, lwgeom_geos_error(), lwgeom_get_bbox(), lwline_as_lwgeom(), lwnotice(), lwt_be_getEdgeWithinBox2D(), lwt_be_lastErrorMessage(), LWT_COL_EDGE_EDGE_ID, and LWT_COL_EDGE_GEOM.

Referenced by _lwt_AddLineEdge().

Here is the call graph for this function:
Here is the caller graph for this function: