1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include <stdlib.h>
#include <unistd.h>
#include <grass/gis.h>
#include <grass/raster.h>
#include <grass/glocale.h>
#include "method.h"
/* function prototypes */
static int out(FILE *, long, double, double);
int o_average(const char *basemap, const char *covermap, const char *outputmap,
int usecats, struct Categories *cats)
{
struct Popen stats_child, reclass_child;
FILE *stats, *reclass;
long catb, basecat, covercat;
double x, area, sum1, sum2;
stats = run_stats(&stats_child, basemap, covermap, "-an");
reclass = run_reclass(&reclass_child, basemap, outputmap);
out(reclass, 0L, 0.0, 1.0); /* force at least one reclass rule */
catb = 0;
sum1 = 0.0;
sum2 = 0.0;
while (fscanf(stats, "%ld %ld %lf", &basecat, &covercat, &area) == 3) {
if (catb != basecat) {
out(reclass, catb, sum1, sum2);
sum1 = 0.0;
sum2 = 0.0;
catb = basecat;
}
if (usecats)
sscanf(Rast_get_c_cat((CELL *)&covercat, cats), "%lf", &x);
else
x = covercat;
sum1 += x * area;
sum2 += area;
}
out(reclass, basecat, sum1, sum2);
G_popen_close(&stats_child);
G_popen_close(&reclass_child);
return 0;
}
static int out(FILE *fp, long cat, double sum1, double sum2)
{
char buf[80];
if (sum2 == 0)
return -1;
if (cat == 0)
*buf = 0;
else {
sprintf(buf, "%.10f", sum1 / sum2);
G_trim_decimal(buf);
}
fprintf(fp, "%ld = %ld %s\n", cat, cat, buf);
return 0;
}
|