PostGIS  2.5.0beta2dev-r@@SVN_REVISION@@

◆ lwt_GetEdgeByPoint()

LWT_ELEMID lwt_GetEdgeByPoint ( LWT_TOPOLOGY topo,
LWPOINT pt,
double  tol 
)

Find the edge-id of an edge that intersects a given point.

Parameters
topothe topology to operate on
pointthe point to use for query
tolmax distance around the given point to look for an intersecting edge
Returns
an edge identifier if one is found, 0 if none is found, -1 on error (multiple edges within distance). The liblwgeom error handler will be invoked in case of error.

Definition at line 4662 of file lwgeom_topo.c.

References _lwt_release_edges(), LWT_TOPOLOGY_T::be_iface, LWT_ISO_EDGE::edge_id, LWT_ISO_EDGE::geom, lwerror(), lwgeom_is_empty(), lwgeom_mindistance2d_tolerance(), lwline_as_lwgeom(), lwnotice(), lwpoint_as_lwgeom(), lwt_be_getEdgeWithinDistance2D(), lwt_be_lastErrorMessage(), LWT_COL_EDGE_EDGE_ID, LWT_COL_EDGE_GEOM, and LWTFMT_ELEMID.

4663 {
4664  LWT_ISO_EDGE *elem;
4665  int num, i;
4666  int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM; /* GEOM is not needed */
4667  LWT_ELEMID id = 0;
4668  LWGEOM *qp = lwpoint_as_lwgeom(pt); /* query point */
4669 
4670  if ( lwgeom_is_empty(qp) )
4671  {
4672  lwerror("Empty query point");
4673  return -1;
4674  }
4675  elem = lwt_be_getEdgeWithinDistance2D(topo, pt, tol, &num, flds, 0);
4676  if ( num == -1 )
4677  {
4678  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
4679  return -1;
4680  }
4681  for (i=0; i<num;++i)
4682  {
4683  LWT_ISO_EDGE *e = &(elem[i]);
4684 #if 0
4685  LWGEOM* geom;
4686  double dist;
4687 
4688  if ( ! e->geom )
4689  {
4690  _lwt_release_edges(elem, num);
4691  lwnotice("Corrupted topology: edge %" LWTFMT_ELEMID
4692  " has null geometry", e->edge_id);
4693  continue;
4694  }
4695 
4696  /* Should we check for intersection not being on an endpoint
4697  * as documented ? */
4698  geom = lwline_as_lwgeom(e->geom);
4699  dist = lwgeom_mindistance2d_tolerance(geom, qp, tol);
4700  if ( dist > tol ) continue;
4701 #endif
4702 
4703  if ( id )
4704  {
4705  _lwt_release_edges(elem, num);
4706  lwerror("Two or more edges found");
4707  return -1;
4708  }
4709  else id = e->edge_id;
4710  }
4711 
4712  if ( num ) _lwt_release_edges(elem, num);
4713 
4714  return id;
4715 }
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:177
double lwgeom_mindistance2d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance)
Function handling min distance calculations and dwithin calculations.
Definition: measures.c:213
LWLINE * geom
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:330
const LWT_BE_IFACE * be_iface
LWT_ELEMID edge_id
#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_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, LWPOINT *pt, double dist, int *numelems, int fields, int limit)
Definition: lwgeom_topo.c:260
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:335
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_GEOM
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1393
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
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:44
Here is the call graph for this function: