stats.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <grass/gis.h>
  2. #include <grass/raster.h>
  3. #include "rule.h"
  4. #define LIST struct Histogram_list
  5. void new_stats(const char *name, struct Reclass *reclass)
  6. {
  7. struct Histogram histo, histo2;
  8. struct Range range;
  9. CELL cat, cat2;
  10. int i;
  11. CELL min, max;
  12. min = reclass->min;
  13. max = reclass->max;
  14. /* read histogram for original file */
  15. G_suppress_warnings(1);
  16. i = Rast_read_histogram(reclass->name, reclass->mapset, &histo);
  17. G_suppress_warnings(0);
  18. if (i <= 0)
  19. return;
  20. /* compute data rage for reclass */
  21. Rast_init_range(&range);
  22. for (i = 0; i < histo.num; i++) {
  23. cat = histo.list[i].cat;
  24. if (cat < min || cat > max)
  25. continue;
  26. cat2 = reclass->table[cat - min];
  27. Rast_update_range(cat2, &range);
  28. }
  29. Rast_write_range(name, &range);
  30. /* now generate a histogram from the original */
  31. /* allocate histogram list */
  32. histo2.num += range.max - range.min + 1;
  33. histo2.list = (LIST *) G_calloc(histo2.num, sizeof(LIST));
  34. /* set all counts to 0 */
  35. i = 0;
  36. for (cat = range.min; cat <= range.max; cat++) {
  37. histo2.list[i].cat = cat;
  38. histo2.list[i++].count = 0;
  39. }
  40. /* go thru original histogram and add into histo2 */
  41. for (i = 0; i < histo.num; i++) {
  42. cat = histo.list[i].cat;
  43. if (cat < min || cat > max)
  44. Rast_set_c_null_value(&cat, 1);
  45. else
  46. cat2 = reclass->table[cat - min];
  47. if (!Rast_is_c_null_value(&cat))
  48. histo2.list[cat2 - range.min].count += histo.list[i].count;
  49. }
  50. Rast_write_histogram(name, &histo2);
  51. }