PostGIS  2.1.10dev-r@@SVN_REVISION@@
GSERIALIZED* gserialized_from_lwgeom ( LWGEOM geom,
int  is_geodetic,
size_t *  size 
)

Allocate a new GSERIALIZED from an LWGEOM.

For all non-point types, a bounding box will be calculated and embedded in the serialization. The geodetic flag is used to control the box calculation (cartesian or geocentric). If set, the size pointer will contain the size of the final output, which is useful for setting the PgSQL VARSIZE information.

Definition at line 908 of file g_serialized.c.

References LWGEOM::bbox, GSERIALIZED::flags, LWGEOM::flags, FLAGS_SET_BBOX, gserialized_from_gbox(), gserialized_from_lwgeom_any(), gserialized_from_lwgeom_size(), gserialized_set_srid(), lwalloc(), lwerror(), lwgeom_add_bbox(), lwgeom_is_empty(), lwgeom_needs_bbox(), GSERIALIZED::size, and LWGEOM::srid.

Referenced by geography_point_outside(), LWGEOM_dumppoints(), lwgeom_over_gserialized(), polyhedralsurface_parse(), RASTER_convex_hull(), RASTER_dumpAsPolygons(), RASTER_getPixelPolygons(), ST_OffsetCurve(), test_gserialized_from_lwgeom(), test_gserialized_is_empty(), test_lwgeom_from_gserialized(), test_on_gser_lwgeom_count_vertices(), tin_parse(), and triangle_parse().

909 {
910  size_t expected_size = 0;
911  size_t return_size = 0;
912  uint8_t *serialized = NULL;
913  uint8_t *ptr = NULL;
914  GSERIALIZED *g = NULL;
915  assert(geom);
916 
917  /*
918  ** See if we need a bounding box, add one if we don't have one.
919  */
920  if ( (! geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)) )
921  {
922  lwgeom_add_bbox(geom);
923  }
924 
925  /*
926  ** Harmonize the flags to the state of the lwgeom
927  */
928  if ( geom->bbox )
929  FLAGS_SET_BBOX(geom->flags, 1);
930 
931  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
932  expected_size = gserialized_from_lwgeom_size(geom);
933  serialized = lwalloc(expected_size);
934  ptr = serialized;
935 
936  /* Move past size, srid and flags. */
937  ptr += 8;
938 
939  /* Write in the serialized form of the gbox, if necessary. */
940  if ( geom->bbox )
941  ptr += gserialized_from_gbox(geom->bbox, ptr);
942 
943  /* Write in the serialized form of the geometry. */
944  ptr += gserialized_from_lwgeom_any(geom, ptr);
945 
946  /* Calculate size as returned by data processing functions. */
947  return_size = ptr - serialized;
948 
949  if ( expected_size != return_size ) /* Uh oh! */
950  {
951  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
952  return NULL;
953  }
954 
955  if ( size ) /* Return the output size to the caller if necessary. */
956  *size = return_size;
957 
958  g = (GSERIALIZED*)serialized;
959 
960  /*
961  ** We are aping PgSQL code here, PostGIS code should use
962  ** VARSIZE to set this for real.
963  */
964  g->size = return_size << 2;
965 
966  /* Set the SRID! */
967  gserialized_set_srid(g, geom->srid);
968 
969  g->flags = geom->flags;
970 
971  return g;
972 }
GBOX * bbox
Definition: liblwgeom.h:354
uint8_t flags
Definition: liblwgeom.h:353
static size_t gserialized_from_gbox(const GBOX *gbox, uint8_t *buf)
Definition: g_serialized.c:840
void gserialized_set_srid(GSERIALIZED *s, int32_t srid)
Write the SRID into the serialized form (it is packed into three bytes so this is a handy function)...
Definition: g_serialized.c:87
int32_t srid
Definition: liblwgeom.h:355
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:67
#define FLAGS_SET_BBOX(flags, value)
Definition: liblwgeom.h:114
size_t gserialized_from_lwgeom_size(const LWGEOM *geom)
Calculate required memory segment to contain a serialized form of the LWGEOM.
Definition: g_serialized.c:541
uint32_t size
Definition: liblwgeom.h:337
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:555
static size_t gserialized_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
Definition: g_serialized.c:800
void * lwalloc(size_t size)
Definition: lwutil.c:175
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1229
int lwgeom_needs_bbox(const LWGEOM *geom)
Check whether or not a lwgeom is big enough to warrant a bounding box.
Definition: lwgeom.c:1059
uint8_t flags
Definition: liblwgeom.h:339

Here is the call graph for this function:

Here is the caller graph for this function: