[GRASS-SVN] r39394 - in grass/trunk: include lib/vector/Vlib

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Oct 4 10:36:17 EDT 2009


Author: martinl
Date: 2009-10-04 10:36:17 -0400 (Sun, 04 Oct 2009)
New Revision: 39394

Modified:
   grass/trunk/include/vector.h
   grass/trunk/lib/vector/Vlib/ascii.c
   grass/trunk/lib/vector/Vlib/simple_features.c
Log:
Simple Features API: Vect_sfa_write_line_wkt() -> Vect_sfa_line_astext()
       * various minor changes


Modified: grass/trunk/include/vector.h
===================================================================
--- grass/trunk/include/vector.h	2009-10-04 11:32:38 UTC (rev 39393)
+++ grass/trunk/include/vector.h	2009-10-04 14:36:17 UTC (rev 39394)
@@ -416,10 +416,13 @@
 void Vect_write_ascii_head(FILE *, struct Map_info *);
 
 /* Simple Features */
-void Vect_sfa_write_line_wkt(const struct line_pnts *, int, int, int, FILE *);
+int Vect_sfa_get_line_type(const struct line_pnts *, int, int);
 int Vect_sfa_check_line_type(const struct line_pnts *, int, int, int);
-int Vect_sfa_get_line_type(const struct line_pnts *, int, int);
-int Vect_sfa_is_line_closed(const struct line_pnts *, int, int);
+int Vect_sfa_line_dimension(int);
+char *Vect_sfa_line_geometry_type(const struct line_pnts *, int);
+int Vect_sfa_line_astext(const struct line_pnts *, int, int, int, FILE *);
+int Vect_sfa_is_line_is_simple(const struct line_pnts *, int, int);
+int Vect_sfa_is_line_is_closed(const struct line_pnts *, int, int);
 
 /*
  * Internal functions, MUST NOT be used in modules

Modified: grass/trunk/lib/vector/Vlib/ascii.c
===================================================================
--- grass/trunk/lib/vector/Vlib/ascii.c	2009-10-04 11:32:38 UTC (rev 39393)
+++ grass/trunk/lib/vector/Vlib/ascii.c	2009-10-04 14:36:17 UTC (rev 39394)
@@ -563,7 +563,7 @@
 	    if (type & (GV_BOUNDARY | GV_CENTROID | GV_FACE | GV_KERNEL))
 		continue;
 	    /* Well-Known Text */
-	    Vect_sfa_write_line_wkt(Points, type, Vect_is_3d(Map), dp, ascii);
+	    Vect_sfa_line_astext(Points, type, Vect_is_3d(Map), dp, ascii);
 	}
 	else {
 	    G_fatal_error(_("Unknown format"));
@@ -593,7 +593,7 @@
 	    }
 	    fprintf(ascii, "POLYGON(");
 	    /* write outter ring */
-	    Vect_sfa_write_line_wkt(Points, GV_BOUNDARY, 0, dp, ascii); /* boundary is always 2D */
+	    Vect_sfa_line_astext(Points, GV_BOUNDARY, 0, dp, ascii); /* boundary is always 2D */
 	    /* get isles (holes) -> inner rings */
 	    nisles = Vect_get_area_num_isles(Map, area);
 	    for (i = 0; i < nisles; i++) {
@@ -605,7 +605,7 @@
 		}
 		fprintf(ascii, ", ");
 		/* write inner ring */
-		Vect_sfa_write_line_wkt(Points, GV_BOUNDARY, 0, dp, ascii); /* boundary is always 2D */
+		Vect_sfa_line_astext(Points, GV_BOUNDARY, 0, dp, ascii); /* boundary is always 2D */
 	    }
 	    fprintf(ascii, ")\n");
 	}

Modified: grass/trunk/lib/vector/Vlib/simple_features.c
===================================================================
--- grass/trunk/lib/vector/Vlib/simple_features.c	2009-10-04 11:32:38 UTC (rev 39393)
+++ grass/trunk/lib/vector/Vlib/simple_features.c	2009-10-04 14:36:17 UTC (rev 39394)
@@ -3,10 +3,22 @@
  
   \brief Vector library - OGC Simple Features Access
 
-  Note: In progress. Currently on GV_POINT, GV_LINE are supported.
+  Note: In progress! Currently on GV_POINT, GV_LINE, GV_AREA are supported.
   
   Higher level functions for reading/writing/manipulating vectors.
-  
+
+  \todo
+   - Vect_sfa_line_is_simple()
+   - Vect_sfa_line_srid()
+   - Vect_sfa_line_envelope()
+   - Vect_sfa_line_asbinary()
+   - Vect_sfa_line_is_empty()
+   - Vect_sfa_line_is_3d()
+   - Vect_sfa_line_is_measured()
+   - Vect_sfa_line_boundary()
+
+  Reference: http://www.opengeospatial.org/standards/sfa
+
   (C) 2009 by the GRASS Development Team
   
   This program is free software under the GNU General Public License
@@ -30,7 +42,8 @@
   List of supported feature types:
    - GV_POINT    -> SF_POINT
    - GV_LINE     -> SF_LINE / SF_LINESTRING / SF_LINEARRING
-  
+   - GV_AREA     -> SF_POLYGON
+
   \param Points  pointer to line_pnts structure
   \param type    feature type (GV_POINT, GV_LINE, ...)
   \param with_z  non-zero value for 3D data
@@ -64,28 +77,79 @@
 }
 
 /*!
-  \brief Print feature in Well-Known Text format
+  \brief Get geometry dimension
 
+  \param Points pointer to line_pnts structure
+  \param type   feature type (GV_POINT, GV_LINE, ...)
+
+  \return 0
+  \return 1
+  \return 2
+  \return -1 unsupported feature type
+*/
+int Vect_sfa_line_dimension(int type)
+{
+    if (type == GV_POINT)
+	return 0;
+    if (type == GV_LINE)
+	return 1;
+    if (type == GV_AREA)
+	return 2;
+
+    return -1;
+}
+
+/*!
+  \brief Get geometry type (string)
+
+  \param Points pointer to line_pnts structure
+  \param type   feature type (GV_POINT, GV_LINE, ...)
+
+  \return geometry type string
+  \return NULL unsupported feature type
+*/
+char *Vect_sfa_line_geometry_type(const struct line_pnts *Points, int type)
+{
+    int sftype = Vect_sfa_get_line_type(Points, type, 0);
+
+    if (sftype == SF_POINT)
+	return G_store("POINT");
+    if (sftype == SF_LINESTRING)
+	return G_store("LINESTRING");
+    if (sftype == SF_LINE)
+	return G_store("LINE");
+    if (sftype == SF_LINEARRING)
+	return G_store("LINEARRING");
+
+    return NULL;
+}
+
+/*!
+  \brief Export geometry to Well-Known Text
+  
   \param Points    pointer to line_pnts structure
   \param type      feature type
   \param with_z    non-zero value for 3D data
   \param precision floating number precision 
   \param[out] file file where to write the output
+
+  \return 0 on success
+  \return -1 unsupported feature type
 */
-void Vect_sfa_write_line_wkt(const struct line_pnts *Points, int type, int with_z, int precision, FILE *file)
+int Vect_sfa_line_astext(const struct line_pnts *Points, int type, int with_z, int precision, FILE *file)
 {
     int i, sftype;
     
     sftype = Vect_sfa_get_line_type(Points, type, with_z);
     
     switch(sftype) {
-    case SF_POINT: {
+    case SF_POINT: { /* point */
 	fprintf(file, "POINT(");
 	print_point(Points, 0, with_z, precision, file);
 	fprintf(file, ")\n");
 	break;
     }
-    case SF_LINESTRING: case SF_LINE: case SF_LINEARRING: {
+    case SF_LINESTRING: case SF_LINE: case SF_LINEARRING: /* line */ {
 	if (sftype == SF_LINESTRING)
 	    fprintf(file, "LINESTRING(");
 	else if (sftype ==  SF_LINE)
@@ -100,7 +164,7 @@
 	fprintf(file, ")\n");
 	break;
     }
-    case SF_POLYGON: {
+    case SF_POLYGON: /* polygon */ {
 	/* write only outter/inner ring */
 	fprintf(file, "(");
 	for (i = 0; i < Points->n_points; i++) {
@@ -113,13 +177,36 @@
     }
     default: {
 	G_warning(_("Unknown Simple Features type (%d)"), sftype);
-	break;
+	return -1;
     }
     }
+    
     fflush(file);
+    return 0;
 }
 
 /*!
+  \brief Check if feature is simple
+
+  \param Points pointer to line_pnts structure
+  \param type   feature type (GV_POINT, GV_LINE, ...)
+  
+  \return 1  feature simple
+  \return 0  feature not simple
+  \return -1 feature type not supported (GV_POINT, GV_CENTROID, ...)
+*/
+int Vect_sfa_is_line_is_simple(const struct line_pnts *Points, int type, int with_z)
+{
+    int sftype;
+    
+    sftype = Vect_sfa_get_line_type(Points, type, with_z);
+
+    /* TODO */
+
+    return 0;
+}
+
+/*!
   \brief Check if feature is closed
 
   \param Points pointer to line_pnts structure



More information about the grass-commit mailing list