PostGIS  3.0.6dev-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 4695 of file lwgeom_topo.c.

4696 {
4697  LWT_ISO_EDGE *elem;
4698  uint64_t num, i;
4699  int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM; /* GEOM is not needed */
4700  LWT_ELEMID id = 0;
4701  LWGEOM *qp = lwpoint_as_lwgeom(pt); /* query point */
4702 
4703  if ( lwgeom_is_empty(qp) )
4704  {
4705  lwerror("Empty query point");
4706  return -1;
4707  }
4708  elem = lwt_be_getEdgeWithinDistance2D(topo, pt, tol, &num, flds, 0);
4709  if (num == UINT64_MAX)
4710  {
4711  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
4712  return -1;
4713  }
4714  for (i=0; i<num;++i)
4715  {
4716  LWT_ISO_EDGE *e = &(elem[i]);
4717 #if 0
4718  LWGEOM* geom;
4719  double dist;
4720 
4721  if ( ! e->geom )
4722  {
4723  _lwt_release_edges(elem, num);
4724  lwnotice("Corrupted topology: edge %" LWTFMT_ELEMID
4725  " has null geometry", e->edge_id);
4726  continue;
4727  }
4728 
4729  /* Should we check for intersection not being on an endpoint
4730  * as documented ? */
4731  geom = lwline_as_lwgeom(e->geom);
4732  dist = lwgeom_mindistance2d_tolerance(geom, qp, tol);
4733  if ( dist > tol ) continue;
4734 #endif
4735 
4736  if ( id )
4737  {
4738  _lwt_release_edges(elem, num);
4739  lwerror("Two or more edges found");
4740  return -1;
4741  }
4742  else id = e->edge_id;
4743  }
4744 
4745  if ( num ) _lwt_release_edges(elem, num);
4746 
4747  return id;
4748 }
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:321
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:326
double lwgeom_mindistance2d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance)
Function handling min distance calculations and dwithin calculations.
Definition: measures.c:207
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
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:119
LWT_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, LWPOINT *pt, double dist, uint64_t *numelems, int fields, int64_t limit)
Definition: lwgeom_topo.c:250
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:43
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
Definition: lwgeom_topo.c:451
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:193
LWLINE * geom
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(), 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.

Here is the call graph for this function: