[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