PostGIS  3.0.0dev-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 4661 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.

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