PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ gserialized_from_lwgeom()

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 906 of file g_serialized.c.

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

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

907 {
908  size_t expected_size = 0;
909  size_t return_size = 0;
910  uint8_t *serialized = NULL;
911  uint8_t *ptr = NULL;
912  GSERIALIZED *g = NULL;
913  assert(geom);
914 
915  /*
916  ** See if we need a bounding box, add one if we don't have one.
917  */
918  if ( (! geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)) )
919  {
920  lwgeom_add_bbox(geom);
921  }
922 
923  /*
924  ** Harmonize the flags to the state of the lwgeom
925  */
926  if ( geom->bbox )
927  FLAGS_SET_BBOX(geom->flags, 1);
928 
929  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
930  expected_size = gserialized_from_lwgeom_size(geom);
931  serialized = lwalloc(expected_size);
932  ptr = serialized;
933 
934  /* Move past size, srid and flags. */
935  ptr += 8;
936 
937  /* Write in the serialized form of the gbox, if necessary. */
938  if ( geom->bbox )
939  ptr += gserialized_from_gbox(geom->bbox, ptr);
940 
941  /* Write in the serialized form of the geometry. */
942  ptr += gserialized_from_lwgeom_any(geom, ptr);
943 
944  /* Calculate size as returned by data processing functions. */
945  return_size = ptr - serialized;
946 
947  if ( expected_size != return_size ) /* Uh oh! */
948  {
949  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
950  return NULL;
951  }
952 
953  if ( size ) /* Return the output size to the caller if necessary. */
954  *size = return_size;
955 
956  g = (GSERIALIZED*)serialized;
957 
958  /*
959  ** We are aping PgSQL code here, PostGIS code should use
960  ** VARSIZE to set this for real.
961  */
962  g->size = return_size << 2;
963 
964  /* Set the SRID! */
965  gserialized_set_srid(g, geom->srid);
966 
967  g->flags = geom->flags;
968 
969  return g;
970 }
GBOX * bbox
Definition: liblwgeom.h:382
uint8_t flags
Definition: liblwgeom.h:381
static size_t gserialized_from_gbox(const GBOX *gbox, uint8_t *buf)
Definition: g_serialized.c:838
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:86
int32_t srid
Definition: liblwgeom.h:383
#define FLAGS_SET_BBOX(flags, value)
Definition: liblwgeom.h:132
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:539
uint32_t size
Definition: liblwgeom.h:365
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:599
static size_t gserialized_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
Definition: g_serialized.c:798
void * lwalloc(size_t size)
Definition: lwutil.c:199
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:1297
int lwgeom_needs_bbox(const LWGEOM *geom)
Check whether or not a lwgeom is big enough to warrant a bounding box.
Definition: lwgeom.c:1103
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74
uint8_t flags
Definition: liblwgeom.h:367
Here is the call graph for this function:
Here is the caller graph for this function: