PostGIS  2.5.1dev-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 1174 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_centroid(), 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().

1175 {
1176  size_t expected_size = 0;
1177  size_t return_size = 0;
1178  uint8_t *serialized = NULL;
1179  uint8_t *ptr = NULL;
1180  GSERIALIZED *g = NULL;
1181  assert(geom);
1182 
1183  /*
1184  ** See if we need a bounding box, add one if we don't have one.
1185  */
1186  if ( (! geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)) )
1187  {
1188  lwgeom_add_bbox(geom);
1189  }
1190 
1191  /*
1192  ** Harmonize the flags to the state of the lwgeom
1193  */
1194  if ( geom->bbox )
1195  FLAGS_SET_BBOX(geom->flags, 1);
1196  else
1197  FLAGS_SET_BBOX(geom->flags, 0);
1198 
1199  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
1200  expected_size = gserialized_from_lwgeom_size(geom);
1201  serialized = lwalloc(expected_size);
1202  ptr = serialized;
1203 
1204  /* Move past size, srid and flags. */
1205  ptr += 8;
1206 
1207  /* Write in the serialized form of the gbox, if necessary. */
1208  if ( geom->bbox )
1209  ptr += gserialized_from_gbox(geom->bbox, ptr);
1210 
1211  /* Write in the serialized form of the geometry. */
1212  ptr += gserialized_from_lwgeom_any(geom, ptr);
1213 
1214  /* Calculate size as returned by data processing functions. */
1215  return_size = ptr - serialized;
1216 
1217  if ( expected_size != return_size ) /* Uh oh! */
1218  {
1219  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
1220  return NULL;
1221  }
1222 
1223  if ( size ) /* Return the output size to the caller if necessary. */
1224  *size = return_size;
1225 
1226  g = (GSERIALIZED*)serialized;
1227 
1228  /*
1229  ** We are aping PgSQL code here, PostGIS code should use
1230  ** VARSIZE to set this for real.
1231  */
1232  g->size = return_size << 2;
1233 
1234  /* Set the SRID! */
1235  gserialized_set_srid(g, geom->srid);
1236 
1237  g->flags = geom->flags;
1238 
1239  return g;
1240 }
GBOX * bbox
Definition: liblwgeom.h:400
uint8_t flags
Definition: liblwgeom.h:399
static size_t gserialized_from_gbox(const GBOX *gbox, uint8_t *buf)
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:116
int32_t srid
Definition: liblwgeom.h:401
#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:807
uint32_t size
Definition: liblwgeom.h:383
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:686
static size_t gserialized_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
void * lwalloc(size_t size)
Definition: lwutil.c:229
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:1393
unsigned char uint8_t
Definition: uthash.h:79
int lwgeom_needs_bbox(const LWGEOM *geom)
Check whether or not a lwgeom is big enough to warrant a bounding box.
Definition: lwgeom.c:1197
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
uint8_t flags
Definition: liblwgeom.h:385
Here is the call graph for this function:
Here is the caller graph for this function: