[GRASS-SVN] r70393 - grass/branches/releasebranch_7_2/vector/v.to.rast

svn_grass at osgeo.org svn_grass at osgeo.org
Tue Jan 17 14:32:30 PST 2017


Author: mmetz
Date: 2017-01-17 14:32:30 -0800 (Tue, 17 Jan 2017)
New Revision: 70393

Modified:
   grass/branches/releasebranch_7_2/vector/v.to.rast/local.h
   grass/branches/releasebranch_7_2/vector/v.to.rast/support.c
   grass/branches/releasebranch_7_2/vector/v.to.rast/vect2rast.c
Log:
v.to.rast: backport trunk r69326, 69357

Modified: grass/branches/releasebranch_7_2/vector/v.to.rast/local.h
===================================================================
--- grass/branches/releasebranch_7_2/vector/v.to.rast/local.h	2017-01-17 22:11:49 UTC (rev 70392)
+++ grass/branches/releasebranch_7_2/vector/v.to.rast/local.h	2017-01-17 22:32:30 UTC (rev 70393)
@@ -43,11 +43,9 @@
 
 /* support.c */
 int update_hist(const char *, const char *, long);
-int update_colors(const char *);
 int update_dbcolors(const char *, const char *, int, const char *, int, const char *);
 int update_labels(const char *, const char *, int, const char *, int, int, const char *);
 int update_cats(const char *);
-int update_fcolors(const char *);
 
 /* vect2rast.c */
 int vect_to_rast(const char *, const char *, const char *, const char *, int, int,

Modified: grass/branches/releasebranch_7_2/vector/v.to.rast/support.c
===================================================================
--- grass/branches/releasebranch_7_2/vector/v.to.rast/support.c	2017-01-17 22:11:49 UTC (rev 70392)
+++ grass/branches/releasebranch_7_2/vector/v.to.rast/support.c	2017-01-17 22:32:30 UTC (rev 70393)
@@ -5,6 +5,7 @@
  *          -1  -  error
  */
 
+#include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 #include <grass/gis.h>
@@ -15,7 +16,14 @@
 #include <grass/glocale.h>
 #include "local.h"
 
+struct My_labels_rule
+{
+    dbString label;
+    double d;
+    int i;
+};
 
+
 int update_hist(const char *raster_name, const char *vector_name, long scale)
 {
     struct History hist;
@@ -39,37 +47,6 @@
     return 0;
 }
 
-
-int update_colors(const char *raster_name)
-{
-    struct Range range;
-    struct Colors colors;
-    CELL min, max;
-
-    Rast_read_range(raster_name, G_mapset(), &range);
-    Rast_get_range_min_max(&range, &min, &max);
-    Rast_make_rainbow_colors(&colors, min, max);
-    Rast_write_colors(raster_name, G_mapset(), &colors);
-
-    return 0;
-}
-
-
-int update_fcolors(const char *raster_name)
-{
-    struct FPRange range;
-    struct Colors colors;
-    DCELL min, max;
-
-    Rast_read_fp_range(raster_name, G_mapset(), &range);
-    Rast_get_fp_range_min_max(&range, &min, &max);
-    Rast_make_rainbow_colors(&colors, (CELL) min, (CELL) max);
-    Rast_write_colors(raster_name, G_mapset(), &colors);
-
-    return 0;
-}
-
-
 int update_cats(const char *raster_name)
 {
     /* TODO: maybe attribute transfer from vector map? 
@@ -233,13 +210,31 @@
     return 1;
 }
 
+static int cmp_labels_d(const void *a, const void *b)
+{
+    struct My_labels_rule *al = (struct My_labels_rule *) a;
+    struct My_labels_rule *bl = (struct My_labels_rule *) b;
 
+    if (al->d < bl->d)
+	return -1;
+
+    return (al->d > bl->d);
+}
+
+static int cmp_labels_i(const void *a, const void *b)
+{
+    struct My_labels_rule *al = (struct My_labels_rule *) a;
+    struct My_labels_rule *bl = (struct My_labels_rule *) b;
+
+    return (al->i - bl->i);
+}
+
 /* add labels to raster cells */
 int update_labels(const char *rast_name, const char *vector_map, int field,
 		  const char *label_column, int use, int val,
 		  const char *attr_column)
 {
-    int i;
+    int i, j;
 
     /* Map */
     struct Map_info Map;
@@ -254,12 +249,7 @@
     /* labels */
     struct Categories rast_cats;
     int labels_n_values = 0;
-    struct My_labels_rule
-    {
-	dbString label;
-	double d;
-	int i;
-    } *my_labels_rules;
+    struct My_labels_rule *my_labels_rules;
 
     /* init raster categories */
     Rast_init_cats("Categories", &rast_cats);
@@ -364,21 +354,107 @@
 	    /* close the database driver */
 	    db_close_database_shutdown_driver(Driver);
 
-	    /* set the color rules: for each rule */
-	    if (is_fp) {
-		/* add label */
-		for (i = 0; i < labels_n_values - 1; i++)
-		    Rast_set_cat(&my_labels_rules[i].d,
-				     &my_labels_rules[i + 1].d,
-				     db_get_string(&my_labels_rules[i].label),
-				     &rast_cats, DCELL_TYPE);
+	    /* set the labels */
+	    if (labels_n_values > 0) {
+		char *lblstr;
+
+		/* remove values without labels */
+		j = 0;
+		for (i = 0; i < labels_n_values; i++) {
+		    lblstr = db_get_string(&my_labels_rules[i].label);
+		    if (lblstr && *lblstr) {
+			my_labels_rules[j] = my_labels_rules[i];
+			j++;
+		    }
+		}
+		labels_n_values = j;
 	    }
-	    else {
-		for (i = 0; i < labels_n_values; i++)
-		  Rast_set_c_cat(&(my_labels_rules[i].i),
-				 &(my_labels_rules[i].i),
-				 db_get_string(&my_labels_rules[i].label),
-				 &rast_cats);
+
+	    if (labels_n_values > 0) {
+		char *lblstr;
+
+		if (is_fp) {
+		    DCELL val1, val2;
+
+		    qsort(my_labels_rules, labels_n_values, 
+			  sizeof(struct My_labels_rule), cmp_labels_d);
+
+		    /* remove duplicate values */
+		    j = 1;
+		    for (i = 1; i < labels_n_values; i++) {
+			if (my_labels_rules[i - 1].d != my_labels_rules[i].d) {
+			    my_labels_rules[j] = my_labels_rules[i];
+			    j++;
+			}
+			else {
+			    if (strcmp(db_get_string(&my_labels_rules[i].label),
+			               db_get_string(&my_labels_rules[i - 1].label)) != 0) {
+				G_warning(_("Different labels for the same value are not supported"));
+			    }
+			}
+		    }
+		    labels_n_values = j;
+
+		    /* add labels */
+		    i = 0;
+		    val1 = val2 = my_labels_rules[i].d;
+		    lblstr = db_get_string(&my_labels_rules[i].label);
+
+		    for (i = 1; i < labels_n_values; i++) {
+			if (strcmp(lblstr, db_get_string(&my_labels_rules[i].label)) == 0) {
+			    val2 = my_labels_rules[i].d;
+			}
+			else {
+			    Rast_set_d_cat(&val1, &val2, lblstr,
+					 &rast_cats);
+
+			    val1 = val2 = my_labels_rules[i].d;
+			    lblstr = db_get_string(&my_labels_rules[i].label);
+			}
+		    }
+		    Rast_set_d_cat(&val1, &val2, lblstr, &rast_cats);
+		}
+		else {
+		    CELL val1, val2;
+
+		    qsort(my_labels_rules, labels_n_values, 
+			  sizeof(struct My_labels_rule), cmp_labels_i);
+
+		    /* remove duplicate values */
+		    j = 1;
+		    for (i = 1; i < labels_n_values; i++) {
+			if (my_labels_rules[i - 1].i != my_labels_rules[i].i) {
+			    my_labels_rules[j] = my_labels_rules[i];
+			    j++;
+			}
+			else {
+			    if (strcmp(db_get_string(&my_labels_rules[i].label),
+			               db_get_string(&my_labels_rules[i - 1].label)) != 0) {
+				G_warning(_("Different labels for the same value are not supported"));
+			    }
+			}
+		    }
+		    labels_n_values = j;
+
+		    /* add labels */
+		    i = 0;
+		    val1 = val2 = my_labels_rules[i].i;
+		    lblstr = db_get_string(&my_labels_rules[i].label);
+
+		    for (i = 1; i < labels_n_values; i++) {
+			if (strcmp(lblstr, db_get_string(&my_labels_rules[i].label)) == 0) {
+			    val2 = my_labels_rules[i].i;
+			}
+			else {
+			    Rast_set_c_cat(&val1, &val2, lblstr,
+					   &rast_cats);
+
+			    val1 = val2 = my_labels_rules[i].i;
+			    lblstr = db_get_string(&my_labels_rules[i].label);
+			}
+		    }
+		    Rast_set_c_cat(&val1, &val2, lblstr, &rast_cats);
+		}
 	    }
 	}
 	break;

Modified: grass/branches/releasebranch_7_2/vector/v.to.rast/vect2rast.c
===================================================================
--- grass/branches/releasebranch_7_2/vector/v.to.rast/vect2rast.c	2017-01-17 22:11:49 UTC (rev 70392)
+++ grass/branches/releasebranch_7_2/vector/v.to.rast/vect2rast.c	2017-01-17 22:32:30 UTC (rev 70393)
@@ -202,17 +202,12 @@
     if (rgbcolumn) {
 	if (use != USE_ATTR && use != USE_CAT) {
 	    G_warning(_("Color can be updated from database only if use=attr"));
-	    update_colors(raster_map);
 	}
 	else {
 	  update_dbcolors(raster_map, vector_map, field, rgbcolumn, is_fp,
 			  column);
 	}
     }
-    else if (use == USE_D)
-	update_fcolors(raster_map);
-    else
-	update_colors(raster_map);
 
     update_cats(raster_map);
 



More information about the grass-commit mailing list