Datum earth_get_square(PG_FUNCTION_ARGS) { Point *pt = PG_GETARG_POINT_P(0); double dist = PG_GETARG_FLOAT8(1); BOX *box; if(!( (earth_check_point(pt) == 0) && (earth_check_dist(dist) == 0))) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("attempt to get a box form a dist:%.10f rad for a point:(lat=%.10f, lon=%.10f) out of range",dist,pt->x,pt->y))); box = earth_get_box_internal(pt, dist); PG_RETURN_BOX_P(box); }
static Datum rt_box_union(PG_FUNCTION_ARGS) { BOX *a = PG_GETARG_BOX_P(0); BOX *b = PG_GETARG_BOX_P(1); BOX *n; n = (BOX *) palloc(sizeof(BOX)); n->high.x = Max(a->high.x, b->high.x); n->high.y = Max(a->high.y, b->high.y); n->low.x = Min(a->low.x, b->low.x); n->low.y = Min(a->low.y, b->low.y); PG_RETURN_BOX_P(n); }
Datum earth_point_to_box_s0(PG_FUNCTION_ARGS) { Point *pt = PG_GETARG_POINT_P(0); BOX *box; if(earth_check_point(pt) != 0) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("attempt to get a box form a point out of range"))); box = palloc(sizeof(BOX)); box->low.x = pt->x; box->low.y = pt->y; box->high.x = pt->x; box->high.y = pt->y; PG_RETURN_BOX_P(box); }
static Datum rt_box_inter(PG_FUNCTION_ARGS) { BOX *a = PG_GETARG_BOX_P(0); BOX *b = PG_GETARG_BOX_P(1); BOX *n; n = (BOX *) palloc(sizeof(BOX)); n->high.x = Min(a->high.x, b->high.x); n->high.y = Min(a->high.y, b->high.y); n->low.x = Max(a->low.x, b->low.x); n->low.y = Max(a->low.y, b->low.y); if (n->high.x < n->low.x || n->high.y < n->low.y) { pfree(n); /* Indicate "no intersection" by returning NULL pointer */ n = NULL; } PG_RETURN_BOX_P(n); }