Browse Source

minor backports from trunk

git-svn-id: https://svn.osgeo.org/grass/grass/branches/releasebranch_7_0@64018 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Neteler 10 năm trước cách đây
mục cha
commit
44872413bf

+ 2 - 2
lib/cairodriver/raster.c

@@ -96,7 +96,7 @@ void Cairo_begin_raster(int mask, int s[2][2], double d[2][2])
     dst_w = dst_r - dst_l;
     dst_w = dst_r - dst_l;
     dst_h = dst_b - dst_t;
     dst_h = dst_b - dst_t;
 
 
-    G_debug(1, "Cairo_begin_raster(): masked=%d, src_lrtb=%d %d %d %d -> w/h=%d/%d, "
+    G_debug(1, "Cairo_begin_raster(): masked=%d, src_lrtb=%d %d %d %d -> w/h=%d %d, "
             "dst_lrtb=%d %d %d %d -> w/h=%d %d",
             "dst_lrtb=%d %d %d %d -> w/h=%d %d",
             masked, src_l, src_r, src_t, src_b, src_w, src_h,
             masked, src_l, src_r, src_t, src_b, src_w, src_h,
             dst_l, dst_r, dst_t, dst_b, dst_w, dst_h);
             dst_l, dst_r, dst_t, dst_b, dst_w, dst_h);
@@ -145,7 +145,7 @@ int Cairo_raster(int n, int row,
     if (y1 <= y0)
     if (y1 <= y0)
         return next_row(row, d_y1);
         return next_row(row, d_y1);
 
 
-    G_debug(3, "Cairo_raster(): row=%d", row);
+    G_debug(3, "Cairo_raster(): n=%d row=%d", n, row);
 
 
     for (x = x0; x < x1; x++) {
     for (x = x0; x < x1; x++) {
 	int xx = dst_l + x;
 	int xx = dst_l + x;

+ 1 - 1
lib/cdhc/Makefile

@@ -16,7 +16,7 @@ ifeq ($(strip $(CROSS_COMPILING)),)
 endif
 endif
 
 
 test: $(OBJDIR)/test$(EXE)
 test: $(OBJDIR)/test$(EXE)
-	cd $(OBJDIR) && $(call run_grass,./test < ../test_numbers.csv)
+	$(call run_grass,$(OBJDIR)/test$(EXE) < test_numbers.csv)
 
 
 #  Test functions
 #  Test functions
 $(OBJDIR)/test$(EXE): $(OBJDIR)/test.o $(GISDEP) $(CDHCDEP)
 $(OBJDIR)/test$(EXE): $(OBJDIR)/test.o $(GISDEP) $(CDHCDEP)

+ 2 - 2
lib/gpde/n_gwflow.c

@@ -435,7 +435,7 @@ N_gwflow_3d_calc_water_budget(N_gwflow_data3d * data, N_geom_data * geom, N_arra
     if(fabs(sum) < 0.0000000001)
     if(fabs(sum) < 0.0000000001)
         G_message(_("The total sum of the water budget: %g\n"), sum);
         G_message(_("The total sum of the water budget: %g\n"), sum);
     else
     else
-        G_warning(_("The total sum of the water budget is significant larger then 0: %g\n"), sum);
+        G_warning(_("The total sum of the water budget is significantly larger then 0: %g\n"), sum);
 
 
     return;
     return;
 }
 }
@@ -714,7 +714,7 @@ N_gwflow_2d_calc_water_budget(N_gwflow_data2d * data, N_geom_data * geom, N_arra
     if(fabs(sum) < 0.0000000001)
     if(fabs(sum) < 0.0000000001)
         G_message(_("The total sum of the water budget: %g\n"), sum);
         G_message(_("The total sum of the water budget: %g\n"), sum);
     else
     else
-        G_warning(_("The total sum of the water budget is significant larger then 0: %g\n"), sum);
+        G_warning(_("The total sum of the water budget is significantly larger then 0: %g\n"), sum);
 
 
     return;
     return;
 }
 }

+ 2 - 0
lib/proj/README.txt

@@ -4,3 +4,5 @@ The EPGS DB is transformed into suitable CSV data for GDAL/PROJ
 according to this procedure:
 according to this procedure:
 http://svn.osgeo.org/metacrs/geotiff/trunk/libgeotiff/csv/README
 http://svn.osgeo.org/metacrs/geotiff/trunk/libgeotiff/csv/README
 
 
+alternative:
+ls `gdal-config --datadir`

+ 6 - 7
lib/python/docs/src/index.rst

@@ -12,17 +12,16 @@ and the GRASS GIS Temporal Framework are entirely written in Python.
 A set of packages is provided to the user in order to provide functionality
 A set of packages is provided to the user in order to provide functionality
 at various levels:
 at various levels:
 
 
-* **script package**: Python interface to launch GRASS GIS modules in scripts
-* **PyGRASS documentation**: PyGRASS is an object-oriented Python Application 
+* **script package** provides Python interface to launch GRASS GIS modules in scripts
+* **PyGRASS** is an object-oriented Python Application 
   Programming Interface (API) for GRASS GIS which uses the GRASS C API as 
   Programming Interface (API) for GRASS GIS which uses the GRASS C API as 
   backend but additionally offers a convenient interface to the GRASS GIS 
   backend but additionally offers a convenient interface to the GRASS GIS 
   modules
   modules
-* **GRASS GIS Temporal Framework**: implements the temporal GIS functionality
+* **GRASS GIS Temporal Framework** implements the temporal GIS functionality
   of GRASS GIS and provides an API to implement spatio-temporal processing modules
   of GRASS GIS and provides an API to implement spatio-temporal processing modules
-* **exceptions package**: FIXME
-* **imaging package**: library to create animated images and films
-* **Testing GRASS GIS source code and modules**: (gunittest package
-* **pydispatch package**: Multiple-producer-multiple-consumer signal-dispatching
+* **exceptions package** contains exceptions used by other packages
+* **imaging package** is a library to create animated images and films
+* **pydispatch package** is a library for signal-dispatching
 
 
 Contents:
 Contents:
 
 

+ 1 - 3
lib/python/pygrass/gis/__init__.py

@@ -19,9 +19,7 @@ ETYPE = {'raster': libgis.G_ELEMENT_RASTER,
          'raster_3d': libgis.G_ELEMENT_RASTER3D,
          'raster_3d': libgis.G_ELEMENT_RASTER3D,
          'vector': libgis.G_ELEMENT_VECTOR,
          'vector': libgis.G_ELEMENT_VECTOR,
          'ascii_vector': libgis.G_ELEMENT_ASCIIVECTOR,
          'ascii_vector': libgis.G_ELEMENT_ASCIIVECTOR,
-         'icon': libgis.G_ELEMENT_ICON,
-         'labels': libgis.G_ELEMENT_LABEL,
-         'sites': libgis.G_ELEMENT_SITE,
+         'label': libgis.G_ELEMENT_LABEL,
          'region': libgis.G_ELEMENT_REGION,
          'region': libgis.G_ELEMENT_REGION,
          'group': libgis.G_ELEMENT_GROUP}
          'group': libgis.G_ELEMENT_GROUP}
 
 

+ 1 - 1
lib/python/pygrass/messages/__init__.py

@@ -76,7 +76,7 @@ def message_server(lock, conn):
             libgis.G_debug(1, "Stop messenger server")
             libgis.G_debug(1, "Stop messenger server")
             sys.exit()
             sys.exit()
 
 
-        message = data[1]            
+        message = data[1]
         # libgis limitation
         # libgis limitation
         if isinstance(message,  type(" ")):
         if isinstance(message,  type(" ")):
             if len(message) >= 2000:
             if len(message) >= 2000:

+ 8 - 8
lib/python/pygrass/modules/interface/module.py

@@ -67,7 +67,7 @@ class ParallelModuleQueue(object):
     number of parallel processes it will wait for all processes to finish,
     number of parallel processes it will wait for all processes to finish,
     sets the stdout and stderr of the Module object and removes it
     sets the stdout and stderr of the Module object and removes it
     from the queue when its finished.
     from the queue when its finished.
-    
+
     To finish the queue before the maximum number of parallel
     To finish the queue before the maximum number of parallel
     processes was reached call wait() .
     processes was reached call wait() .
 
 
@@ -77,13 +77,13 @@ class ParallelModuleQueue(object):
     Usage:
     Usage:
 
 
     Check with a queue size of 3 and 5 processes
     Check with a queue size of 3 and 5 processes
-    
+
     >>> import copy
     >>> import copy
     >>> from grass.pygrass.modules import Module, ParallelModuleQueue
     >>> from grass.pygrass.modules import Module, ParallelModuleQueue
     >>> mapcalc_list = []
     >>> mapcalc_list = []
-    
+
     Setting run_ to False is important, otherwise a parallel processing is not possible
     Setting run_ to False is important, otherwise a parallel processing is not possible
-    
+
     >>> mapcalc = Module("r.mapcalc", overwrite=True, run_=False)
     >>> mapcalc = Module("r.mapcalc", overwrite=True, run_=False)
     >>> queue = ParallelModuleQueue(nprocs=3)
     >>> queue = ParallelModuleQueue(nprocs=3)
     >>> for i in xrange(5):
     >>> for i in xrange(5):
@@ -105,7 +105,7 @@ class ParallelModuleQueue(object):
     0
     0
 
 
     Check with a queue size of 8 and 5 processes
     Check with a queue size of 8 and 5 processes
-    
+
     >>> queue = ParallelModuleQueue(nprocs=8)
     >>> queue = ParallelModuleQueue(nprocs=8)
     >>> mapcalc_list = []
     >>> mapcalc_list = []
     >>> for i in xrange(5):
     >>> for i in xrange(5):
@@ -127,7 +127,7 @@ class ParallelModuleQueue(object):
     0
     0
 
 
     Check with a queue size of 8 and 4 processes
     Check with a queue size of 8 and 4 processes
-    
+
     >>> queue = ParallelModuleQueue(nprocs=8)
     >>> queue = ParallelModuleQueue(nprocs=8)
     >>> mapcalc_list = []
     >>> mapcalc_list = []
     >>> new_mapcalc = copy.deepcopy(mapcalc)
     >>> new_mapcalc = copy.deepcopy(mapcalc)
@@ -257,11 +257,11 @@ class ParallelModuleQueue(object):
 
 
         :returns: the number fo Module processes running/finished in the queue
         :returns: the number fo Module processes running/finished in the queue
         """
         """
-        return self._proc_count 
+        return self._proc_count
 
 
     def get_max_num_procs(self):
     def get_max_num_procs(self):
         """Return the maximum number of parallel Module processes
         """Return the maximum number of parallel Module processes
-        
+
         :returns: the maximum number of parallel Module processes
         :returns: the maximum number of parallel Module processes
         """
         """
         return self._num_procs
         return self._num_procs

+ 1 - 1
lib/python/pygrass/vector/geometry.py

@@ -780,7 +780,6 @@ class Line(Geo):
             >>> line.distance(point)           #doctest: +NORMALIZE_WHITESPACE
             >>> line.distance(point)           #doctest: +NORMALIZE_WHITESPACE
             LineDist(point=Point(2.300000, 0.000000),
             LineDist(point=Point(2.300000, 0.000000),
                      dist=0.5, spdist=0.2999999999999998, sldist=2.3)
                      dist=0.5, spdist=0.2999999999999998, sldist=2.3)
-
         """
         """
         # instantite outputs
         # instantite outputs
         cx = ctypes.c_double(0)
         cx = ctypes.c_double(0)
@@ -925,6 +924,7 @@ class Line(Geo):
 
 
     def segment(self, start, end):
     def segment(self, start, end):
         """Create line segment. using the ``Vect_line_segment`` C function.
         """Create line segment. using the ``Vect_line_segment`` C function.
+
         :param start: distance from the begining of the line where
         :param start: distance from the begining of the line where
                       the segment start
                       the segment start
         :type start: float
         :type start: float

+ 1 - 1
lib/python/temporal/open_stds.py

@@ -235,7 +235,7 @@ def open_new_map_dataset(name, layer=None, type="raster",
     mapset = get_current_mapset()
     mapset = get_current_mapset()
 
 
     dbif, connected = init_dbif(dbif)
     dbif, connected = init_dbif(dbif)
-    new_map = check_new_map_dataset(name, layer, "raster", overwrite, dbif)
+    new_map = check_new_map_dataset(name, layer, type, overwrite, dbif)
 
 
     # Check if new map is in the temporal database
     # Check if new map is in the temporal database
     if new_map.is_in_db(dbif):
     if new_map.is_in_db(dbif):

+ 0 - 255
lib/python/temporal/pythontemporallib.dox

@@ -1,255 +0,0 @@
-/*! \page pythontemporallib GRASS GIS Temporal Framework
-
-by GRASS Development Team (http://grass.osgeo.org)
-
-The GRASS GIS Temporal Framework
-
-\section PythonTGISIntro Introduction
-
-The GRASS GIS Temporal Framework implements the temporal GIS functionality of GRASS GIS
-and provides an API to implement spatio-temporal processing modules. The framework 
-introduces space time datasets that represent time series of raster, 3D raster or vector maps.
-This framework provides the following functionalities: 
-- Assign time stamp to maps and register maps in the temporal database
-- Modification of time stamps
-- Creation, renaming and deletion of space time datasets
-- Registration and un-registration of maps in space time datasets
-- Query of maps that are registered in space time datasets using SQL where statements
-- Analysis of the spatio-temporal topology of space time datasets
-- Sampling of space time datasets
-- Computation of temporal and spatial relationships between registered maps
-- Higher level functions that are shared between modules
-
-Most of the functions described above are member functions of the maps and space time dataset classes.
-Maps and space time datasets are represented as objects in the temporal framework.
-
-\section PythonTGISPackages Library
-
-Core functionality such as the initialization function, the database interface connection to sqlite3 
-and postgresql as well as the creation of the temporal database are defined here:
-
-- python::temporal::core
-
-In these modules are the temporal database interfaces for raster maps, 
-3D raster maps, vector maps and space time datasets defined. 
-In addition the temporal and spatial extent modules implement the topological 
-relationship computation that is needed for spatio-temporal topology computation:
-
-- python::temporal::base
-- python::temporal::spatial_extent
-- python::temporal::temporal_extent
-- python::temporal::metadata
-
-Several "abstract" classes are defined that implement the shared functionality 
-of time stamped maps and space time datasets, such as temporal and spatial
-handling and representation:
-
-- python::temporal::spatial_topology_dataset_connector
-- python::temporal::temporal_topology_dataset_connector
-- python::temporal::abstract_dataset
-- python::temporal::abstract_map_dataset
-- python::temporal::abstract_space_time_dataset
-
-The RPC C-library interface for exit safe and fast access to raster, vector and 3D raster informations:
-
-- python::temporal::c_libraries_interface
-
-All dataset classes that are used in the GRASS temporal modules are specified
-here:
-
-- python::temporal::space_time_datasets
-
-Functions to compute temporal granularity, handling of datetime objects
-and their conversion as well as spatio-temporal topology computation are defined in these modules:
-
-- python::temporal::datetime_math
-- python::temporal::spatio_temporal_relationships
-- python::temporal::temporal_granularity
-
-Functionality that is shared between different temporal GRASS modules, such as
-map listing, space time dataset creation, map registration and unregistration, 
-aggregation, extraction, map calculation, statistics as well as import and export of 
-space time datasets are defined here:
-
-- python::temporal::aggregation
-- python::temporal::extract
-- python::temporal::factory
-- python::temporal::open_stds
-- python::temporal::list_stds
-- python::temporal::mapcalc
-- python::temporal::register
-- python::temporal::sampling
-- python::temporal::stds_export
-- python::temporal::stds_import
-- python::temporal::univar_statistics
-
-Spatio-temporal algebra classes for space time raster and vector datasets are defined in:
-
-- python::temporal::temporal_algebra
-- python::temporal::temporal_vector_algebra
-- python::temporal::temporal_vector_operator
-
-Two helper functions to support the listing of space time datasets in the automatically generated GUI:
-
-- python::temporal::gui_support
-
-Unittests:
-
-- python::temporal::unittests_register
-
-
-\section PythonTGISExamples Examples
-
-\subsection PythonTGISExamplesSimple Simple example
-
-This simple example shows how to open a space time raster dataset
-to access its registered maps.
-
-\code
-# Lets import the temporal framework and
-# the script framework
-import grass.temporal as tgis
-import grass.script as grass
-
-# Make sure the temporal database exists
-# and set the temporal GIS environment
-tgis.init()
-
-# We create the temporal database interface for fast processing
-dbif = tgis.SQLDatabaseInterfaceConnection()
-dbif.connect()
-
-# The id of a space time raster dataset is build from its name and its mapset
-id = "test@PERMANENT"
-
-# We create a space time raster dataset object 
-strds = tgis.SpaceTimeRasterDataset(id)
-
-# Check if the space time raster dataset is in the temporal database
-if strds.is_in_db(dbif=dbif) == False:
-    dbif.close()
-    grass.fatal(_("Space time %s dataset <%s> not found") % (
-        strds.get_new_map_instance(None).get_type(), id))
-
-# Fill the object with the content from the temporal database
-strds.select(dbif=dbif)
-
-# Print informations about the space time raster dataset to stdout
-strds.print_info()
-
-# Get all maps that are registered in the strds and print
-# informations about the maps to stdout
-maps = strds.get_registered_maps_as_objects(dbif=dbif)
-
-# We iterate over the temporal sorted map list
-for map in maps:
-    # We fill the map object with the content 
-    # from the temporal database. We use the existing
-    # database connection, otherwise a new connection 
-    # will be established for each map object 
-    # which slows the processing down
-    map.select(dbif=dbif)
-    map.print_info()
-
-# Close the database connection
-dbif.close()
-\endcode
-
-
-\subsection PythonTGISExamplesSTDSCreation Creation of a space time dataset
-
-This example shows howto create a space time dataset. The code is generic and works
-for different space time datasets (raster, 3D raster and vector): 
-
-\code
-# Lets import the temporal framework and
-# the script framework
-import grass.temporal as tgis
-import grass.script as grass
-
-# The id of the new space time dataset
-id="test@PERMANENT"
-# The title of the new space time dataset
-title="This is a test dataset" 
-# The description of the space time dataset
-description="The description"
-# The type of the space time dataset (strds, str3ds or stvds)
-type="strds"
-# The temporal type of the space time dataset (absolute or relative)
-temporal_type="absolute"
-
-# Make sure the temporal database exists
-# and set the temporal GIS environment
-tgis.init()
-
-# We use the dataset factory to create an new space time dataset instance of a specific type
-stds = tgis.dataset_factory(type, id)
-
-# We need a dtabase connection to insert the content of the space time dataset
-dbif = tgis.SQLDatabaseInterfaceConnection()
-dbif.connect()
-
-# First we check if the dataset is already in the database
-if stds.is_in_db(dbif=dbif) and overwrite == False:
-    dbif.close()
-    grass.fatal(_("Space time %s dataset <%s> is already in the database. "
-                    "Use the overwrite flag.") %
-                (stds.get_new_map_instance(None).get_type(), name))
-
-# We delete the exiting dataset and create a new one in case we are allowed to overwrite it
-if stds.is_in_db(dbif=dbif) and overwrite == True:
-    grass.warning(_("Overwrite space time %s dataset <%s> "
-                    "and unregister all maps.") %
-                (stds.get_new_map_instance(None).get_type(), name))
-    stds.delete(dbif=dbif)
-    stds = stds.get_new_instance(id)
-
-# We set the initial values. This function also created the command history.
-stds.set_initial_values(temporal_type=temporaltype, semantic_type="mean",
-                        title=title, description=description)
-                        
-# Now we can insert the new space time dataset in the database
-stds.insert(dbif=dbif)
-
-# Close the database connection
-dbif.close()
-    
-\endcode
-
-\subsection PythonTGISExamplesShifting Temporal shifting
-
-\code
-
-import grass.script as grass
-import grass.temporal as tgis
-
-id="test@PERMANENT"
-type="strds"
-
-# Make sure the temporal database exists
-tgis.init()
-
-dbif = tgis.SQLDatabaseInterfaceConnection()
-dbif.connect()
-
-stds = tgis.dataset_factory(type, id)
-
-if stds.is_in_db(dbif) == False:
-    dbif.close()
-    grass.fatal(_("Space time dataset <%s> not found in temporal database") % (id))
-
-stds.select(dbif=dbif)
-
-stds.snap(dbif=dbif)
-
-stds.update_command_string(dbif=dbif)
-dbif.close()
-
-\endcode
-
-\section PythonTGISAuthors Authors
-
-Soeren Gebbert
-
-TODO: add more documentation
-*/

+ 3 - 3
lib/python/temporal/register.py

@@ -117,7 +117,7 @@ def register_maps_in_space_time_dataset(
             row["id"] = mapid
             row["id"] = mapid
             maplist[count] = row
             maplist[count] = row
 
 
-    # Read the raster map list from file
+    # Read the map list from file
     if file:
     if file:
         fd = open(file, "r")
         fd = open(file, "r")
 
 
@@ -308,7 +308,7 @@ def register_maps_in_space_time_dataset(
     if name and map_object_list:
     if name and map_object_list:
         count = 0
         count = 0
         num_maps = len(map_object_list)
         num_maps = len(map_object_list)
-        msgr.message(_("Registering maps in the space time raster dataset..."))
+        msgr.message(_("Registering maps in the space time dataset..."))
         for map in map_object_list:
         for map in map_object_list:
             if count % 50 == 0:
             if count % 50 == 0:
                 msgr.percent(count, num_maps, 1)
                 msgr.percent(count, num_maps, 1)
@@ -317,7 +317,7 @@ def register_maps_in_space_time_dataset(
 
 
     # Update the space time tables
     # Update the space time tables
     if name and map_object_list:
     if name and map_object_list:
-        msgr.message(_("Updating space time raster dataset..."))
+        msgr.message(_("Updating space time dataset..."))
         sp.update_from_registered_maps(dbif)
         sp.update_from_registered_maps(dbif)
         if update_cmd_list is True:
         if update_cmd_list is True:
             sp.update_command_string(dbif=dbif)
             sp.update_command_string(dbif=dbif)

+ 3 - 1
lib/raster/close.c

@@ -375,13 +375,14 @@ static int close_new(int fd, int ok)
 			  fcb->null_temp_name, path, strerror(errno));
 			  fcb->null_temp_name, path, strerror(errno));
 		stat = -1;
 		stat = -1;
 	    }
 	    }
+	    /* if rename() was successful what is left to remove() ? */
 	    else {
 	    else {
 		remove(fcb->null_temp_name);
 		remove(fcb->null_temp_name);
 	    }
 	    }
 	}
 	}
 	else {
 	else {
 	    remove(fcb->null_temp_name);
 	    remove(fcb->null_temp_name);
-	    remove(path);
+	    remove(path); /* again ? */
 	}			/* null_cur_row > 0 */
 	}			/* null_cur_row > 0 */
 
 
 	if (fcb->open_mode == OPEN_NEW_COMPRESSED) {	/* auto compression */
 	if (fcb->open_mode == OPEN_NEW_COMPRESSED) {	/* auto compression */
@@ -440,6 +441,7 @@ static int close_new(int fd, int ok)
 		      fcb->temp_name, path, strerror(errno));
 		      fcb->temp_name, path, strerror(errno));
 	    stat = -1;
 	    stat = -1;
 	}
 	}
+	/* if rename() was successful what is left to remove() ? */
 	else {
 	else {
 	    remove(fcb->temp_name);
 	    remove(fcb->temp_name);
 	}
 	}

+ 1 - 1
lib/symbol/read.c

@@ -221,7 +221,7 @@ SYMBOL *err(FILE * fp, SYMBOL * s, char *msg)
 {
 {
     fclose(fp);
     fclose(fp);
     G_free(s);			/* TODO: free all */
     G_free(s);			/* TODO: free all */
-    G_warning("%s", msg);
+    G_warning(msg, "%s");
     return NULL;
     return NULL;
 }
 }
 
 

+ 6 - 2
lib/vector/vectorlib.dox

@@ -293,8 +293,10 @@ Information about categories holds \ref line_cats data structure.
 
 
 \section vlibAttributes Attributes
 \section vlibAttributes Attributes
 
 
-The old GRASS 4.x 'dig_cats' files are not used any more and vectors'
-attributes are stored in external database. Connection with the
+For a user-centric view about attribute management, see the explanations
+in the <a href="http://grasswiki.osgeo.org/wiki/Vector_Database_Management">GRASS GIS Wiki</a>.
+
+The attribute data are stored in external database. Connection with the
 database is done through drivers based on \ref dbmilib. Records in a
 database is done through drivers based on \ref dbmilib. Records in a
 table are linked to vector entities by layer and category number. The
 table are linked to vector entities by layer and category number. The
 layer identifies table and the category identifies record.  I.e., for
 layer identifies table and the category identifies record.  I.e., for
@@ -313,6 +315,8 @@ driver+database+table+row
 The general DBMI settings are defined in the '$MAPSET/VAR' text file
 The general DBMI settings are defined in the '$MAPSET/VAR' text file
 (maintained with <tt>db.connect</tt> command at user level).
 (maintained with <tt>db.connect</tt> command at user level).
 
 
+Note: vector boundaries are (typically) handled without category since adjacent
+parcels might have two different categories which prevents from a unique assignment.
 
 
 \section vlibGeometry Vector library feature geometry
 \section vlibGeometry Vector library feature geometry