PostGIS  2.5.0beta2dev-r@@SVN_REVISION@@

◆ ptarray_calculate_gbox_geodetic()

int ptarray_calculate_gbox_geodetic ( const POINTARRAY pa,
GBOX gbox 
)

Calculate geodetic (x/y/z) box and add values to gbox.

Return LW_SUCCESS on success.

Definition at line 2801 of file lwgeodetic.c.

References edge_calculate_gbox(), GBOX::flags, gbox_duplicate(), gbox_init(), gbox_merge(), getPoint2d_cp(), ll2cart(), LW_FAILURE, LW_FALSE, LW_SUCCESS, LW_TRUE, POINTARRAY::npoints, POINT3D::x, GBOX::xmax, GBOX::xmin, POINT3D::y, GBOX::ymax, GBOX::ymin, POINT3D::z, GBOX::zmax, and GBOX::zmin.

Referenced by lwline_calculate_gbox_geodetic(), lwpoint_calculate_gbox_geodetic(), lwpolygon_calculate_gbox_geodetic(), and lwtriangle_calculate_gbox_geodetic().

2802 {
2803  uint32_t i;
2804  int first = LW_TRUE;
2805  const POINT2D *p;
2806  POINT3D A1, A2;
2807  GBOX edge_gbox;
2808 
2809  assert(gbox);
2810  assert(pa);
2811 
2812  gbox_init(&edge_gbox);
2813  edge_gbox.flags = gbox->flags;
2814 
2815  if ( pa->npoints == 0 ) return LW_FAILURE;
2816 
2817  if ( pa->npoints == 1 )
2818  {
2819  p = getPoint2d_cp(pa, 0);
2820  ll2cart(p, &A1);
2821  gbox->xmin = gbox->xmax = A1.x;
2822  gbox->ymin = gbox->ymax = A1.y;
2823  gbox->zmin = gbox->zmax = A1.z;
2824  return LW_SUCCESS;
2825  }
2826 
2827  p = getPoint2d_cp(pa, 0);
2828  ll2cart(p, &A1);
2829 
2830  for ( i = 1; i < pa->npoints; i++ )
2831  {
2832 
2833  p = getPoint2d_cp(pa, i);
2834  ll2cart(p, &A2);
2835 
2836  edge_calculate_gbox(&A1, &A2, &edge_gbox);
2837 
2838  /* Initialize the box */
2839  if ( first )
2840  {
2841  gbox_duplicate(&edge_gbox, gbox);
2842  first = LW_FALSE;
2843  }
2844  /* Expand the box where necessary */
2845  else
2846  {
2847  gbox_merge(&edge_gbox, gbox);
2848  }
2849 
2850  A1 = A2;
2851  }
2852 
2853  return LW_SUCCESS;
2854 }
void gbox_duplicate(const GBOX *original, GBOX *duplicate)
Copy the values of original GBOX into duplicate.
Definition: g_box.c:440
double y
Definition: liblwgeom.h:342
double xmax
Definition: liblwgeom.h:295
#define LW_SUCCESS
Definition: liblwgeom.h:79
double x
Definition: liblwgeom.h:342
int gbox_merge(const GBOX *new_box, GBOX *merge_box)
Update the merged GBOX to be large enough to include itself and the new box.
Definition: g_box.c:264
#define LW_FAILURE
Definition: liblwgeom.h:78
double z
Definition: liblwgeom.h:342
unsigned int uint32_t
Definition: uthash.h:78
double zmax
Definition: liblwgeom.h:299
double ymin
Definition: liblwgeom.h:296
void gbox_init(GBOX *gbox)
Zero out all the entries in the GBOX.
Definition: g_box.c:47
double xmin
Definition: liblwgeom.h:294
#define LW_FALSE
Definition: liblwgeom.h:76
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
void ll2cart(const POINT2D *g, POINT3D *p)
Convert lon/lat coordinates to cartesian coordinates on unit sphere.
Definition: lwgeodetic.c:392
double ymax
Definition: liblwgeom.h:297
uint8_t flags
Definition: liblwgeom.h:293
double zmin
Definition: liblwgeom.h:298
int edge_calculate_gbox(const POINT3D *A1, const POINT3D *A2, GBOX *gbox)
The magic function, given an edge in spherical coordinates, calculate a 3D bounding box that fully co...
Definition: lwgeodetic.c:1377
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:364
uint32_t npoints
Definition: liblwgeom.h:373
Here is the call graph for this function:
Here is the caller graph for this function: