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

◆ 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.
int gserialized_is_empty(const GSERIALIZED *g)
Check if a GSERIALIZED is empty without deserializing first.
IntervalTreeResult itree_point_in_multipolygon(const IntervalTree *itree, const LWPOINT *point)
IntervalTree * itree_from_lwgeom(const LWGEOM *geom)
@ ITREE_OUTSIDE
#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: