PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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 * 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
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition lwgeom.c:321
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)
LWT_ISO_EDGE * lwt_be_getEdgeWithinDistance2D(LWT_TOPOLOGY *topo, LWPOINT *pt, double dist, uint64_t *numelems, int fields, int64_t limit)
#define LWTFMT_ELEMID
Definition lwgeom_topo.c:43
static void _lwt_release_edges(LWT_ISO_EDGE *edges, int num_edges)
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
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: