Browse Source

vlib: Vect_write_ascii(): add feature type filter

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@48900 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 13 years ago
parent
commit
4d7c453a9d
2 changed files with 18 additions and 13 deletions
  1. 1 1
      include/vector.h
  2. 17 12
      lib/vector/Vlib/ascii.c

+ 1 - 1
include/vector.h

@@ -435,7 +435,7 @@ int Vect_spatial_index_select(const struct spatial_index *, const struct bound_b
 int Vect_read_ascii(FILE *, struct Map_info *);
 int Vect_read_ascii(FILE *, struct Map_info *);
 int Vect_read_ascii_head(FILE *, struct Map_info *);
 int Vect_read_ascii_head(FILE *, struct Map_info *);
 int Vect_write_ascii(FILE *, FILE *, struct Map_info *, int,
 int Vect_write_ascii(FILE *, FILE *, struct Map_info *, int,
-		     int, int, char *, int,
+		     int, int, char *, int, int,
 		     int, const struct cat_list *, const char*,
 		     int, const struct cat_list *, const char*,
 		     const char **, int);
 		     const char **, int);
 void Vect_write_ascii_head(FILE *, struct Map_info *);
 void Vect_write_ascii_head(FILE *, struct Map_info *);

+ 17 - 12
lib/vector/Vlib/ascii.c

@@ -287,6 +287,7 @@ int Vect_read_ascii_head(FILE *dascii, struct Map_info *Map)
   \param dp     number of significant digits
   \param dp     number of significant digits
   \param fs     field separator
   \param fs     field separator
   \param region_flag check region
   \param region_flag check region
+  \param type   feature type filter
   \param field  field number
   \param field  field number
   \param Clist  list of categories to filter features or NULL
   \param Clist  list of categories to filter features or NULL
   \param where  SQL select where statement to filter features or NULL
   \param where  SQL select where statement to filter features or NULL
@@ -298,11 +299,11 @@ int Vect_read_ascii_head(FILE *dascii, struct Map_info *Map)
 */
 */
 int Vect_write_ascii(FILE *ascii,
 int Vect_write_ascii(FILE *ascii,
 		     FILE *att, struct Map_info *Map, int ver,
 		     FILE *att, struct Map_info *Map, int ver,
-		     int format, int dp, char *fs, int region_flag,
+		     int format, int dp, char *fs, int region_flag, int type,
 		     int field, const struct cat_list *Clist, const char* where,
 		     int field, const struct cat_list *Clist, const char* where,
 		     const char **columns, int header)
 		     const char **columns, int header)
 {
 {
-    int type, ctype, i, cat, n_lines, line, left, right, found;
+    int ltype, ctype, i, cat, n_lines, line, left, right, found;
     double *xptr, *yptr, *zptr, x, y;
     double *xptr, *yptr, *zptr, x, y;
     static struct line_pnts *Points;
     static struct line_pnts *Points;
     struct line_cats *Cats, *ACats;
     struct line_cats *Cats, *ACats;
@@ -366,8 +367,8 @@ int Vect_write_ascii(FILE *ascii,
 
 
     line = 0;
     line = 0;
     while (TRUE) {
     while (TRUE) {
-	type = Vect_read_next_line(Map, Points, Cats);
-	if (type == -1 ) {      /* failure */
+	ltype = Vect_read_next_line(Map, Points, Cats);
+	if (ltype == -1 ) {      /* failure */
 	    if (columns) {
 	    if (columns) {
 		db_close_database(driver);
 		db_close_database(driver);
 		db_shutdown_driver(driver);
 		db_shutdown_driver(driver);
@@ -376,7 +377,7 @@ int Vect_write_ascii(FILE *ascii,
 	    return -1;
 	    return -1;
 	}
 	}
 
 
-	if (type == -2)	{	/* EOF */
+	if (ltype == -2)	{	/* EOF */
 	    if (columns) {
 	    if (columns) {
 		db_close_database(driver);
 		db_close_database(driver);
 		db_shutdown_driver(driver);
 		db_shutdown_driver(driver);
@@ -386,12 +387,16 @@ int Vect_write_ascii(FILE *ascii,
 
 
 	line++;
 	line++;
 
 
-	if (format == GV_ASCII_FORMAT_POINT && !(type & GV_POINTS))
+	if (!(ltype & type))
+	    continue;
+
+	if (format == GV_ASCII_FORMAT_POINT && !(ltype & GV_POINTS))
 	    continue;
 	    continue;
 
 
 	found = check_cat(Cats, Clist, cats, ncats);
 	found = check_cat(Cats, Clist, cats, ncats);
 
 
-	if (!found && type == GV_BOUNDARY && Vect_level(Map) > 1) {
+	if (!found && ltype == GV_BOUNDARY &&
+	    type & GV_AREA && Vect_level(Map) > 1) {
 	    Vect_get_line_areas(Map, line, &left, &right);
 	    Vect_get_line_areas(Map, line, &left, &right);
 	    if (left < 0)
 	    if (left < 0)
 		left = Vect_get_isle_area(Map, abs(left));
 		left = Vect_get_isle_area(Map, abs(left));
@@ -414,7 +419,7 @@ int Vect_write_ascii(FILE *ascii,
 	    Vect_cat_get(Cats, 1, &cat);
 	    Vect_cat_get(Cats, 1, &cat);
 	}
 	}
 
 
-	switch (type) {
+	switch (ltype) {
 	case GV_BOUNDARY:
 	case GV_BOUNDARY:
 	    if (ver == 5)
 	    if (ver == 5)
 		ctype = 'B';
 		ctype = 'B';
@@ -450,7 +455,7 @@ int Vect_write_ascii(FILE *ascii,
 	    break;
 	    break;
 	default:
 	default:
 	    ctype = 'X';
 	    ctype = 'X';
-	    G_warning(_("Unknown feature type %d"), (int)type);
+	    G_warning(_("Unknown feature type %d"), (int)ltype);
 	    break;
 	    break;
 	}
 	}
 
 
@@ -605,7 +610,7 @@ int Vect_write_ascii(FILE *ascii,
 	    }
 	    }
 	    else {
 	    else {
 		if (cat > 0) {
 		if (cat > 0) {
-		    if (type == GV_POINT) {
+		    if (ltype == GV_POINT) {
 			G_asprintf(&xstring, "%.*f", dp, Points->x[0]);
 			G_asprintf(&xstring, "%.*f", dp, Points->x[0]);
 			G_trim_decimal(xstring);
 			G_trim_decimal(xstring);
 			G_asprintf(&ystring, "%.*f", dp, Points->y[0]);
 			G_asprintf(&ystring, "%.*f", dp, Points->y[0]);
@@ -626,10 +631,10 @@ int Vect_write_ascii(FILE *ascii,
 	    }
 	    }
 	}
 	}
 	else if (format == GV_ASCII_FORMAT_WKT) {
 	else if (format == GV_ASCII_FORMAT_WKT) {
-	    if (type & (GV_BOUNDARY | GV_CENTROID | GV_FACE | GV_KERNEL))
+	    if (ltype & (GV_BOUNDARY | GV_CENTROID | GV_FACE | GV_KERNEL))
 		continue;
 		continue;
 	    /* Well-Known Text */
 	    /* Well-Known Text */
-	    Vect_sfa_line_astext(Points, type, Vect_is_3d(Map), dp, ascii);
+	    Vect_sfa_line_astext(Points, ltype, Vect_is_3d(Map), dp, ascii);
 	}
 	}
 	else {
 	else {
 	    G_fatal_error(_("Unknown format"));
 	    G_fatal_error(_("Unknown format"));