PostGIS  3.7.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 4863 of file lwgeom_topo.c.

4864 {
4865  LWT_ISO_EDGE *elem;
4866  uint64_t num, i;
4867  int flds = LWT_COL_EDGE_EDGE_ID|LWT_COL_EDGE_GEOM; /* GEOM is not needed */
4868  LWT_ELEMID id = 0;
4869  LWGEOM *qp = lwpoint_as_lwgeom(pt); /* query point */
4870 
4871  if ( lwgeom_is_empty(qp) )
4872  {
4873  lwerror("Empty query point");
4874  return -1;
4875  }
4876  elem = lwt_be_getEdgeWithinDistance2D(topo, pt, tol, &num, flds, 0);
4877  if (num == UINT64_MAX)
4878  {
4879  PGTOPO_BE_ERROR();
4880  return -1;
4881  }
4882  for (i=0; i<num;++i)
4883  {
4884  LWT_ISO_EDGE *e = &(elem[i]);
4885 #if 0
4886  LWGEOM* geom;
4887  double dist;
4888 
4889  if ( ! e->geom )
4890  {
4891  _lwt_release_edges(elem, num);
4892  lwnotice("Corrupted topology: edge %" LWTFMT_ELEMID
4893  " has null geometry", e->edge_id);
4894  continue;
4895  }
4896 
4897  /* Should we check for intersection not being on an endpoint
4898  * as documented ? */
4899  geom = lwline_as_lwgeom(e->geom);
4900  dist = lwgeom_mindistance2d_tolerance(geom, qp, tol);
4901  if ( dist > tol ) continue;
4902 #endif
4903 
4904  if ( id )
4905  {
4906  _lwt_release_edges(elem, num);
4907  lwerror("Two or more edges found");
4908  return -1;
4909  }
4910  else id = e->edge_id;
4911  }
4912 
4913  if ( num ) _lwt_release_edges(elem, num);
4914 
4915  return id;
4916 }
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:339
LWGEOM * lwpoint_as_lwgeom(const LWPOINT *obj)
Definition: lwgeom.c:344
double lwgeom_mindistance2d_tolerance(const LWGEOM *lw1, const LWGEOM *lw2, double tolerance)
Function handling min distance calculations and dwithin calculations.
Definition: measures.c:210
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_EDGE_ID
Edge fields.
#define LWT_COL_EDGE_GEOM
#define PGTOPO_BE_ERROR()
#define LWTFMT_ELEMID
void lwnotice(const char *fmt,...) __attribute__((format(printf
Write a notice out to the notice handler.
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
Definition: lwgeom_topo.c:460
LWT_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, const LWPOINT *pt, double dist, uint64_t *numelems, int fields, int64_t limit)
Definition: lwgeom_topo.c:245
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:199
LWLINE * geom
LWT_ELEMID edge_id

References _lwt_release_edges(), 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_COL_EDGE_EDGE_ID, LWT_COL_EDGE_GEOM, LWTFMT_ELEMID, and PGTOPO_BE_ERROR.

Here is the call graph for this function: