Browse Source

Fixed several bugs: wrong minimum computation for DCELL, wrong cell
counting, wrong percentage computation


git-svn-id: https://svn.osgeo.org/grass/grass/trunk@46670 15284696-431f-4ddb-bdfa-cd5b030d7da7

Soeren Gebbert 14 years ago
parent
commit
fb5227762a
1 changed files with 16 additions and 8 deletions
  1. 16 8
      raster/r.univar/r3.univar_main.c

+ 16 - 8
raster/r.univar/r3.univar_main.c

@@ -77,10 +77,8 @@ void set_params()
 int main(int argc, char *argv[])
 {
 
-    float val_f;		/* for misc use */
-    double val_d;		/* for misc use */
-    int first = TRUE;		/* min/max init flag */
-
+    FCELL val_f;		/* for misc use */
+    DCELL val_d;		/* for misc use */
     int map_type, zmap_type;
     univar_stat *stats;
 
@@ -204,8 +202,14 @@ int main(int argc, char *argv[])
     i = 0;
     while (param.percentile->answers[i])
 	i++;
+ 
+    int n_zones = zone_info.n_zones;
+
+    if (n_zones == 0)
+        n_zones = 1;
+
     stats = create_univar_stat_struct(map_type, i);
-    for (i = 0; i < zone_info.n_zones; i++) {
+    for (i = 0; i < n_zones; i++) {
 	unsigned int j;
 	for (j = 0; j < stats[i].n_perc; j++) {
 	    sscanf(param.percentile->answers[j], "%lf", &(stats[i].perc[j]));
@@ -218,8 +222,10 @@ int main(int argc, char *argv[])
 	for (y = 0; y < rows; y++) {
 	    for (x = 0; x < cols; x++) {
 		zone = 0;
-		if (zone_info.n_zones)
-		    G3d_getValue(zmap, x, y, z, &zone, CELL_TYPE);
+		if (zone_info.n_zones) {
+		    G3d_getValue(zmap, x, y, z, &val_d, DCELL_TYPE);
+                    zone = (int)val_d;
+                }
 		if (map_type == FCELL_TYPE) {
 		    G3d_getValue(map, x, y, z, &val_f, map_type);
 		    if (!G3d_isNullValueNum(&val_f, map_type)) {
@@ -252,6 +258,7 @@ int main(int argc, char *argv[])
 			}
 			stats[zone].n++;
 		    }
+		    stats[zone].size++;
 		}
 		else if (map_type == DCELL_TYPE) {
 		    G3d_getValue(map, x, y, z, &val_d, map_type);
@@ -272,7 +279,7 @@ int main(int argc, char *argv[])
 			stats[zone].sumsq += val_d * val_d;
 			stats[zone].sum_abs += fabs(val_d);
 
-			if (first) {
+			if (stats[zone].first) {
 			    stats[zone].max = val_d;
 			    stats[zone].min = val_d;
 			    stats[zone].first = FALSE;
@@ -285,6 +292,7 @@ int main(int argc, char *argv[])
 			}
 			stats[zone].n++;
 		    }
+		    stats[zone].size++;
 		}
 	    }
 	}