PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ TWKBFromLWGEOM()

Datum TWKBFromLWGEOM ( PG_FUNCTION_ARGS  )

Definition at line 473 of file lwgeom_inout.c.

474{
475 GSERIALIZED *geom;
476 LWGEOM *lwgeom;
477 uint8_t *twkb;
478 size_t twkb_size;
479 uint8_t variant = 0;
480 bytea *result;
481 srs_precision sp;
482
483 /*check for null input since we cannot have the sql-function as strict.
484 That is because we use null as default for optional ID*/
485 if ( PG_ARGISNULL(0) ) PG_RETURN_NULL();
486
487 geom = PG_GETARG_GSERIALIZED_P(0);
488
489 /* Read sensible precision defaults (about one meter) given the srs */
490 sp = srid_axis_precision(fcinfo, gserialized_get_srid(geom), TWKB_DEFAULT_PRECISION);
491
492 /* If user specified XY precision, use it */
493 if ( PG_NARGS() > 1 && ! PG_ARGISNULL(1) )
494 sp.precision_xy = PG_GETARG_INT32(1);
495
496 /* If user specified Z precision, use it */
497 if ( PG_NARGS() > 2 && ! PG_ARGISNULL(2) )
498 sp.precision_z = PG_GETARG_INT32(2);
499
500 /* If user specified M precision, use it */
501 if ( PG_NARGS() > 3 && ! PG_ARGISNULL(3) )
502 sp.precision_m = PG_GETARG_INT32(3);
503
504 /* We don't permit ids for single geoemtries */
505 variant = variant & ~TWKB_ID;
506
507 /* If user wants registered twkb sizes */
508 if ( PG_NARGS() > 4 && ! PG_ARGISNULL(4) && PG_GETARG_BOOL(4) )
510
511 /* If user wants bounding boxes */
512 if ( PG_NARGS() > 5 && ! PG_ARGISNULL(5) && PG_GETARG_BOOL(5) )
514
515 /* Create TWKB binary string */
516 lwgeom = lwgeom_from_gserialized(geom);
517 twkb = lwgeom_to_twkb(lwgeom, variant, sp.precision_xy, sp.precision_z, sp.precision_m, &twkb_size);
518
519 /* Prepare the PgSQL text return type */
520 result = palloc(twkb_size + VARHDRSZ);
521 memcpy(VARDATA(result), twkb, twkb_size);
522 SET_VARSIZE(result, twkb_size + VARHDRSZ);
523
524 PG_RETURN_BYTEA_P(result);
525}
static uint8_t variant
Definition cu_in_twkb.c:26
int32_t gserialized_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
uint8_t * lwgeom_to_twkb(const LWGEOM *geom, uint8_t variant, int8_t precision_xy, int8_t precision_z, int8_t precision_m, size_t *twkb_size)
Definition lwout_twkb.c:636
#define TWKB_DEFAULT_PRECISION
Definition liblwgeom.h:2143
#define TWKB_SIZE
Definition liblwgeom.h:2139
#define TWKB_BBOX
Definition liblwgeom.h:2138

References gserialized_get_srid(), lwgeom_from_gserialized(), lwgeom_to_twkb(), TWKB_BBOX, TWKB_DEFAULT_PRECISION, TWKB_SIZE, and variant.

Here is the call graph for this function: