PostGIS  2.1.10dev-r@@SVN_REVISION@@
double lwgeom_area_sphere ( const LWGEOM lwgeom,
const SPHEROID spheroid 
)

Calculate the area of an LWGEOM.

Calculate the geodetic area of a lwgeom on the sphere.

Anything except POLYGON, MULTIPOLYGON and GEOMETRYCOLLECTION return zero immediately. Multi's recurse, polygons calculate external ring area and subtract internal ring area. A GBOX is required to calculate an outside point.

Definition at line 1924 of file lwgeodetic.c.

References area(), COLLECTIONTYPE, LWCOLLECTION::geoms, lwgeom_is_empty(), MULTIPOLYGONTYPE, LWCOLLECTION::ngeoms, LWPOLY::nrings, POLYGONTYPE, ptarray_area_sphere(), SPHEROID::radius, LWPOLY::rings, and LWGEOM::type.

Referenced by geography_area(), test_lwgeom_area_sphere(), and test_spheroid_area().

1925 {
1926  int type;
1927  double radius2 = spheroid->radius * spheroid->radius;
1928 
1929  assert(lwgeom);
1930 
1931  /* No area in nothing */
1932  if ( lwgeom_is_empty(lwgeom) )
1933  return 0.0;
1934 
1935  /* Read the geometry type number */
1936  type = lwgeom->type;
1937 
1938  /* Anything but polygons and collections returns zero */
1939  if ( ! ( type == POLYGONTYPE || type == MULTIPOLYGONTYPE || type == COLLECTIONTYPE ) )
1940  return 0.0;
1941 
1942  /* Actually calculate area */
1943  if ( type == POLYGONTYPE )
1944  {
1945  LWPOLY *poly = (LWPOLY*)lwgeom;
1946  int i;
1947  double area = 0.0;
1948 
1949  /* Just in case there's no rings */
1950  if ( poly->nrings < 1 )
1951  return 0.0;
1952 
1953  /* First, the area of the outer ring */
1954  area += radius2 * ptarray_area_sphere(poly->rings[0]);
1955 
1956  /* Subtract areas of inner rings */
1957  for ( i = 1; i < poly->nrings; i++ )
1958  {
1959  area -= radius2 * ptarray_area_sphere(poly->rings[i]);
1960  }
1961  return area;
1962  }
1963 
1964  /* Recurse into sub-geometries to get area */
1965  if ( type == MULTIPOLYGONTYPE || type == COLLECTIONTYPE )
1966  {
1967  LWCOLLECTION *col = (LWCOLLECTION*)lwgeom;
1968  int i;
1969  double area = 0.0;
1970 
1971  for ( i = 0; i < col->ngeoms; i++ )
1972  {
1973  area += lwgeom_area_sphere(col->geoms[i], spheroid);
1974  }
1975  return area;
1976  }
1977 
1978  /* Shouldn't get here. */
1979  return 0.0;
1980 }
#define POLYGONTYPE
Definition: liblwgeom.h:62
Datum area(PG_FUNCTION_ARGS)
double radius
Definition: liblwgeom.h:274
double lwgeom_area_sphere(const LWGEOM *lwgeom, const SPHEROID *spheroid)
Calculate the area of an LWGEOM.
Definition: lwgeodetic.c:1924
LWGEOM ** geoms
Definition: liblwgeom.h:465
POINTARRAY ** rings
Definition: liblwgeom.h:413
int nrings
Definition: liblwgeom.h:411
#define MULTIPOLYGONTYPE
Definition: liblwgeom.h:65
double ptarray_area_sphere(const POINTARRAY *pa)
Returns the area of the ring (ring must be closed) in square radians (surface of the sphere is 4*PI)...
Definition: lwgeodetic.c:1702
uint8_t type
Definition: liblwgeom.h:352
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:1229
#define COLLECTIONTYPE
Definition: liblwgeom.h:66

Here is the call graph for this function:

Here is the caller graph for this function: