PostGIS  2.2.8dev-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 4794 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.

4795 {
4796  LWT_ISO_EDGE *elem;
4797  int num, i;
4798  int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM; /* GEOM is not needed */
4799  LWT_ELEMID id = 0;
4800  LWGEOM *qp = lwpoint_as_lwgeom(pt); /* query point */
4801 
4802  if ( lwgeom_is_empty(qp) )
4803  {
4804  lwerror("Empty query point");
4805  return -1;
4806  }
4807  elem = lwt_be_getEdgeWithinDistance2D(topo, pt, tol, &num, flds, 0);
4808  if ( num == -1 )
4809  {
4810  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
4811  return -1;
4812  }
4813  for (i=0; i<num;++i)
4814  {
4815  LWT_ISO_EDGE *e = &(elem[i]);
4816 #if 0
4817  LWGEOM* geom;
4818  double dist;
4819 
4820  if ( ! e->geom )
4821  {
4822  _lwt_release_edges(elem, num);
4823  lwnotice("Corrupted topology: edge %" LWTFMT_ELEMID
4824  " has null geometry", e->edge_id);
4825  continue;
4826  }
4827 
4828  /* Should we check for intersection not being on an endpoint
4829  * as documented ? */
4830  geom = lwline_as_lwgeom(e->geom);
4831  dist = lwgeom_mindistance2d_tolerance(geom, qp, tol);
4832  if ( dist > tol ) continue;
4833 #endif
4834 
4835  if ( id )
4836  {
4837  _lwt_release_edges(elem, num);
4838  lwerror("Two or more edges found");
4839  return -1;
4840  }
4841  else id = e->edge_id;
4842  }
4843 
4844  if ( num ) _lwt_release_edges(elem, num);
4845 
4846  return id;
4847 }
void lwnotice(const char *fmt,...)
Write a notice out to the notice handler.
Definition: lwutil.c:61
double lwgeom_mindistance2d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance)
Function handling min distance calculations and dwithin calculations.
Definition: measures.c:199
LWLINE * geom
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:249
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:471
LWT_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, LWPOINT *pt, double dist, int *numelems, int fields, int limit)
Definition: lwgeom_topo.c:264
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:254
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:1297
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:124
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74
#define LWTFMT_ELEMID
Definition: lwgeom_topo.c:36
Here is the call graph for this function: