PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ gserialized_from_lwgeom()

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, 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_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  else
956  FLAGS_SET_BBOX(geom->flags, 0);
957 
958  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
959  expected_size = gserialized_from_lwgeom_size(geom);
960  serialized = lwalloc(expected_size);
961  ptr = serialized;
962 
963  /* Move past size, srid and flags. */
964  ptr += 8;
965 
966  /* Write in the serialized form of the gbox, if necessary. */
967  if ( geom->bbox )
968  ptr += gserialized_from_gbox(geom->bbox, ptr);
969 
970  /* Write in the serialized form of the geometry. */
971  ptr += gserialized_from_lwgeom_any(geom, ptr);
972 
973  /* Calculate size as returned by data processing functions. */
974  return_size = ptr - serialized;
975 
976  if ( expected_size != return_size ) /* Uh oh! */
977  {
978  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
979  return NULL;
980  }
981 
982  if ( size ) /* Return the output size to the caller if necessary. */
983  *size = return_size;
984 
985  g = (GSERIALIZED*)serialized;
986 
987  /*
988  ** We are aping PgSQL code here, PostGIS code should use
989  ** VARSIZE to set this for real.
990  */
991  g->size = return_size << 2;
992 
993  /* Set the SRID! */
994  gserialized_set_srid(g, geom->srid);
995 
996  g->flags = geom->flags;
997 
998  return g;
999 }
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: