PostGIS  2.3.7dev-r@@SVN_REVISION@@
GSERIALIZED* gserialized_from_lwgeom ( LWGEOM geom,
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 933 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 cluster_within_distance_garray(), geography_point_outside(), LWGEOM_dumppoints(), lwgeom_over_gserialized(), polyhedralsurface_parse(), RASTER_convex_hull(), RASTER_dumpAsPolygons(), RASTER_envelope(), RASTER_getPixelPolygons(), ST_GeneratePoints(), ST_OffsetCurve(), test_gbox_same_2d(), test_gserialized_from_lwgeom(), test_gserialized_is_empty(), test_gserialized_peek_gbox_p_gets_correct_box(), test_gserialized_peek_gbox_p_no_box_when_empty(), test_lwgeom_from_gserialized(), test_on_gser_lwgeom_count_vertices(), tin_parse(), and triangle_parse().

934 {
935  size_t expected_size = 0;
936  size_t return_size = 0;
937  uint8_t *serialized = NULL;
938  uint8_t *ptr = NULL;
939  GSERIALIZED *g = NULL;
940  assert(geom);
941 
942  /*
943  ** See if we need a bounding box, add one if we don't have one.
944  */
945  if ( (! geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)) )
946  {
947  lwgeom_add_bbox(geom);
948  }
949 
950  /*
951  ** Harmonize the flags to the state of the lwgeom
952  */
953  if ( geom->bbox )
954  FLAGS_SET_BBOX(geom->flags, 1);
955 
956  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
957  expected_size = gserialized_from_lwgeom_size(geom);
958  serialized = lwalloc(expected_size);
959  ptr = serialized;
960 
961  /* Move past size, srid and flags. */
962  ptr += 8;
963 
964  /* Write in the serialized form of the gbox, if necessary. */
965  if ( geom->bbox )
966  ptr += gserialized_from_gbox(geom->bbox, ptr);
967 
968  /* Write in the serialized form of the geometry. */
969  ptr += gserialized_from_lwgeom_any(geom, ptr);
970 
971  /* Calculate size as returned by data processing functions. */
972  return_size = ptr - serialized;
973 
974  if ( expected_size != return_size ) /* Uh oh! */
975  {
976  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
977  return NULL;
978  }
979 
980  if ( size ) /* Return the output size to the caller if necessary. */
981  *size = return_size;
982 
983  g = (GSERIALIZED*)serialized;
984 
985  /*
986  ** We are aping PgSQL code here, PostGIS code should use
987  ** VARSIZE to set this for real.
988  */
989  g->size = return_size << 2;
990 
991  /* Set the SRID! */
992  gserialized_set_srid(g, geom->srid);
993 
994  g->flags = geom->flags;
995 
996  return g;
997 }
GBOX * bbox
Definition: liblwgeom.h:397
uint8_t flags
Definition: liblwgeom.h:396
static size_t gserialized_from_gbox(const GBOX *gbox, uint8_t *buf)
Definition: g_serialized.c:865
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:100
int32_t srid
Definition: liblwgeom.h:398
#define FLAGS_SET_BBOX(flags, value)
Definition: liblwgeom.h:147
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:566
uint32_t size
Definition: liblwgeom.h:380
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:612
static size_t gserialized_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
Definition: g_serialized.c:825
void * lwalloc(size_t size)
Definition: lwutil.c:227
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:1310
int lwgeom_needs_bbox(const LWGEOM *geom)
Check whether or not a lwgeom is big enough to warrant a bounding box.
Definition: lwgeom.c:1116
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:102
uint8_t flags
Definition: liblwgeom.h:382

Here is the call graph for this function:

Here is the caller graph for this function: