소스 검색

v.colors: write rgb values if rgbcolumn is defined

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@47603 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 14 년 전
부모
커밋
b55bc784d4
3개의 변경된 파일71개의 추가작업 그리고 2개의 파일을 삭제
  1. 4 0
      vector/v.colors/local_proto.h
  2. 6 2
      vector/v.colors/main.c
  3. 61 0
      vector/v.colors/write_rgb.c

+ 4 - 0
vector/v.colors/local_proto.h

@@ -4,3 +4,7 @@ int scan_attr(const struct Map_info *, int, const char *,
 
 /* scan_cats */
 void scan_cats(const struct Map_info *, int, double *, double*);
+
+/* write_rgb.c */
+void write_rgb_values(const struct Map_info *, int, const char *,
+		      struct Colors *);

+ 6 - 2
vector/v.colors/main.c

@@ -42,7 +42,7 @@ int main(int argc, char *argv[])
     int have_stats, is_fp;
     int overwrite, remove, is_from_stdin, stat, have_colors;
     const char *mapset, *cmapset;
-    const char *name, *style, *rules, *cmap, *attrcolumn;
+    const char *name, *style, *rules, *cmap, *attrcolumn, *rgbcolumn;
 
     struct Map_info Map;
     struct Colors colors, colors_tmp;
@@ -140,6 +140,7 @@ int main(int argc, char *argv[])
     style = opt.colr->answer;
     rules = opt.rules->answer;
     attrcolumn = opt.attrcol->answer;
+    rgbcolumn = opt.rgbcol->answer;
     have_stats = FALSE;
     
     if (!name)
@@ -294,7 +295,10 @@ int main(int argc, char *argv[])
         colors = colors_tmp;
     }
 
-    Vect_write_colors(name, mapset, &colors);
+    if (rgbcolumn)
+	write_rgb_values(&Map, layer, rgbcolumn, &colors);
+    else
+	Vect_write_colors(name, mapset, &colors);
 
     G_message(_("Color table for vector map <%s> set to '%s'"), 
 	      G_fully_qualified_name(name, mapset), 

+ 61 - 0
vector/v.colors/write_rgb.c

@@ -0,0 +1,61 @@
+#include <grass/gis.h>
+#include <grass/vector.h>
+#include <grass/dbmi.h>
+#include <grass/raster.h>
+#include <grass/glocale.h>
+
+void write_rgb_values(const struct Map_info *Map, int layer, const char *column_name,
+		      struct Colors *colors)
+{
+    int ctype, nrec, i;
+    int red, grn, blu;
+    int *pval;
+    char buf[1024];
+    struct field_info *fi;
+    dbDriver *driver;
+    dbString stmt;
+
+    fi = Vect_get_field(Map, layer);
+    if (!fi)
+	G_fatal_error(_("Database connection not defined for layer %d"),
+		      layer);
+
+    driver = db_start_driver_open_database(fi->driver, fi->database);
+    if (!driver)
+	G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
+		      fi->database, fi->driver);
+
+    ctype = db_column_Ctype(driver, fi->table, column_name);
+    if (ctype == -1)
+	G_fatal_error(_("Column <%s> not found in table <%s>"),
+		      column_name, fi->table);
+    if (ctype != DB_C_TYPE_STRING)
+	G_fatal_error(_("Data type of column <%s> must be char"), column_name);
+	
+    nrec = db_select_int(driver, fi->table, fi->key, NULL, &pval);
+    if (nrec < 1) {
+	G_warning(_("No categories found"));
+	return;
+    }
+    
+    db_init_string(&stmt);
+    db_begin_transaction(driver);
+    
+    for (i = 0; i < nrec; i++) {
+	if (Rast_get_c_color((const CELL *) &(pval[i]), &red, &grn, &blu,
+			     colors) == 0)
+	    G_warning(_("No color value defined for category %d"), pval[i]);
+
+	sprintf(buf, "UPDATE %s SET %s='%d:%d:%d' WHERE %s=%d", fi->table,
+		   column_name, red, grn, blu, fi->key, pval[i]);
+	G_debug(3, "\tSQL: %s", buf);
+
+	db_set_string(&stmt, buf);
+	if (db_execute_immediate(driver, &stmt) != DB_OK)
+	    G_fatal_error(_("Unable to update RGB values"));
+    }
+    
+    db_commit_transaction(driver);
+    
+    db_close_database(driver);
+}