PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ gserialized1_from_lwgeom()

GSERIALIZED* gserialized1_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 1090 of file gserialized1.c.

1091 {
1092  size_t expected_size = 0;
1093  size_t return_size = 0;
1094  uint8_t *serialized = NULL;
1095  uint8_t *ptr = NULL;
1096  GSERIALIZED *g = NULL;
1097  assert(geom);
1098 
1099  /*
1100  ** See if we need a bounding box, add one if we don't have one.
1101  */
1102  if ( (! geom->bbox) && lwgeom_needs_bbox(geom) && (!lwgeom_is_empty(geom)) )
1103  {
1104  lwgeom_add_bbox(geom);
1105  }
1106 
1107  /*
1108  ** Harmonize the flags to the state of the lwgeom
1109  */
1110  if ( geom->bbox )
1111  FLAGS_SET_BBOX(geom->flags, 1);
1112  else
1113  FLAGS_SET_BBOX(geom->flags, 0);
1114 
1115  /* Set up the uint8_t buffer into which we are going to write the serialized geometry. */
1116  expected_size = gserialized1_from_lwgeom_size(geom);
1117  serialized = lwalloc(expected_size);
1118  ptr = serialized;
1119 
1120  /* Move past size, srid and flags. */
1121  ptr += 8;
1122 
1123  /* Write in the serialized form of the gbox, if necessary. */
1124  if ( geom->bbox )
1125  ptr += gserialized1_from_gbox(geom->bbox, ptr);
1126 
1127  /* Write in the serialized form of the geometry. */
1128  ptr += gserialized1_from_lwgeom_any(geom, ptr);
1129 
1130  /* Calculate size as returned by data processing functions. */
1131  return_size = ptr - serialized;
1132 
1133  if ( expected_size != return_size ) /* Uh oh! */
1134  {
1135  lwerror("Return size (%d) not equal to expected size (%d)!", return_size, expected_size);
1136  return NULL;
1137  }
1138 
1139  if ( size ) /* Return the output size to the caller if necessary. */
1140  *size = return_size;
1141 
1142  g = (GSERIALIZED*)serialized;
1143 
1144  /*
1145  ** We are aping PgSQL code here, PostGIS code should use
1146  ** VARSIZE to set this for real.
1147  */
1148  g->size = return_size << 2;
1149 
1150  /* Set the SRID! */
1151  gserialized1_set_srid(g, geom->srid);
1152 
1153  g->gflags = lwflags_get_g1flags(geom->flags);
1154 
1155  return g;
1156 }
static size_t gserialized1_from_lwgeom_any(const LWGEOM *geom, uint8_t *buf)
Definition: gserialized1.c:982
static size_t gserialized1_from_gbox(const GBOX *gbox, uint8_t *buf)
size_t gserialized1_from_lwgeom_size(const LWGEOM *geom)
Return the memory size a GSERIALIZED will occupy for a given LWGEOM.
Definition: gserialized1.c:722
uint8_t lwflags_get_g1flags(lwflags_t lwflags)
Definition: gserialized1.c:53
void gserialized1_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: gserialized1.c:160
#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:1208
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
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
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:203
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, gserialized1_from_gbox(), gserialized1_from_lwgeom_any(), gserialized1_from_lwgeom_size(), gserialized1_set_srid(), lwalloc(), lwerror(), lwflags_get_g1flags(), lwgeom_add_bbox(), lwgeom_is_empty(), lwgeom_needs_bbox(), GSERIALIZED::size, and LWGEOM::srid.

Referenced by peek1_point_helper(), test_gbox_same_2d(), test_gserialized1_is_empty(), test_gserialized1_peek_gbox_p_gets_correct_box(), test_gserialized1_peek_gbox_p_no_box_when_empty(), test_lwgeom_from_gserialized(), and test_on_gser_lwgeom_count_vertices().

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