[GRASS-SVN] r51175 - in grass/trunk/vector: v.external
v.external.out
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Mar 28 09:51:46 EDT 2012
Author: martinl
Date: 2012-03-28 06:51:46 -0700 (Wed, 28 Mar 2012)
New Revision: 51175
Modified:
grass/trunk/vector/v.external.out/args.c
grass/trunk/vector/v.external.out/link.c
grass/trunk/vector/v.external.out/list.c
grass/trunk/vector/v.external.out/main.c
grass/trunk/vector/v.external.out/v.external.out.html
grass/trunk/vector/v.external/Makefile
grass/trunk/vector/v.external/args.c
grass/trunk/vector/v.external/list.c
grass/trunk/vector/v.external/local_proto.h
grass/trunk/vector/v.external/main.c
grass/trunk/vector/v.external/v.external.html
Log:
v.external & v.external.out: consolidate user interface
replace extra flag (-p) by environmental variable
various minor updates
Modified: grass/trunk/vector/v.external/Makefile
===================================================================
--- grass/trunk/vector/v.external/Makefile 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/Makefile 2012-03-28 13:51:46 UTC (rev 51175)
@@ -11,5 +11,6 @@
include $(MODULE_TOPDIR)/include/Make/Module.make
+ifneq ($(filter 1,$(USE_OGR) $(USE_POSTGRES)),)
default: cmd
-
+endif
Modified: grass/trunk/vector/v.external/args.c
===================================================================
--- grass/trunk/vector/v.external/args.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/args.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -11,8 +11,7 @@
options->dsn = G_define_option();
options->dsn->key = "dsn";
options->dsn->type = TYPE_STRING;
- options->dsn->gisprompt = "old_file,file,dsn";
- options->dsn->label = _("Name of input OGR/PostGIS data source");
+ options->dsn->label = _("Name of input OGR or PostGIS data source");
options->dsn->description = _("Examples:\n"
"\t\tESRI Shapefile: directory containing a shapefile\n"
"\t\tMapInfo File: directory containing a mapinfo file\n"
@@ -38,31 +37,25 @@
flags->format = G_define_flag();
flags->format->key = 'f';
- flags->format->description = _("List supported OGR formats and exit");
+ flags->format->description = _("List supported formats and exit");
flags->format->guisection = _("Print");
flags->format->suppress_required = YES;
flags->list = G_define_flag();
flags->list->key = 'l';
- flags->list->description = _("List available OGR layers in data source and exit");
+ flags->list->description = _("List available layers in data source and exit");
flags->list->guisection = _("Print");
flags->list->suppress_required = YES;
flags->tlist = G_define_flag();
flags->tlist->key = 't';
- flags->tlist->description = _("List available OGR layers including feature types "
- "in datatsource and exit");
+ flags->tlist->description = _("List available layers including feature type "
+ "in data source and exit");
flags->tlist->guisection = _("Print");
flags->tlist->suppress_required = YES;
- flags->topo = G_define_flag();
- flags->topo->key = 'b';
- flags->topo->description = _("Do not build topology");
+ flags->topo = G_define_standard_flag(G_FLG_V_TOPO);
- flags->postgis = G_define_flag();
- flags->postgis->key = 'p';
- flags->postgis->description = _("Link PostGIS tables directly instead of using OGR");
-
if (G_parser(argc, argv))
exit(EXIT_FAILURE);
}
Modified: grass/trunk/vector/v.external/list.c
===================================================================
--- grass/trunk/vector/v.external/list.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/list.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -13,31 +13,97 @@
#endif
#include "local_proto.h"
+static int cmp(const void *, const void *);
+static char **format_list(int *, size_t *);
+static char *feature_type(const char *);
#ifdef HAVE_OGR
static int list_layers_ogr(FILE *, const char *, const char *, int, int *);
-#endif
+#endif /* HAVE_OGR */
#ifdef HAVE_POSTGRES
static int list_layers_pg(FILE *, const char *, const char *, int, int *);
-#endif
+#endif /* HAVE_POSTGRES */
-void list_formats(FILE *fd) {
+int cmp(const void *a, const void *b)
+{
+ return strcmp(*(char **)a, *(char **)b);
+}
+
+char **format_list(int *count, size_t *len)
+{
+ int i;
+ char **list;
+
+ list = NULL;
+ *count = 0;
+ if (len)
+ *len = 0;
+
#ifdef HAVE_OGR
- int i;
+ char buf[2000];
+
OGRSFDriverH Ogr_driver;
- G_message(_("List of supported OGR formats:"));
+ /* Open OGR DSN */
+ OGRRegisterAll();
+ G_debug(2, "driver count = %d", OGRGetDriverCount());
for (i = 0; i < OGRGetDriverCount(); i++) {
Ogr_driver = OGRGetDriver(i);
- fprintf(fd, "%s\n", OGR_Dr_GetName(Ogr_driver));
+ G_debug(2, "driver %d/%d : %s", i, OGRGetDriverCount(),
+ OGR_Dr_GetName(Ogr_driver));
+
+ list = G_realloc(list, ((*count) + 1) * sizeof(char *));
+
+ /* chg white space to underscore in OGR driver names */
+ sprintf(buf, "%s", OGR_Dr_GetName(Ogr_driver));
+ G_strchg(buf, ' ', '_');
+ list[(*count)++] = G_store(buf);
+ if (len)
+ *len += strlen(buf) + 1; /* + ',' */
}
-#else
- G_fatal_error(_("GRASS is not compiled with OGR support"));
+
+ /* order formats by name */
+ qsort(list, *count, sizeof(char *), cmp);
#endif
+#if defined HAVE_POSTGRES && !defined HAVE_OGR
+ list = G_realloc(list, ((*count) + 1) * sizeof(char *));
+ list[(*count)++] = G_store("PostgreSQL");
+ if (len)
+ *len += strlen("PostgreSQL") + 1;
+#endif
+
+ return list;
}
-int list_layers(FILE *fd, const char *dsn, const char *layer, int print_types, int use_postgis, int *is3D)
+char *feature_type(const char *ftype)
{
- if (use_postgis) {
+ char *ftype_ret;
+
+ ftype_ret = G_str_replace(ftype, " ", "");
+ G_str_to_lower(ftype_ret);
+
+ /* let's OS to release the memory */
+ return ftype_ret;
+}
+
+void list_formats(void)
+{
+ int i, count;
+ char **list;
+
+ G_message(_("List of supported formats:"));
+
+ list = format_list(&count, NULL);
+
+ for (i = 0; i < count; i++)
+ fprintf(stdout, "%s\n", list[i]);
+ fflush(stdout);
+
+ G_free(list);
+}
+
+int list_layers(FILE *fd, const char *dsn, const char *layer, int print_types, int use_ogr, int *is3D)
+{
+ if (!use_ogr) {
#ifdef HAVE_POSTGRES
return list_layers_pg(fd, dsn, layer, print_types, is3D);
#else
@@ -74,9 +140,11 @@
#ifdef HAVE_POSTGRES
int list_layers_pg(FILE *fd, const char *conninfo, const char *table, int print_types, int *is3D)
{
- int row, ntables, ret, print_schema;
- char *value, *schema_name, *table_name;
- PGconn *conn;
+ int row, ntables, ret, print_schema;
+ char *value_schema, *value_table;
+ char *schema_name, *table_name;
+
+ PGconn *conn;
PGresult *res;
dbString sql;
@@ -114,8 +182,8 @@
print_schema = FALSE;
if (fd) {
for (row = 0; row < ntables; row++) {
- value = PQgetvalue(res, row, 0);
- if (strcmp(value, "public") != 0) {
+ value_schema = PQgetvalue(res, row, 0);
+ if (G_strcasecmp(value_schema, "public") != 0) {
print_schema = TRUE;
break;
}
@@ -123,25 +191,27 @@
}
/* report layers */
- for (row = 0; row < ntables; row++) {
- value = PQgetvalue(res, row, 1);
+ for (row = 0; row < ntables; row++) {
+ value_schema = PQgetvalue(res, row, 0);
+ value_table = PQgetvalue(res, row, 1);
if (fd) {
if (print_types) {
- if (print_schema)
+ if (print_schema && G_strcasecmp(value_schema, "public") != 0)
fprintf(fd, "%s.%s (%s)\n",
- PQgetvalue(res, row, 0), value,
- PQgetvalue(res, row, 2));
+ value_schema, value_table,
+ feature_type(PQgetvalue(res, row, 2)));
else
- fprintf(fd, "%s (%s)\n", value, PQgetvalue(res, row, 2));
+ fprintf(fd, "%s (%s)\n", value_table,
+ feature_type(PQgetvalue(res, row, 2)));
}
else {
- if (print_schema)
- fprintf(fd, "%s.%s\n", PQgetvalue(res, row, 0), value);
+ if (print_schema && G_strcasecmp(value_schema, "public") != 0)
+ fprintf(fd, "%s.%s\n", value_schema, value_table);
else
- fprintf(fd, "%s\n", value);
+ fprintf(fd, "%s\n", value_table);
}
}
- if (table_name && strcmp(value, table_name) == 0) {
+ if (table_name && strcmp(value_table, table_name) == 0) {
ret = row;
*is3D = WITHOUT_Z;
}
@@ -196,7 +266,8 @@
if (fd) {
if (print_types)
- fprintf(fd, "%s (%s)\n", layer_name, OGRGeometryTypeToName(Ogr_geom_type));
+ fprintf(fd, "%s (%s)\n", layer_name,
+ feature_type(OGRGeometryTypeToName(Ogr_geom_type)));
else
fprintf(fd, "%s\n", layer_name);
}
Modified: grass/trunk/vector/v.external/local_proto.h
===================================================================
--- grass/trunk/vector/v.external/local_proto.h 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/local_proto.h 2012-03-28 13:51:46 UTC (rev 51175)
@@ -6,7 +6,7 @@
};
struct _flags {
- struct Flag *format, *layer, *tlist, *topo, *postgis, *list;
+ struct Flag *format, *layer, *tlist, *topo, *list;
};
/* args.c */
@@ -14,7 +14,7 @@
struct _options *, struct _flags*);
/* list.c */
-void list_formats(FILE *);
+void list_formats();
int list_layers(FILE *, const char *, const char *, int, int, int *);
void get_table_name(const char *, char **, char **);
Modified: grass/trunk/vector/v.external/main.c
===================================================================
--- grass/trunk/vector/v.external/main.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/main.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -38,7 +38,7 @@
FILE *fd;
- int ilayer, is3D;
+ int ilayer, is3D, use_ogr;
char buf[GPATH_MAX], *dsn;
const char *output;
@@ -49,41 +49,65 @@
G_add_keyword(_("import"));
G_add_keyword(_("input"));
G_add_keyword(_("external"));
-
+ G_add_keyword("OGR");
+ G_add_keyword("PostGIS");
module->description = _("Creates a new pseudo-vector map as a link to an OGR-supported layer "
"or a PostGIS feature table.");
parse_args(argc, argv,
&options, &flags);
+
+ use_ogr = TRUE;
+ if(options.dsn->answer &&
+ G_strncasecmp(options.dsn->answer, "PG:", 3) == 0) {
+ /* -> PostgreSQL */
+#if defined HAVE_OGR && defined HAVE_POSTGRES
+ if (getenv("GRASS_VECTOR_OGR"))
+ use_ogr = TRUE;
+ else
+ use_ogr = FALSE;
+#else
+#ifdef HAVE_POSTGRES
+ if (getenv("GRASS_VECTOR_OGR"))
+ G_warning(_("Environment variable GRASS_VECTOR_OGR defined, "
+ "but GRASS is compiled with OGR support. "
+ "Using GRASS-PostGIS data driver instead."));
+ use_ogr = FALSE;
+#else /* -> force using OGR */
+ G_warning(_("GRASS is not compiled with PostgreSQL support. "
+ "Using OGR-PostgreSQL driver instead of native "
+ "GRASS-PostGIS data driver."));
+ use_ogr = TRUE;
+#endif /* HAVE_POSTRES */
+#endif /* HAVE_OGR && HAVE_POSTGRES */
+ }
#ifdef HAVE_OGR
- if (!flags.postgis->answer)
+ if (use_ogr)
OGRRegisterAll();
#endif
if (flags.format->answer) {
/* list formats */
- if (flags.postgis->answer) {
- G_fatal_error(_("Flags -%c and -%c are mutually exclusive"),
- flags.format->key, flags.postgis->key);
- }
list_formats(stdout);
exit(EXIT_SUCCESS);
}
/* be friendly, ignored 'PG:' prefix for PostGIS links */
- if (flags.postgis->answer &&
- G_strncasecmp(options.dsn->answer, "PG:", 3) == 0) {
- int i, length;
-
- length = strlen(options.dsn->answer);
- dsn = (char *) G_malloc(length - 3);
- for (i = 3; i < length; i++)
- dsn[i-3] = options.dsn->answer[i];
- dsn[length-3] = '\0';
+ dsn = NULL;
+ if (options.dsn->answer) {
+ if (!use_ogr) {
+ int i, length;
+
+ length = strlen(options.dsn->answer);
+ dsn = (char *) G_malloc(length - 3);
+ for (i = 3; i < length; i++)
+ dsn[i-3] = options.dsn->answer[i];
+ dsn[length-3] = '\0';
+ }
+ else {
+ dsn = G_store(options.dsn->answer);
+ }
}
- else {
- dsn = G_store(options.dsn->answer);
- }
if (flags.list->answer || flags.tlist->answer) {
/* list layers */
@@ -91,8 +115,7 @@
G_fatal_error(_("Required parameter <%s> not set"), options.dsn->key);
list_layers(stdout, dsn, NULL,
flags.tlist->answer ? TRUE : FALSE,
- flags.postgis->answer,
- NULL);
+ use_ogr, NULL);
exit(EXIT_SUCCESS);
}
@@ -105,7 +128,7 @@
/* get layer index */
ilayer = list_layers(NULL, dsn, options.layer->answer,
- FALSE, flags.postgis->answer, &is3D);
+ FALSE, use_ogr, &is3D);
if (ilayer == -1) {
G_fatal_error(_("Layer <%s> not available"), options.layer->answer);
}
@@ -142,7 +165,7 @@
G_fatal_error("Unable to create file '%s'", buf);
}
- if (flags.postgis->answer) {
+ if (!use_ogr) {
char *table_name, *schema_name;
get_table_name(options.layer->answer, &table_name, &schema_name);
Modified: grass/trunk/vector/v.external/v.external.html
===================================================================
--- grass/trunk/vector/v.external/v.external.html 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external/v.external.html 2012-03-28 13:51:46 UTC (rev 51175)
@@ -1,80 +1,88 @@
<h2>DESCRIPTION</h2>
-<em>v.external</em> creates new vector as a link to external
-<a href="http://www.gdal.org/ogr/">OGR</a> layer (read only).
-OGR (Simple Features Library) is part of the
-<a href="http://www.gdal.org">GDAL</a> library, so you need to
-install GDAL to use <em>v.external</em> and external OGR layers.
+<em>v.external</em> creates new vector map as a link to external OGR
+layer or PostGIS feature table. OGR (Simple Features Library) is part
+of the
+<a href="http://www.gdal.org">GDAL</a> library, so you need to install
+GDAL to use <em>v.external</em> for external OGR layers. Note that a
+PostGIS feature table can be linked also using built-in <em>GRASS-PostGIS
+data driver</em> (requires GRASS to be built with PostgreSQL support).
-<h3>Supported OGR Vector Formats</h3>
+<h3>Supported OGR vector formats</h3>
-<ul>
- <li><a href="http://www.gdal.org/ogr/drv_shapefile.html">ESRI
- Shapefile</a>
- <li><a href="http://www.gdal.org/ogr/drv_mitab.html">Mapinfo File</a>
-</ul>
+To list supported OGR formats, type
-Further available drivers such as UK .NTF, SDTS, TIGER, IHO S-57
-(ENC), DGN, GML, AVCBin, REC, Memory, OGDI, and PostgreSQL depend on
-the local installation (OGR library), for details see
+<div class="code"><pre>
+v.external -f
+</pre></div>
+
+For details see
<a href="http://www.gdal.org/ogr/ogr_formats.html">OGR web site</a>.
<h2>EXAMPLES</h2>
-<b>SHAPE files</b>
+<h3>ESRI Shapefile</h3>
+Assuming that 'test_shape.shp' is located in directory
+'/home/user/shape_data'.
+
<div class="code"><pre>
v.external dsn=/home/user/shape_data layer=test_shape output=grass_map
</pre></div>
-<b>MapInfo files</b>
+<h3>MapInfo files</h3>
<div class="code"><pre>
v.external dsn=./ layer=mapinfo_test output=grass_map
</pre></div>
-<b>SDTS files</b> (you have to select the CATD file)
+<h3>SDTS files</h3>
+Note: you have to select the CATD file
+
<div class="code"><pre>
v.external dsn=CITXCATD.DDF output=cities
</pre></div>
-<b>TIGER files</b>
+<h3>TIGER files</h3>
<div class="code"><pre>
v.external dsn=input/2000/56015/ layer=CompleteChain,PIP output=t56015_all
</pre></div>
-<b>PostGIS layers</b> (area example)
+<h3>PostGIS layers</h3>
+PostGIS links are by default created by built-in PostGIS support,
+ie. using <em>GRASS-PostGIS data driver</em>. If the environment
+variable <tt>GRASS_VECTOR_OGR</tt> exists, or GRASS is compiled
+without PostgreSQL support then GRASS will use OGR-PostgreSQL driver
+for creating a link.
+
<div class="code"><pre>
-v.external dsn="PG:host=localhost user=postgres dbname=postgis" layer=polymap \
-output=polygons
+v.external dsn="PG:host=localhost user=postgres dbname=postgis" layer=polymap
</pre></div>
<h2>NOTES</h2>
-The simple feature data model used by OGR is very different from the
-topological format used by GRASS. Instead of true topology, so called
-'pseudo topology' is created for data linked by v.external. User
-should learn the difference between those to formats, because some
-modules working correctly with GRASS native data, can produce wrong
-results with input layers created by <em>v.external</em>.
+The simple feature data model used by OGR (or PostGIS) is very
+different from the topological format used by GRASS. Instead of true
+topology, so called 'pseudo topology' is created for data linked by
+<em>v.external</em>. User should learn the difference between those
+two formats, because some modules working correctly with GRASS native
+data, can produce wrong results with input vector maps created
+by <em>v.external</em>.
<p>See <em><a href="v.db.connect.html">v.db.connect</a></em> for an example of
maintaining attributes in external DBMS in also writable mode.
<h2>REFERENCES</h2>
-<a href="http://www.gdal.org/ogr/">OGR vector library</a>
-<br>
-<a href="http://www.gdal.org/ogr/ogr__api_8h.html">OGR vector library C API</a>
-documentation
+<a href="http://www.gdal.org/ogr/ogr__api_8h.html">OGR vector library C API</a> documentation
-
<h2>SEE ALSO</h2>
<em>
+ <a href="v.external.out.html">v.external.out</a>,
<a href="v.clean.html">v.clean</a>,
<a href="v.db.connect.html">v.db.connect</a>,
<a href="v.in.db.html">v.in.db</a>,
@@ -82,8 +90,20 @@
<a href="v.out.ogr.html">v.out.ogr</a>
</em>
+<p>
+<a href="http://www.gdal.org/ogr/">OGR Library</a>
+<br>
+<a href="http://postgis.org/">PostGIS</a>
+
+<p>
+See
+also GRASS <a href="http://grass.osgeo.org/wiki/Working_with_external_data_in_GRASS_7">user wiki page</a> for more examples.
+
<h2>AUTHOR</h2>
Radim Blazek, ITC-Irst, Trento, Italy
+<br>
+PostGIS support by Martin Landa, Czech Technical University in Prague, Czech Republic
-<p><i>Last changed: $Date$</i>
+<p>
+<i>Last changed: $Date$</i>
Modified: grass/trunk/vector/v.external.out/args.c
===================================================================
--- grass/trunk/vector/v.external.out/args.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external.out/args.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -10,15 +10,15 @@
{
options->dsn = G_define_option();
options->dsn->key = "dsn";
- options->dsn->label = _("Name for output OGR/PostGIS data source");
+ options->dsn->type = TYPE_STRING;
+ options->dsn->label = _("Name of input OGR or PostGIS data source");
options->dsn->description = _("Examples:\n"
"\t\tESRI Shapefile: directory containing a shapefile\n"
"\t\tMapInfo File: directory containing a mapinfo file\n"
- "\t\tPostGIS: connection string, eg. 'PG:dbname=gisdb user=grass'");
-
+ "\t\tPostGIS database: connection string, eg. 'PG:dbname=db user=grass'");
options->dsn->required = YES;
- options->dsn->type = TYPE_STRING;
+
options->format = G_define_option();
options->format->key = "format";
options->format->description = _("Format for output vector data");
Modified: grass/trunk/vector/v.external.out/link.c
===================================================================
--- grass/trunk/vector/v.external.out/link.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external.out/link.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -50,8 +50,7 @@
use_ogr = TRUE;
filename = "OGR";
G_remove("", "PG");
-#endif /* HAVE_POSTRESQL */
-
+#endif /* HAVE_POSTRES */
#endif /* HAVE_OGR && HAVE_POSTGRES */
} /* format=PostgreSQL */
else {
Modified: grass/trunk/vector/v.external.out/list.c
===================================================================
--- grass/trunk/vector/v.external.out/list.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external.out/list.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -5,14 +5,17 @@
#ifdef HAVE_OGR
#include "ogr_api.h"
+#endif /* HAVE_OGR */
-static int cmp(const void *a, const void *b)
+static int cmp(const void *, const void *);
+static char **format_list(int *, size_t *);
+
+int cmp(const void *a, const void *b)
{
- return (strcmp(*(char **)a, *(char **)b));
+ return strcmp(*(char **)a, *(char **)b);
}
-#endif /* HAVE_OGR */
-static char **format_list(int *count, size_t *len)
+char **format_list(int *count, size_t *len)
{
int i;
char **list;
Modified: grass/trunk/vector/v.external.out/main.c
===================================================================
--- grass/trunk/vector/v.external.out/main.c 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external.out/main.c 2012-03-28 13:51:46 UTC (rev 51175)
@@ -43,8 +43,8 @@
G_add_keyword(_("export"));
G_add_keyword(_("output"));
G_add_keyword(_("external"));
- G_add_keyword(_("OGR"));
- G_add_keyword(_("PostGIS"));
+ G_add_keyword("OGR");
+ G_add_keyword("PostGIS");
module->description = _("Defines vector output format.");
#ifdef HAVE_OGR
Modified: grass/trunk/vector/v.external.out/v.external.out.html
===================================================================
--- grass/trunk/vector/v.external.out/v.external.out.html 2012-03-28 13:20:19 UTC (rev 51174)
+++ grass/trunk/vector/v.external.out/v.external.out.html 2012-03-28 13:51:46 UTC (rev 51175)
@@ -1,9 +1,9 @@
<h2>DESCRIPTION</h2>
<em>v.external.out</em> instructs GRASS to write vector maps in
-external data format (e.g. ESRI Shapefile) using <b>OGR
-library</b>. PostGIS data can be also written by native <b>GRASS-PostGIS
-data driver</b>.
+external data format (e.g. ESRI Shapefile) using <em>OGR
+library</em>. PostGIS data can be also written by
+built-in <em>GRASS-PostGIS data driver</em>.
<h2>EXAMPLES</h2>
@@ -62,20 +62,22 @@
v.external.out -r
</pre></div>
+<h2>REFERENCES</h2>
+
+<a href="http://www.gdal.org/ogr/ogr__api_8h.html">OGR vector library C API</a> documentation
+
<h2>SEE ALSO</h2>
<em>
+ <a href="v.external.html">v.external</a>,
<a href="v.in.ogr.html">v.in.ogr</a>,
- <a href="v.out.ogr.html">v.out.ogr</a>,
- <a href="v.external.html">v.external</a>
+ <a href="v.out.ogr.html">v.out.ogr</a>
</em>
-<h2>REFERENCES</h2>
-
-<a href="http://www.gdal.org/ogr/">OGR vector library</a>
+<p>
+<a href="http://www.gdal.org/ogr/">OGR Library</a>
<br>
-<a href="http://www.gdal.org/ogr/ogr__api_8h.html">OGR vector library C API</a>
-documentation
+<a href="http://postgis.org/">PostGIS</a>
<p>
See
More information about the grass-commit
mailing list