|
@@ -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 @@ static void print_point(const struct line_pnts *, int, int, int, FILE *);
|
|
|
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 @@ int Vect_sfa_check_line_type(const struct line_pnts *Points, int type, int sftyp
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
- \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 @@ void Vect_sfa_write_line_wkt(const struct line_pnts *Points, int type, int with_
|
|
|
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,10 +177,33 @@ void Vect_sfa_write_line_wkt(const struct line_pnts *Points, int type, int with_
|
|
|
}
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/*!
|