PostGIS  3.3.9dev-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 3137 of file lwgeodetic.c.

3138 {
3139  int type;
3140  uint32_t i = 0;
3141  double length = 0.0;
3142 
3143  assert(geom);
3144 
3145  /* No area in nothing */
3146  if ( lwgeom_is_empty(geom) )
3147  return 0.0;
3148 
3149  type = geom->type;
3150 
3151  if ( type == POINTTYPE || type == MULTIPOINTTYPE )
3152  return 0.0;
3153 
3154  if ( type == LINETYPE )
3155  return ptarray_length_spheroid(((LWLINE*)geom)->points, s);
3156 
3157  if ( type == POLYGONTYPE )
3158  {
3159  LWPOLY *poly = (LWPOLY*)geom;
3160  for ( i = 0; i < poly->nrings; i++ )
3161  {
3162  length += ptarray_length_spheroid(poly->rings[i], s);
3163  }
3164  return length;
3165  }
3166 
3167  if ( type == TRIANGLETYPE )
3168  return ptarray_length_spheroid(((LWTRIANGLE*)geom)->points, s);
3169 
3170  if ( lwtype_is_collection( type ) )
3171  {
3172  LWCOLLECTION *col = (LWCOLLECTION*)geom;
3173 
3174  for ( i = 0; i < col->ngeoms; i++ )
3175  {
3176  length += lwgeom_length_spheroid(col->geoms[i], s);
3177  }
3178  return length;
3179  }
3180 
3181  lwerror("unsupported type passed to lwgeom_length_sphere");
3182  return 0.0;
3183 }
char * s
Definition: cu_in_wkt.c:23
#define LINETYPE
Definition: liblwgeom.h:118
#define MULTIPOINTTYPE
Definition: liblwgeom.h:120
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
Definition: lwgeom.c:1105
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:117
#define POLYGONTYPE
Definition: liblwgeom.h:119
#define TRIANGLETYPE
Definition: liblwgeom.h:130
double ptarray_length_spheroid(const POINTARRAY *pa, const SPHEROID *s)
Definition: lwgeodetic.c:3084
double lwgeom_length_spheroid(const LWGEOM *geom, const SPHEROID *s)
Calculate the geodetic length of a lwgeom on the unit sphere.
Definition: lwgeodetic.c:3137
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
type
Definition: ovdump.py:42
uint32_t ngeoms
Definition: liblwgeom.h:595
LWGEOM ** geoms
Definition: liblwgeom.h:590
uint8_t type
Definition: liblwgeom.h:477
POINTARRAY ** rings
Definition: liblwgeom.h:534
uint32_t nrings
Definition: liblwgeom.h:539

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

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

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