PostGIS  2.5.7dev-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 4682 of file lwgeom_topo.c.

4683 {
4684  LWT_ISO_EDGE *elem;
4685  int num, i;
4686  int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM; /* GEOM is not needed */
4687  LWT_ELEMID id = 0;
4688  LWGEOM *qp = lwpoint_as_lwgeom(pt); /* query point */
4689 
4690  if ( lwgeom_is_empty(qp) )
4691  {
4692  lwerror("Empty query point");
4693  return -1;
4694  }
4695  elem = lwt_be_getEdgeWithinDistance2D(topo, pt, tol, &num, flds, 0);
4696  if ( num == -1 )
4697  {
4698  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
4699  return -1;
4700  }
4701  for (i=0; i<num;++i)
4702  {
4703  LWT_ISO_EDGE *e = &(elem[i]);
4704 #if 0
4705  LWGEOM* geom;
4706  double dist;
4707 
4708  if ( ! e->geom )
4709  {
4710  _lwt_release_edges(elem, num);
4711  lwnotice("Corrupted topology: edge %" LWTFMT_ELEMID
4712  " has null geometry", e->edge_id);
4713  continue;
4714  }
4715 
4716  /* Should we check for intersection not being on an endpoint
4717  * as documented ? */
4718  geom = lwline_as_lwgeom(e->geom);
4719  dist = lwgeom_mindistance2d_tolerance(geom, qp, tol);
4720  if ( dist > tol ) continue;
4721 #endif
4722 
4723  if ( id )
4724  {
4725  _lwt_release_edges(elem, num);
4726  lwerror("Two or more edges found");
4727  return -1;
4728  }
4729  else id = e->edge_id;
4730  }
4731 
4732  if ( num ) _lwt_release_edges(elem, num);
4733 
4734  return id;
4735 }
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:330
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:335
double lwgeom_mindistance2d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance)
Function handling min distance calculations and dwithin calculations.
Definition: measures.c:213
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
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:120
LWT_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, LWPOINT *pt, double dist, int *numelems, int fields, int limit)
Definition: lwgeom_topo.c:260
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:44
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
Definition: lwgeom_topo.c:457
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: