PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ ST_IntersectsIntervalTree()

Datum ST_IntersectsIntervalTree ( PG_FUNCTION_ARGS  )

Definition at line 251 of file lwgeom_itree.c.

252 {
253  GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0);
254  GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1);
255  LWGEOM *lwg1, *lwg2;
256  LWPOINT *lwpt;
257  IntervalTree *itree = NULL;
258  bool isPoly1, isPoly2, isPt1, isPt2;
259 
260  /* Return false on empty arguments. */
262  {
263  PG_FREE_IF_COPY(g1, 0);
264  PG_FREE_IF_COPY(g2, 1);
265  PG_RETURN_BOOL(false);
266  }
267 
268  lwg1 = lwgeom_from_gserialized(g1);
269  lwg2 = lwgeom_from_gserialized(g2);
270 
271  isPoly1 = lwg1->type == POLYGONTYPE || lwg1->type == MULTIPOLYGONTYPE;
272  isPoly2 = lwg2->type == POLYGONTYPE || lwg2->type == MULTIPOLYGONTYPE;
273  isPt1 = lwg1->type == POINTTYPE;
274  isPt2 = lwg2->type == POINTTYPE;
275 
276  /* Two points? Get outa here... */
277  if (isPoly1 && isPt2)
278  {
279  itree = itree_from_lwgeom(lwg1);
280  lwpt = lwgeom_as_lwpoint(lwg2);
281  }
282  else if (isPoly2 && isPt1)
283  {
284  itree = itree_from_lwgeom(lwg2);
285  lwpt = lwgeom_as_lwpoint(lwg1);
286  }
287 
288  if (!itree)
289  elog(ERROR, "arguments to %s must a point and a polygon", __func__);
290 
291  PG_RETURN_BOOL(itree_point_in_multipolygon(itree, lwpt) != ITREE_OUTSIDE);
292 }
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
Definition: gserialized.c:268
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
Definition: gserialized.c:181
IntervalTree * itree_from_lwgeom(const LWGEOM *geom)
Definition: intervaltree.c:310
IntervalTreeResult itree_point_in_multipolygon(const IntervalTree *itree, const LWPOINT *point)
Definition: intervaltree.c:461
@ ITREE_OUTSIDE
Definition: intervaltree.h:35
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:102
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:107
#define POLYGONTYPE
Definition: liblwgeom.h:104
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
Definition: lwinline.h:127
uint8_t type
Definition: liblwgeom.h:462

References gserialized_is_empty(), itree_from_lwgeom(), ITREE_OUTSIDE, itree_point_in_multipolygon(), lwgeom_as_lwpoint(), lwgeom_from_gserialized(), MULTIPOLYGONTYPE, POINTTYPE, POLYGONTYPE, and LWGEOM::type.

Here is the call graph for this function: