PostGIS  2.5.2dev-r@@SVN_REVISION@@

◆ lwgeom_length_spheroid()

double lwgeom_length_spheroid ( const LWGEOM geom,
const SPHEROID s 
)

Calculate the geodetic length of a lwgeom on the unit sphere.

The result will have to by multiplied by the real radius to get the real length.

Definition at line 3209 of file lwgeodetic.c.

References LWCOLLECTION::geoms, LINETYPE, lwerror(), lwgeom_is_empty(), lwtype_is_collection(), MULTIPOINTTYPE, LWCOLLECTION::ngeoms, LWPOLY::nrings, POINTTYPE, POLYGONTYPE, ptarray_length_spheroid(), LWPOLY::rings, TRIANGLETYPE, ovdump::type, and LWGEOM::type.

Referenced by geography_length(), geography_perimeter(), LWGEOM_length2d_ellipsoid(), and LWGEOM_length_ellipsoid_linestring().

3210 {
3211  int type;
3212  uint32_t i = 0;
3213  double length = 0.0;
3214 
3215  assert(geom);
3216 
3217  /* No area in nothing */
3218  if ( lwgeom_is_empty(geom) )
3219  return 0.0;
3220 
3221  type = geom->type;
3222 
3223  if ( type == POINTTYPE || type == MULTIPOINTTYPE )
3224  return 0.0;
3225 
3226  if ( type == LINETYPE )
3227  return ptarray_length_spheroid(((LWLINE*)geom)->points, s);
3228 
3229  if ( type == POLYGONTYPE )
3230  {
3231  LWPOLY *poly = (LWPOLY*)geom;
3232  for ( i = 0; i < poly->nrings; i++ )
3233  {
3234  length += ptarray_length_spheroid(poly->rings[i], s);
3235  }
3236  return length;
3237  }
3238 
3239  if ( type == TRIANGLETYPE )
3240  return ptarray_length_spheroid(((LWTRIANGLE*)geom)->points, s);
3241 
3242  if ( lwtype_is_collection( type ) )
3243  {
3244  LWCOLLECTION *col = (LWCOLLECTION*)geom;
3245 
3246  for ( i = 0; i < col->ngeoms; i++ )
3247  {
3248  length += lwgeom_length_spheroid(col->geoms[i], s);
3249  }
3250  return length;
3251  }
3252 
3253  lwerror("unsupported type passed to lwgeom_length_sphere");
3254  return 0.0;
3255 }
#define LINETYPE
Definition: liblwgeom.h:85
#define POLYGONTYPE
Definition: liblwgeom.h:86
#define MULTIPOINTTYPE
Definition: liblwgeom.h:87
#define TRIANGLETYPE
Definition: liblwgeom.h:97
double lwgeom_length_spheroid(const LWGEOM *geom, const SPHEROID *s)
Calculate the geodetic length of a lwgeom on the unit sphere.
Definition: lwgeodetic.c:3209
uint32_t ngeoms
Definition: liblwgeom.h:509
uint32_t nrings
Definition: liblwgeom.h:457
unsigned int uint32_t
Definition: uthash.h:78
LWGEOM ** geoms
Definition: liblwgeom.h:511
double ptarray_length_spheroid(const POINTARRAY *pa, const SPHEROID *s)
Definition: lwgeodetic.c:3156
POINTARRAY ** rings
Definition: liblwgeom.h:459
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
Definition: lwgeom.c:1093
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:84
uint8_t type
Definition: liblwgeom.h:398
type
Definition: ovdump.py:41
int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members) ...
Definition: lwgeom.c:1393
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
Here is the call graph for this function:
Here is the caller graph for this function: