Datum BOX2D_construct(PG_FUNCTION_ARGS) { GSERIALIZED *pgmin = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); GSERIALIZED *pgmax = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1)); GBOX *result; LWPOINT *minpoint, *maxpoint; double min, max, tmp; minpoint = (LWPOINT*)lwgeom_from_gserialized(pgmin); maxpoint = (LWPOINT*)lwgeom_from_gserialized(pgmax); if ( (minpoint->type != POINTTYPE) || (maxpoint->type != POINTTYPE) ) { elog(ERROR, "GBOX_construct: arguments must be points"); PG_RETURN_NULL(); } error_if_srid_mismatch(minpoint->srid, maxpoint->srid); result = gbox_new(gflags(0, 0, 0)); /* Process X min/max */ min = lwpoint_get_x(minpoint); max = lwpoint_get_x(maxpoint); if ( min > max ) { tmp = min; min = max; max = tmp; } result->xmin = min; result->xmax = max; /* Process Y min/max */ min = lwpoint_get_y(minpoint); max = lwpoint_get_y(maxpoint); if ( min > max ) { tmp = min; min = max; max = tmp; } result->ymin = min; result->ymax = max; PG_RETURN_POINTER(result); }
Datum spgist_geom_picksplit(PG_FUNCTION_ARGS) { spgPickSplitIn *in = (spgPickSplitIn *) PG_GETARG_POINTER(0); spgPickSplitOut *out = (spgPickSplitOut *) PG_GETARG_POINTER(1); int i; double x, y; BOX2DF *centroidbox_p; /* Use the average values of x and y as the centroid point */ x = 0; y = 0; for (i = 0; i < in->nTuples; i++) { LWPOINT *apt = (LWPOINT *)lwgeom_from_gserialized((GSERIALIZED *)in->datums[i]); x += lwpoint_get_x(apt); y += lwpoint_get_y(apt); lwpoint_free(apt); } x /= in->nTuples; y /= in->nTuples; centroidbox_p = palloc(sizeof(BOX2DF)); centroidbox_p->xmin = x; centroidbox_p->xmax = x; centroidbox_p->ymin = y; centroidbox_p->ymax = y; out->hasPrefix = true; out->prefixDatum = PointerGetDatum(centroidbox_p); out->nNodes = 4; out->nodeLabels = NULL; /* we don't need node labels */ out->mapTuplesToNodes = palloc(sizeof(int) * in->nTuples); out->leafTupleDatums = palloc(sizeof(Datum) * in->nTuples); for (i = 0; i < in->nTuples; i++) { BOX2DF box; gserialized_datum_get_box2df_p(in->datums[i], &box); int quadrant = getQuadrant(centroidbox_p, &box) - 1; out->leafTupleDatums[i] = PointerGetDatum(in->datums[i]); out->mapTuplesToNodes[i] = quadrant; } PG_RETURN_VOID(); }