PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ gserialized2_from_lwgeom()

GSERIALIZED* gserialized2_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 1147 of file gserialized2.c.

1148 {
1149  size_t expected_size = 0;
1150  size_t return_size = 0;
1151  uint8_t *ptr = NULL;
1152  GSERIALIZED *g = NULL;
1153  assert(geom);
1154 
1155  /*
1156  ** See if we need a bounding box, add one if we don't have one.
1157  */
1158  if ((!geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)))
1159  {
1160  lwgeom_add_bbox(geom);
1161  }
1162 
1163  /*
1164  ** Harmonize the flags to the state of the lwgeom
1165  */
1166  FLAGS_SET_BBOX(geom->flags, (geom->bbox ? 1 : 0));
1167 
1168  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
1169  expected_size = gserialized2_from_lwgeom_size(geom);
1170  ptr = lwalloc(expected_size);
1171  g = (GSERIALIZED*)(ptr);
1172 
1173  /* Set the SRID! */
1174  gserialized2_set_srid(g, geom->srid);
1175  /*
1176  ** We are aping PgSQL code here, PostGIS code should use
1177  ** VARSIZE to set this for real.
1178  */
1179  LWSIZE_SET(g->size, expected_size);
1180  g->gflags = lwflags_get_g2flags(geom->flags);
1181 
1182  /* Move write head past size, srid and flags. */
1183  ptr += 8;
1184 
1185  /* Write in the extended flags if necessary */
1186  ptr += gserialized2_from_extended_flags(geom->flags, ptr);
1187 
1188  /* Write in the serialized form of the gbox, if necessary. */
1189  if (geom->bbox)
1190  ptr += gserialized2_from_gbox(geom->bbox, ptr);
1191 
1192  /* Write in the serialized form of the geometry. */
1193  ptr += gserialized2_from_lwgeom_any(geom, ptr);
1194 
1195  /* Calculate size as returned by data processing functions. */
1196  return_size = ptr - (uint8_t*)g;
1197 
1198  assert(expected_size == return_size);
1199  if (size) /* Return the output size to the caller if necessary. */
1200  *size = return_size;
1201 
1202  return g;
1203 }
void gserialized2_set_srid(GSERIALIZED *g, int32_t srid)
Write the SRID into the serialized form (it is packed into three bytes so this is a handy function).
Definition: gserialized2.c:208
static size_t gserialized2_from_gbox(const GBOX *gbox, uint8_t *buf)
uint8_t lwflags_get_g2flags(lwflags_t lwflags)
Definition: gserialized2.c:118
static size_t gserialized2_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
size_t gserialized2_from_lwgeom_size(const LWGEOM *geom)
Return the memory size a GSERIALIZED will occupy for a given LWGEOM.
Definition: gserialized2.c:777
static size_t gserialized2_from_extended_flags(lwflags_t lwflags, uint8_t *buf)
#define FLAGS_SET_BBOX(flags, value)
Definition: liblwgeom.h:174
int lwgeom_needs_bbox(const LWGEOM *geom)
Check whether or not a lwgeom is big enough to warrant a bounding box.
Definition: lwgeom.c:1271
#define LWSIZE_SET(varsize, len)
Definition: liblwgeom.h:325
void * lwalloc(size_t size)
Definition: lwutil.c:227
void lwgeom_add_bbox(LWGEOM *lwgeom)
Compute a bbox if not already computed.
Definition: lwgeom.c:695
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
Definition: lwinline.h:199
uint32_t size
Definition: liblwgeom.h:444
uint8_t gflags
Definition: liblwgeom.h:446
GBOX * bbox
Definition: liblwgeom.h:458
int32_t srid
Definition: liblwgeom.h:460
lwflags_t flags
Definition: liblwgeom.h:461

References LWGEOM::bbox, LWGEOM::flags, FLAGS_SET_BBOX, GSERIALIZED::gflags, gserialized2_from_extended_flags(), gserialized2_from_gbox(), gserialized2_from_lwgeom_any(), gserialized2_from_lwgeom_size(), gserialized2_set_srid(), lwalloc(), lwflags_get_g2flags(), lwgeom_add_bbox(), lwgeom_is_empty(), lwgeom_needs_bbox(), LWSIZE_SET, GSERIALIZED::size, and LWGEOM::srid.

Referenced by gserialized_from_lwgeom(), peek2_point_helper(), test_gserialized2_extended_flags(), test_gserialized2_is_empty(), test_gserialized2_peek_gbox_p_gets_correct_box(), test_gserialized2_peek_gbox_p_no_box_when_empty(), test_lwgeom_from_gserialized2(), and test_on_gser2_lwgeom_count_vertices().

Here is the call graph for this function:
Here is the caller graph for this function: