[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