o_average.c 1.4 KB

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