o_sum.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 void sum_out(FILE *, long, double);
  9. int o_sum(const char *basemap, const char *covermap, const char *outputmap,
  10. int usecats, struct Categories *cats)
  11. {
  12. long catb, basecat, covercat;
  13. double x, area, sum1;
  14. int stat;
  15. struct Popen stats_child, reclass_child;
  16. FILE *stats, *reclass;
  17. stats = run_stats(&stats_child, basemap, covermap, "-cn");
  18. reclass = run_reclass(&reclass_child, basemap, outputmap);
  19. sum_out(reclass, 0L, 0.0); /* force at least one reclass rule */
  20. catb = 0;
  21. sum1 = 0.0;
  22. while (fscanf(stats, "%ld %ld %lf", &basecat, &covercat, &area) == 3) {
  23. if (catb != basecat) {
  24. sum_out(reclass, catb, sum1);
  25. sum1 = 0.0;
  26. catb = basecat;
  27. }
  28. if (usecats)
  29. sscanf(Rast_get_c_cat((CELL *) &covercat, cats), "%lf", &x);
  30. else
  31. x = covercat;
  32. sum1 += x * area;
  33. /* fprintf(stderr,"sum: %d\n",(int)sum1); */
  34. }
  35. sum_out(reclass, basecat, sum1);
  36. G_popen_close(&stats_child);
  37. G_popen_close(&reclass_child);
  38. return stat;
  39. }
  40. static void sum_out(FILE *fp, long cat, double sum1)
  41. {
  42. char buf[64];
  43. if (cat == 0)
  44. *buf = 0;
  45. else {
  46. sprintf(buf, "%.10lf", sum1);
  47. G_trim_decimal(buf);
  48. }
  49. fprintf(fp, "%ld = %ld %s\n", cat, cat, buf);
  50. }