return lwgeom_to_wkt(lwgeom_from_gserialized(g), WKT_ISO, 12, 0);
}
-int gserialized_get_gbox_p(const GSERIALIZED *g, GBOX *gbox)
+int gserialized_read_gbox_p(const GSERIALIZED *g, GBOX *gbox)
{
/* Null input! */
/* Initialize the flags on the box */
gbox->flags = g->flags;
+ /* Has pre-calculated box */
if ( FLAGS_GET_BBOX(g->flags) )
{
int i = 0;
}
return LW_SUCCESS;
}
- else
+
+ /* No pre-calculated box, but for cartesian entries we can do some magic */
+ if ( ! FLAGS_GET_GEODETIC(g->flags) )
{
- return LW_FAILURE;
+ uint32_t type = gserialized_get_type(g);
+ /* Boxes of points are easy peasy */
+ if ( type == POINTTYPE )
+ {
+ int i = 1; /* Start past <pointtype><padding> */
+ double *dptr = (double*)(g->data);
+ gbox->xmin = gbox->xmax = dptr[i++];
+ gbox->ymin = gbox->ymax = dptr[i++];
+ if ( FLAGS_GET_Z(g->flags) )
+ {
+ gbox->zmin = gbox->zmax = dptr[i++];
+ }
+ if ( FLAGS_GET_M(g->flags) )
+ {
+ gbox->mmin = gbox->mmax = dptr[i++];
+ }
+ return LW_SUCCESS;
+ }
+ /* We can calculate the box of a two-point cartesian line trivially */
+ else if ( type == LINETYPE )
+ {
+ int ndims = FLAGS_NDIMS(g->flags);
+ int i = 0; /* Start past <linetype><npoints> */
+ double *dptr = (double*)(g->data);
+ int *iptr = (int*)(g->data);
+ int npoints = iptr[1]; /* Read the npoints */
+
+ /* This only works with 2-point lines */
+ if ( npoints != 2 )
+ return LW_FAILURE;
+
+ /* Advance to X */
+ i++;
+ gbox->xmin = FP_MIN(dptr[i], dptr[i+ndims]);
+ gbox->xmax = FP_MAX(dptr[i], dptr[i+ndims]);
+
+ /* Advance to Y */
+ i++;
+ gbox->ymin = FP_MIN(dptr[i], dptr[i+ndims]);
+ gbox->ymax = FP_MAX(dptr[i], dptr[i+ndims]);
+
+ if ( FLAGS_GET_Z(g->flags) )
+ {
+ /* Advance to Z */
+ i++;
+ gbox->zmin = FP_MIN(dptr[i], dptr[i+ndims]);
+ gbox->zmax = FP_MAX(dptr[i], dptr[i+ndims]);
+ }
+ if ( FLAGS_GET_M(g->flags) )
+ {
+ /* Advance to M */
+ i++;
+ gbox->zmin = FP_MIN(dptr[i], dptr[i+ndims]);
+ gbox->zmax = FP_MAX(dptr[i], dptr[i+ndims]);
+ }
+ return LW_SUCCESS;
+ }
+ /* We could also do single-entry multi-points */
+ else if ( type == MULTIPOINTTYPE )
+ {
+ /* TODO: Make this actually happen */
+ return LW_FAILURE;
+ }
}
+ return LW_FAILURE;
}
lwgeom->type = g_type;
lwgeom->flags = g_flags;
- if ( gserialized_get_gbox_p(g, &bbox) == LW_SUCCESS )
+ if ( gserialized_read_gbox_p(g, &bbox) == LW_SUCCESS )
{
lwgeom->bbox = gbox_copy(&bbox);
}
* Pull a #GBOX from the header of a #GSERIALIZED, if one is available. If
* it is not, return LW_FAILURE.
*/
-extern int gserialized_get_gbox_p(const GSERIALIZED *g, GBOX *gbox);
+extern int gserialized_read_gbox_p(const GSERIALIZED *g, GBOX *gbox);
/**
return g;
}
-int pglwgeom_getbox2d_p(const GSERIALIZED *geom, GBOX *box)
+int gserialized_get_gbox_p(const GSERIALIZED *geom, GBOX *box)
{
LWGEOM *lwgeom;
- int ret = gserialized_get_gbox_p(geom, box);
+ int ret = gserialized_read_gbox_p(geom, box);
if ( LW_FAILURE == ret ) {
/* See http://trac.osgeo.org/postgis/ticket/1023 */
lwgeom = lwgeom_from_gserialized(geom);
ret = lwgeom_calculate_gbox(lwgeom, box);
- lwgeom_free(lwgeom);
+ lwgeom_free(lwgeom);
}
return ret;
}
* Use a cached bbox if available, compute it otherwise.
* Return LW_FALSE if the geometry has no bounding box (ie: is empty).
*/
-extern int pglwgeom_getbox2d_p(const GSERIALIZED *geom, GBOX *box);
+extern int gserialized_get_gbox_p(const GSERIALIZED *geom, GBOX *box);
/**
* Convert cstrings (null-terminated byte array) to textp pointers
g = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
/* We need the bounding box to get an outside point for area algorithm */
- if ( gserialized_get_gbox_p(g, &gbox) == LW_FAILURE )
+ if ( gserialized_read_gbox_p(g, &gbox) == LW_FAILURE )
{
LWGEOM *lwgeom = lwgeom_from_gserialized(g);
POSTGIS_DEBUGF(4,"unable to read gbox from gserialized, calculating from lwgeom (%p)", lwgeom);
{
lwgeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
/* empty geom would make getbox2d_p return NULL */
- if ( ! pglwgeom_getbox2d_p(lwgeom, &box) ) PG_RETURN_NULL();
+ if ( ! gserialized_get_gbox_p(lwgeom, &box) ) PG_RETURN_NULL();
memcpy(result, &box, sizeof(GBOX));
PG_RETURN_POINTER(result);
}
/*combine_bbox(BOX3D, geometry) => union(BOX3D, geometry->bvol) */
lwgeom = (GSERIALIZED *)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
- if ( ! pglwgeom_getbox2d_p(lwgeom, &box) )
+ if ( ! gserialized_get_gbox_p(lwgeom, &box) )
{
/* must be the empty geom */
memcpy(result, (char *)PG_GETARG_DATUM(0), sizeof(GBOX));
POSTGIS_DEBUG(3, "lwgeom_lt passed getSRID test");
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_NULL();
}
- pglwgeom_getbox2d_p(geom1, &box1);
- pglwgeom_getbox2d_p(geom2, &box2);
+ gserialized_get_gbox_p(geom1, &box1);
+ gserialized_get_gbox_p(geom2, &box2);
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
}
/*bbox check */
- pglwgeom_getbox2d_p(pg_geom1, &g1_bvol );
+ gserialized_get_gbox_p(pg_geom1, &g1_bvol );
g1_bvol.xmin = g1_bvol.xmin - dist;
g1_bvol.ymin = g1_bvol.ymin - dist;
}
/* Copy input bbox if any */
- if ( pglwgeom_getbox2d_p(geom1, &bbox) )
+ if ( gserialized_get_gbox_p(geom1, &bbox) )
{
/* Force the box to have the same dimensionality as the lwgeom */
bbox.flags = lwout->flags;
#if POSTGIS_GEOS_VERSION < 33
/* Short circuit and return FALSE if we have infinite coordinates */
/* GEOS 3.3+ is supposed to handle this stuff OK */
- if ( pglwgeom_getbox2d_p(geom1, &box1) )
+ if ( gserialized_get_gbox_p(geom1, &box1) )
{
if ( isinf(box1.xmax) || isinf(box1.ymax) || isinf(box1.xmin) || isinf(box1.ymin) ||
isnan(box1.xmax) || isnan(box1.ymax) || isnan(box1.xmin) || isnan(box1.ymin) )
#if POSTGIS_GEOS_VERSION < 33
/* Short circuit and return if we have infinite coordinates */
/* GEOS 3.3+ is supposed to handle this stuff OK */
- if ( pglwgeom_getbox2d_p(geom, &box) )
+ if ( gserialized_get_gbox_p(geom, &box) )
{
if ( isinf(box.xmax) || isinf(box.ymax) || isinf(box.xmin) || isinf(box.ymin) ||
isnan(box.xmax) || isnan(box.ymax) || isnan(box.xmin) || isnan(box.ymin) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( box2.xmax < box1.xmin ) PG_RETURN_BOOL(FALSE);
if ( box2.xmin > box1.xmax ) PG_RETURN_BOOL(FALSE);
** geom1 bounding box we can prematurely return FALSE.
** Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box2.xmin < box1.xmin ) || ( box2.xmax > box1.xmax ) ||
( box2.ymin < box1.ymin ) || ( box2.ymax > box1.ymax ) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if (( box2.xmin < box1.xmin ) || ( box2.xmax > box1.xmax ) ||
( box2.ymin < box1.ymin ) || ( box2.ymax > box1.ymax ))
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if (( box2.xmin < box1.xmin ) || ( box2.xmax > box1.xmax ) ||
( box2.ymin < box1.ymin ) || ( box2.ymax > box1.ymax ))
* geom2 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box1.xmin < box2.xmin ) || ( box1.xmax > box2.xmax ) ||
( box1.ymin < box2.ymin ) || ( box1.ymax > box2.ymax ) )
* geom2 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box1.xmin < box2.xmin ) || ( box1.xmax > box2.xmax ) ||
( box1.ymin < box2.ymin ) || ( box1.ymax > box2.ymax ) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box2.xmax < box1.xmin ) || ( box2.xmin > box1.xmax ) ||
( box2.ymax < box1.ymin ) || ( box2.ymin > box2.ymax ) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box2.xmax < box1.xmin ) || ( box2.xmin > box1.xmax ) ||
( box2.ymax < box1.ymin ) || ( box2.ymin > box1.ymax ) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box2.xmax < box1.xmin ) || ( box2.xmin > box1.xmax ) ||
( box2.ymax < box1.ymin ) || ( box2.ymin > box1.ymax ) )
* geom1 bounding box we can prematurely return TRUE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( ( box2.xmax < box1.xmin ) || ( box2.xmin > box1.xmax ) ||
( box2.ymax < box1.ymin ) || ( box2.ymin > box1.ymax ) )
* geom1 bounding box we can prematurely return FALSE.
* Do the test IFF BOUNDING BOX AVAILABLE.
*/
- if ( pglwgeom_getbox2d_p(geom1, &box1) &&
- pglwgeom_getbox2d_p(geom2, &box2) )
+ if ( gserialized_get_gbox_p(geom1, &box1) &&
+ gserialized_get_gbox_p(geom2, &box2) )
{
if ( box2.xmax != box1.xmax ) PG_RETURN_BOOL(FALSE);
if ( box2.xmin != box1.xmin ) PG_RETURN_BOOL(FALSE);
PG_RETURN_NULL();
}
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
PG_RETURN_NULL();
}
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
error_if_srid_mismatch(gserialized_get_srid(lwgeom1), gserialized_get_srid(lwgeom2));
- if ( ! (pglwgeom_getbox2d_p(lwgeom1, &box1) && pglwgeom_getbox2d_p(lwgeom2, &box2)) )
+ if ( ! (gserialized_get_gbox_p(lwgeom1, &box1) && gserialized_get_gbox_p(lwgeom2, &box2)) )
{
PG_FREE_IF_COPY(lwgeom1, 0);
PG_FREE_IF_COPY(lwgeom2, 1);
rr = (GBOX*) palloc(sizeof(GBOX));
- if ( ! pglwgeom_getbox2d_p(in, rr) ||
+ if ( ! gserialized_get_gbox_p(in, rr) ||
! finite(rr->xmin) ||
! finite(rr->ymin) ||
! finite(rr->xmax) ||
*/
if ( gserialized_has_bbox(query) )
{
- pglwgeom_getbox2d_p(query, &box);
+ gserialized_get_gbox_p(query, &box);
}
else
{
query = (GSERIALIZED*)PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
- if ( ! pglwgeom_getbox2d_p(query, &box) )
+ if ( ! gserialized_get_gbox_p(query, &box) )
{
PG_FREE_IF_COPY(query, 1);
PG_RETURN_BOOL(FALSE);