[GRASS-SVN] r60356 - grass/trunk/vector/v.db.select
svn_grass at osgeo.org
svn_grass at osgeo.org
Mon May 19 19:51:45 PDT 2014
Author: hcho
Date: 2014-05-19 19:51:45 -0700 (Mon, 19 May 2014)
New Revision: 60356
Modified:
grass/trunk/vector/v.db.select/main.c
Log:
v.db.select: -f flag added to skip attributes not linked to features
Modified: grass/trunk/vector/v.db.select/main.c
===================================================================
--- grass/trunk/vector/v.db.select/main.c 2014-05-20 01:18:26 UTC (rev 60355)
+++ grass/trunk/vector/v.db.select/main.c 2014-05-20 02:51:45 UTC (rev 60356)
@@ -5,10 +5,11 @@
*
* AUTHOR(S): Radim Blazek
* OGR support by Martin Landa <landa.martin gmail.com>
+ * -f flag by Huidae Cho <grass4u gmail.com>
*
* PURPOSE: Print vector attributes
*
- * COPYRIGHT: (C) 2005-2009, 2011-2012 by the GRASS Development Team
+ * COPYRIGHT: (C) 2005-2009, 2011-2014 by the GRASS Development Team
*
* This program is free software under the GNU General
* Public License (>=v2). Read the file COPYING that
@@ -32,7 +33,7 @@
struct GModule *module;
struct Option *map_opt, *field_opt, *fs_opt, *vs_opt, *nv_opt, *col_opt,
*where_opt, *file_opt;
- struct Flag *c_flag, *v_flag, *r_flag;
+ struct Flag *c_flag, *v_flag, *r_flag, *f_flag;
dbDriver *driver;
dbString sql, value_string;
dbCursor cursor;
@@ -46,7 +47,7 @@
struct ilist *list_lines;
char *fs, *vs;
struct bound_box *min_box, *line_box;
- int i, line, area, init_box, cat;
+ int i, line, area, init_box, cat, field_number;
module = G_define_module();
G_add_keyword(_("vector"));
@@ -103,6 +104,11 @@
v_flag->description = _("Vertical output (instead of horizontal)");
v_flag->guisection = _("Format");
+ f_flag = G_define_flag();
+ f_flag->key = 'f';
+ f_flag->description = _("Exclude attributes not linked to features");
+ f_flag->guisection = _("Selection");
+
G_gisinit(argv[0]);
if (G_parser(argc, argv))
@@ -115,18 +121,19 @@
}
}
+ min_box = line_box = NULL;
+ list_lines = NULL;
+
if (r_flag->answer) {
min_box = (struct bound_box *) G_malloc(sizeof(struct bound_box));
G_zero((void *)min_box, sizeof(struct bound_box));
line_box = (struct bound_box *) G_malloc(sizeof(struct bound_box));
- list_lines = Vect_new_list();
}
- else {
- min_box = line_box = NULL;
- list_lines = NULL;
- }
+ if (r_flag->answer || f_flag->answer)
+ list_lines = Vect_new_list();
+
/* the field separator */
fs = G_option_to_separator(fs_opt);
if (vs_opt->answer)
@@ -138,16 +145,20 @@
db_init_string(&value_string);
/* open input vector */
- if (!r_flag->answer) {
- if (Vect_open_old_head2(&Map, map_opt->answer, "", field_opt->answer) < 0)
- G_fatal_error(_("Unable to open vector map <%s>"), map_opt->answer);
- } else {
+ if (r_flag->answer || f_flag->answer) {
if (2 > Vect_open_old2(&Map, map_opt->answer, "", field_opt->answer)) {
Vect_close(&Map);
G_fatal_error(_("Unable to open vector map <%s> at topology level. "
"Flag '%c' requires topology level."),
map_opt->answer, r_flag->key);
}
+ field_number = Vect_get_field_number(&Map, field_opt->answer);
+ } else {
+ if (Vect_open_old_head2(&Map, map_opt->answer, "", field_opt->answer) < 0)
+ G_fatal_error(_("Unable to open vector map <%s>"), map_opt->answer);
+ /* field_number won't be used, but is initialized to suppress compiler
+ * warnings. */
+ field_number = -1;
}
if ((Fi = Vect_get_field2(&Map, field_opt->answer)) == NULL)
@@ -219,6 +230,14 @@
if (r_flag->answer)
continue;
+ if (f_flag->answer) {
+ Vect_cidx_find_all(&Map, field_number, -1, cat, list_lines);
+ /* if no features are found for this category, don't print
+ * anything. */
+ if (list_lines->n_values == 0)
+ break;
+ }
+
db_convert_column_value_to_string(column, &value_string);
if (!c_flag->answer && v_flag->answer)
@@ -236,9 +255,12 @@
fprintf(stdout, "\n");
}
+ if (f_flag->answer && col < ncols)
+ continue;
+
if (r_flag->answer) {
/* get minimal region extent */
- Vect_cidx_find_all(&Map, Vect_get_field_number(&Map, field_opt->answer), -1, cat, list_lines);
+ Vect_cidx_find_all(&Map, field_number, -1, cat, list_lines);
for (i = 0; i < list_lines->n_values; i++) {
line = list_lines->value[i];
if (Vect_get_line_type(&Map, line) == GV_CENTROID) {
More information about the grass-commit
mailing list