GRASS GIS 7 Programmer's Manual  7.0.4(2016)-r00000
area.c
Go to the documentation of this file.
1 
14 #include <grass/gis.h>
15 
16 static struct state {
17  struct Cell_head window;
18  double square_meters;
19  int projection;
20 
21  double units_to_meters_squared;
22 
23  /* these next are for lat-long only */
24  int next_row;
25  double north_value;
26  double north;
27  double (*darea0) (double);
28 } state;
29 
30 static struct state *st = &state;
31 
47 {
48  double a, e2;
49  double factor;
50 
51  G_get_set_window(&st->window);
52  switch (st->projection = st->window.proj) {
53  case PROJECTION_LL:
55  if (e2) {
56  G_begin_zone_area_on_ellipsoid(a, e2, st->window.ew_res / 360.0);
57  st->darea0 = G_darea0_on_ellipsoid;
58  }
59  else {
60  G_begin_zone_area_on_sphere(a, st->window.ew_res / 360.0);
61  st->darea0 = G_darea0_on_sphere;
62  }
63  st->next_row = 0;
64  st->north = st->window.north;
65  st->north_value = st->darea0(st->north);
66  return 2;
67  default:
68  st->square_meters = st->window.ns_res * st->window.ew_res;
70  if (factor > 0.0)
71  st->square_meters *= (factor * factor);
72  return (factor > 0.0);
73  }
74 }
75 
87 double G_area_of_cell_at_row(int row)
88 {
89  double south_value;
90  double cell_area;
91 
92  if (st->projection != PROJECTION_LL)
93  return st->square_meters;
94 
95  if (row != st->next_row) {
96  st->north = st->window.north - row * st->window.ns_res;
97  st->north_value = st->darea0(st->north);
98  }
99 
100  st->north -= st->window.ns_res;
101  south_value = st->darea0(st->north);
102  cell_area = st->north_value - south_value;
103 
104  st->next_row = row + 1;
105  st->north_value = south_value;
106 
107  return cell_area;
108 }
109 
121 {
122  double a, e2;
123  double factor;
124 
125  if ((st->projection = G_projection()) == PROJECTION_LL) {
128  return 2;
129  }
131  if (factor > 0.0) {
132  st->units_to_meters_squared = factor * factor;
133  return 1;
134  }
135  st->units_to_meters_squared = 1.0;
136  return 0;
137 }
138 
159 double G_area_of_polygon(const double *x, const double *y, int n)
160 {
161  double area;
162 
163  if (st->projection == PROJECTION_LL)
164  area = G_ellipsoid_polygon_area(x, y, n);
165  else
166  area = G_planimetric_polygon_area(x, y, n) * st->units_to_meters_squared;
167 
168  return area;
169 }
double G_darea0_on_sphere(double lat)
Calculates integral for area between two latitudes.
Definition: area_sphere.c:48
void G_begin_zone_area_on_ellipsoid(double a, double e2, double s)
Begin area calculations for ellipsoid.
Definition: area_ellipse.c:47
int G_get_ellipsoid_parameters(double *a, double *e2)
get ellipsoid parameters
Definition: get_ellipse.c:67
double G_planimetric_polygon_area(const double *x, const double *y, int n)
Calculates planimetric polygon area.
Definition: area_poly2.c:25
int G_begin_cell_area_calculations(void)
Begin cell area calculations.
Definition: area.c:46
double G_darea0_on_ellipsoid(double lat)
Calculate integral for area between two latitudes.
Definition: area_ellipse.c:63
int G_begin_polygon_area_calculations(void)
Begin polygon area calculations.
Definition: area.c:120
struct state * st
Definition: parser.c:101
void G_begin_zone_area_on_sphere(double r, double s)
Initialize calculations for sphere.
Definition: area_sphere.c:36
double G_ellipsoid_polygon_area(const double *lon, const double *lat, int n)
Area of lat-long polygon.
Definition: area_poly1.c:129
void G_get_set_window(struct Cell_head *window)
Get the current working window (region)
double G_database_units_to_meters_factor(void)
Conversion to meters.
Definition: proj3.c:124
struct state state
Definition: parser.c:100
double G_area_of_cell_at_row(int row)
Cell area in specified row.
Definition: area.c:87
int G_projection(void)
Query cartographic projection.
Definition: proj1.c:32
void G_begin_ellipsoid_polygon_area(double a, double e2)
Begin area calculations.
Definition: area_poly1.c:61
double G_area_of_polygon(const double *x, const double *y, int n)
Area in square meters of polygon.
Definition: area.c:159