示例#1
0
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);
}
示例#2
0
文件: spgist.c 项目: ahinz/postgis
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();
}