PostGIS  2.5.0beta2dev-r@@SVN_REVISION@@

◆ ST_BoundingDiagonal()

Datum ST_BoundingDiagonal ( PG_FUNCTION_ARGS  )

Definition at line 2868 of file lwgeom_functions_basic.c.

References LWGEOM::bbox, LWGEOM::flags, FLAGS_GET_M, FLAGS_GET_Z, geometry_serialize(), LINETYPE, LW_TRUE, lwgeom_construct_empty(), lwgeom_free(), lwgeom_from_gserialized(), lwgeom_get_bbox(), lwline_as_lwgeom(), lwline_construct(), POINT4D::m, GBOX::mmax, GBOX::mmin, PG_FUNCTION_INFO_V1(), ptarray_append_point(), ptarray_construct_empty(), LWGEOM::srid, ST_Scale(), POINT4D::x, GBOX::xmax, GBOX::xmin, POINT4D::y, GBOX::ymax, GBOX::ymin, POINT4D::z, GBOX::zmax, and GBOX::zmin.

Referenced by ST_SwapOrdinates().

2869 {
2870  GSERIALIZED *geom_in = PG_GETARG_GSERIALIZED_P(0);
2871  GSERIALIZED *geom_out;
2872  bool fits = PG_GETARG_BOOL(1);
2873  LWGEOM *lwgeom_in = lwgeom_from_gserialized(geom_in);
2874  LWGEOM *lwgeom_out;
2875  const GBOX *gbox;
2876  int hasz = FLAGS_GET_Z(lwgeom_in->flags);
2877  int hasm = FLAGS_GET_M(lwgeom_in->flags);
2878  int srid = lwgeom_in->srid;
2879  POINT4D pt;
2880  POINTARRAY *pa;
2881 
2882  if ( fits ) {
2883  /* unregister any cached bbox to ensure it's recomputed */
2884  lwgeom_in->bbox = NULL;
2885  }
2886 
2887  gbox = lwgeom_get_bbox(lwgeom_in);
2888 
2889  if ( ! gbox )
2890  {
2891  lwgeom_out = lwgeom_construct_empty(LINETYPE, srid, hasz, hasm);
2892  }
2893  else
2894  {
2895  pa = ptarray_construct_empty(hasz, hasm, 2);
2896  pt.x = gbox->xmin;
2897  pt.y = gbox->ymin;
2898  pt.z = gbox->zmin;
2899  pt.m = gbox->mmin;
2900  ptarray_append_point(pa, &pt, LW_TRUE);
2901  pt.x = gbox->xmax;
2902  pt.y = gbox->ymax;
2903  pt.z = gbox->zmax;
2904  pt.m = gbox->mmax;
2905  ptarray_append_point(pa, &pt, LW_TRUE);
2906  lwgeom_out = lwline_as_lwgeom( lwline_construct(srid, NULL, pa) );
2907  }
2908 
2909  lwgeom_free(lwgeom_in);
2910  PG_FREE_IF_COPY(geom_in, 0);
2911 
2912  geom_out = geometry_serialize(lwgeom_out);
2913  lwgeom_free(lwgeom_out);
2914 
2915  PG_RETURN_POINTER(geom_out);
2916 }
double x
Definition: liblwgeom.h:354
#define LINETYPE
Definition: liblwgeom.h:85
GBOX * bbox
Definition: liblwgeom.h:400
double m
Definition: liblwgeom.h:354
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
uint8_t flags
Definition: liblwgeom.h:399
double xmax
Definition: liblwgeom.h:295
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
Definition: ptarray.c:70
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1144
int32_t srid
Definition: liblwgeom.h:401
double zmax
Definition: liblwgeom.h:299
double ymin
Definition: liblwgeom.h:296
LWGEOM * lwline_as_lwgeom(const LWLINE *obj)
Definition: lwgeom.c:330
double xmin
Definition: liblwgeom.h:294
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int allow_duplicates)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE, then a duplicate point will not be added.
Definition: ptarray.c:156
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
LWLINE * lwline_construct(int srid, GBOX *bbox, POINTARRAY *points)
Definition: lwline.c:42
const GBOX * lwgeom_get_bbox(const LWGEOM *lwgeom)
Get a non-empty geometry bounding box, computing and caching it if not already there.
Definition: lwgeom.c:734
double ymax
Definition: liblwgeom.h:297
#define FLAGS_GET_Z(flags)
Macros for manipulating the 'flags' byte.
Definition: liblwgeom.h:139
LWGEOM * lwgeom_construct_empty(uint8_t type, int srid, char hasz, char hasm)
Definition: lwgeom.c:2085
double z
Definition: liblwgeom.h:354
GSERIALIZED * geometry_serialize(LWGEOM *lwgeom)
double mmin
Definition: liblwgeom.h:300
double zmin
Definition: liblwgeom.h:298
#define FLAGS_GET_M(flags)
Definition: liblwgeom.h:140
double mmax
Definition: liblwgeom.h:301
double y
Definition: liblwgeom.h:354
Here is the call graph for this function:
Here is the caller graph for this function: