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

◆ ST_DistanceRectTreeCached()

Datum ST_DistanceRectTreeCached ( PG_FUNCTION_ARGS  )

Definition at line 149 of file lwgeom_rectree.c.

150{
151 RectTreeGeomCache *tree_cache = NULL;
152 SHARED_GSERIALIZED *shared_geom1 = ToastCacheGetGeometry(fcinfo, 0);
153 SHARED_GSERIALIZED *shared_geom2 = ToastCacheGetGeometry(fcinfo, 1);
154 const GSERIALIZED *g1 = shared_gserialized_get(shared_geom1);
155 const GSERIALIZED *g2 = shared_gserialized_get(shared_geom2);
156
157 /* Return NULL on empty arguments. */
159 {
160 PG_RETURN_NULL();
161 }
162
163 /* Two points? Get outa here... */
165 {
168 PG_RETURN_FLOAT8(lwgeom_mindistance2d(lwg1, lwg2));
169 }
170
171 /* Fetch/build our cache, if appropriate, etc... */
172 tree_cache = GetRectTreeGeomCache(fcinfo, shared_geom1, shared_geom2);
173
174 if (tree_cache && tree_cache->gcache.argnum)
175 {
176 RECT_NODE *n;
177 RECT_NODE *n_cached = tree_cache->index;
178 if (tree_cache->gcache.argnum == 1)
179 {
181 n = rect_tree_from_lwgeom(lwg2);
182 }
183 else if (tree_cache->gcache.argnum == 2)
184 {
186 n = rect_tree_from_lwgeom(lwg1);
187 }
188 else
189 {
190 elog(ERROR, "reached unreachable block in %s", __func__);
191 }
192 PG_RETURN_FLOAT8(rect_tree_distance_tree(n, n_cached, 0.0));
193 }
194 else
195 {
198 PG_RETURN_FLOAT8(lwgeom_mindistance2d(lwg1, lwg2));
199 }
200
201 PG_RETURN_NULL();
202}
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.
uint32_t gserialized_get_type(const GSERIALIZED *g)
Extract the geometry type from the serialized form (it hides in the anonymous data area,...
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition liblwgeom.h:102
double lwgeom_mindistance2d(const LWGEOM *lw1, const LWGEOM *lw2)
Function initializing min distance calculation.
Definition measures.c:212
static RectTreeGeomCache * GetRectTreeGeomCache(FunctionCallInfo fcinfo, SHARED_GSERIALIZED *g1, SHARED_GSERIALIZED *g2)
RECT_NODE * rect_tree_from_lwgeom(const LWGEOM *lwgeom)
Create a tree index on top an LWGEOM.
Definition lwtree.c:861
double rect_tree_distance_tree(RECT_NODE *n1, RECT_NODE *n2, double threshold)
Return the distance between two RECT_NODE trees.
Definition lwtree.c:1354

References RectTreeGeomCache::gcache, GetRectTreeGeomCache(), gserialized_get_type(), gserialized_is_empty(), RectTreeGeomCache::index, lwgeom_from_gserialized(), lwgeom_mindistance2d(), POINTTYPE, rect_tree_distance_tree(), and rect_tree_from_lwgeom().

Here is the call graph for this function: