PostGIS  2.5.1dev-r@@SVN_REVISION@@

◆ _lwt_GetEqualEdge()

static LWT_ELEMID _lwt_GetEqualEdge ( LWT_TOPOLOGY topo,
LWLINE edge 
)
static

Definition at line 5209 of file lwgeom_topo.c.

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().

5210 {
5211  LWT_ELEMID id;
5212  LWT_ISO_EDGE *edges;
5213  int num, i;
5214  const GBOX *qbox = lwgeom_get_bbox( lwline_as_lwgeom(edge) );
5215  GEOSGeometry *edgeg;
5216  const int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM;
5217 
5218  edges = lwt_be_getEdgeWithinBox2D( topo, qbox, &num, flds, 0 );
5219  if ( num == -1 )
5220  {
5221  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
5222  return -1;
5223  }
5224  if ( num )
5225  {
5226  initGEOS(lwnotice, lwgeom_geos_error);
5227 
5228  edgeg = LWGEOM2GEOS( lwline_as_lwgeom(edge), 0 );
5229  if ( ! edgeg )
5230  {
5231  _lwt_release_edges(edges, num);
5232  lwerror("Could not convert edge geometry to GEOS: %s", lwgeom_geos_errmsg);
5233  return -1;
5234  }
5235  for (i=0; i<num; ++i)
5236  {
5237  LWT_ISO_EDGE *e = &(edges[i]);
5238  LWGEOM *g = lwline_as_lwgeom(e->geom);
5239  GEOSGeometry *gg;
5240  int equals;
5241  gg = LWGEOM2GEOS( g, 0 );
5242  if ( ! gg )
5243  {
5244  GEOSGeom_destroy(edgeg);
5245  _lwt_release_edges(edges, num);
5246  lwerror("Could not convert edge geometry to GEOS: %s", lwgeom_geos_errmsg);
5247  return -1;
5248  }
5249  equals = GEOSEquals(gg, edgeg);
5250  GEOSGeom_destroy(gg);
5251  if ( equals == 2 )
5252  {
5253  GEOSGeom_destroy(edgeg);
5254  _lwt_release_edges(edges, num);
5255  lwerror("GEOSEquals exception: %s", lwgeom_geos_errmsg);
5256  return -1;
5257  }
5258  if ( equals )
5259  {
5260  id = e->edge_id;
5261  GEOSGeom_destroy(edgeg);
5262  _lwt_release_edges(edges, num);
5263  return id;
5264  }
5265  }
5266  GEOSGeom_destroy(edgeg);
5267  _lwt_release_edges(edges, num);
5268  }
5269 
5270  return 0;
5271 }
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:177
char lwgeom_geos_errmsg[LWGEOM_GEOS_ERRMSG_MAXSIZE]
LWLINE * geom
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:330
void lwgeom_geos_error(const char *fmt,...)
const LWT_BE_IFACE * be_iface
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:734
LWT_ELEMID edge_id
GEOSGeometry * LWGEOM2GEOS(const LWGEOM *lwgeom, uint8_t autofix)
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
Definition: lwgeom_topo.c:457
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_GEOM
static LWT_ISO_EDGE * lwt_be_getEdgeWithinBox2D(const LWT_TOPOLOGY *topo, const GBOX *box, int *numelems, int fields, int limit)
Definition: lwgeom_topo.c:179
uint32_t e
Definition: geobuf.h:57
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:120
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
Here is the call graph for this function:
Here is the caller graph for this function: