[GRASS-SVN] r62698 - grass-addons/grass7/vector/v.nnstat

svn_grass at osgeo.org svn_grass at osgeo.org
Mon Nov 10 21:04:07 PST 2014


Author: evas
Date: 2014-11-10 21:04:07 -0800 (Mon, 10 Nov 2014)
New Revision: 62698

Modified:
   grass-addons/grass7/vector/v.nnstat/getval.cpp
   grass-addons/grass7/vector/v.nnstat/local_proto.h
   grass-addons/grass7/vector/v.nnstat/main.cpp
   grass-addons/grass7/vector/v.nnstat/mbr.cpp
   grass-addons/grass7/vector/v.nnstat/nearest_neighbour.cpp
   grass-addons/grass7/vector/v.nnstat/v.nnstat.html
Log:
main.cpp: fixed conditions for making decition about 2D/3D NNA

Modified: grass-addons/grass7/vector/v.nnstat/getval.cpp
===================================================================
--- grass-addons/grass7/vector/v.nnstat/getval.cpp	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/getval.cpp	2014-11-11 05:04:07 UTC (rev 62698)
@@ -2,7 +2,7 @@
 
 extern "C" {
   /* get array of values from attribute column (function based on part of v.buffer2 (Radim Blazek, Rosen Matev)) */
-  void *get_col_values(struct Map_info *map, int field, const char *column, union dat *ifs)
+  double *get_col_values(struct Map_info *map, int field, const char *column)
   {
     int i, nrec, ctype;
     struct field_info *Fi;
@@ -10,9 +10,7 @@
     dbCatValArray cvarr;
     dbDriver *Driver;
 
-    int *iv;
-    double *fv;
-    string *sv;
+    double *values, *vals;
 
     db_CatValArray_init(&cvarr);	/* array of categories and values initialised */
 
@@ -35,38 +33,39 @@
 			    &cvarr);
     if (nrec < 0)
       G_fatal_error(_("Unable to select data from table <%s>"), Fi->table);
-    G_message(_("%d records selected from table"), nrec);
+    G_message(_("Reading elevations from attribute table: %d records selected"), nrec);
     ctype = cvarr.ctype;
     
     db_close_database_shutdown_driver(Driver);
 
-    switch (ctype) {
-    case DB_C_TYPE_INT: ifs->i_dat = (int *) G_malloc(cvarr.n_values * sizeof(int)); iv = &ifs->i_dat[0]; break;
-    case DB_C_TYPE_DOUBLE: ifs->f_dat = (double *) G_malloc(cvarr.n_values * sizeof(double)); fv = &ifs->f_dat[0]; break;
-    case DB_C_TYPE_STRING: ifs->s_dat = (char **) G_malloc(cvarr.n_values * sizeof(char)); sv = &ifs->s_dat[0];
-    } 
+    values = (double *) G_malloc(cvarr.n_values * sizeof(double));
+    vals = &values[0];
 
     for (i = 0; i < cvarr.n_values; i++) {
-      switch (ctype) {
-      case DB_C_TYPE_INT: *iv = cvarr.value[i].val.i; iv++; break;
-      case DB_C_TYPE_DOUBLE: *fv = cvarr.value[i].val.d; fv++; break;
-      case DB_C_TYPE_STRING:
-	G_message(_("cvarr = %s"), db_get_string(cvarr.value[i].val.s));
-	*sv = db_get_string(cvarr.value[i].val.s);
-	G_message(_("ifs = %s"), *sv);
-	sv++;
+      if (ctype == DB_C_TYPE_INT) {
+	*vals = (double) cvarr.value[i].val.i;
       }
+      if (ctype == DB_C_TYPE_DOUBLE) {
+	*vals = cvarr.value[i].val.d;
+      }
+      if (ctype == DB_C_TYPE_STRING) {
+	G_fatal_error(_("The column must be numeric..."));
+      }
+      vals++;
     }
+
+    return values;
   }
 
 /* get coordinates of input points */
   void read_points(struct Map_info *map, int field, struct nna_par *xD,
-		const char *zcol, union dat *ifs, struct points *point)
+		const char *zcol, struct points *point)
   {
     int ctrl, n, type, nskipped, pass;
 
     struct line_pnts *Points;	/* structures to hold line *Points (map) */
-    double *rx, *ry, *rz, *z_attr;
+    double *rx, *ry, *rz;
+    double *z_attr, *z;
 
     Points = Vect_new_line_struct();
     n = point->n = Vect_get_num_primitives(map, GV_POINT);	/* topology required */
@@ -77,11 +76,18 @@
     rz = &point->r[2];
 
     /* Get 3rd coordinate of 2D points from attribute column -> 3D interpolation */
-    /*if (xD.v3 == FALSE && zcol != NULL)
-      z_attr = get_col_values(map, field, zcol);*/
-        
+    if (xD->v3 == FALSE && zcol != NULL) {
+      xD->zcol = (char *) G_malloc(strlen(zcol) * sizeof(char));
+      strcpy(xD->zcol, zcol);
+      z_attr = get_col_values(map, field, zcol);
+      z = &z_attr[0];
+    }
+    else {
+      xD->zcol = NULL;
+    }
+            
     nskipped = ctrl = pass = 0;
-
+    
     while (TRUE) {
       type = Vect_read_next_line(map, Points, NULL);
       if (type == -1)
@@ -98,12 +104,17 @@
       *ry = Points->y[0];
       
       // 3D points or 2D points without attribute column -> 2D interpolation
-      if (zcol == NULL) 
-	*rz = Points->z[0];
-      /* TODO: 2D */
+      if (xD->zcol == NULL) {
+	if (xD->v3 == TRUE && xD->i3 == FALSE) {
+	  *rz = 0.;
+	}
+	else {
+	  *rz = Points->z[0];
+	}
+      }
       else {
-	*rz = *z_attr;
-	z_attr++;
+	*rz = *z;
+	z++;
       }
 
       /* Find extends */	

Modified: grass-addons/grass7/vector/v.nnstat/local_proto.h
===================================================================
--- grass-addons/grass7/vector/v.nnstat/local_proto.h	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/local_proto.h	2014-11-11 05:04:07 UTC (rev 62698)
@@ -43,23 +43,9 @@
 {
   int i3;  // TRUE = 3D NNA, FALSE = 2D NNA (user sets by flag) 
   char v3; // TRUE = 3D layer, FALSE = 2D layer (according to Vect_is_3d()) 
+  char *zcol; // not NULL if 3D NNA using 2D layer is required
 };
 
-typedef char *string;
-union dat
-{
-  int *i_dat;
-  double *f_dat;
-  string *s_dat;
-};
-
-struct columns
-{
-  int *lyr;  // archaeological layer
-  double *z; // z coordinate 
-  string *desc; // description of artifact 
-};
-
 struct convex
 {
   int n; // number of hull vertices 
@@ -80,8 +66,8 @@
 };
 
 extern "C" {
-  void *get_col_values(struct Map_info *, int, const char *, union dat *);
-  void read_points(struct Map_info *, int, struct nna_par *, const char *, union dat *, struct points *);
+  double *get_col_values(struct Map_info *, int, const char *);
+  void read_points(struct Map_info *, int, struct nna_par *, const char *, struct points *);
   double *triple(double, double, double);
   
   double bearing(double, double, double, double);
@@ -94,7 +80,7 @@
   int nn_average_distance_real(struct points *, struct nearest *);
   void density(struct points *, struct nna_par *, const char *, struct nearest *);
   void nn_average_distance_expected(struct nna_par *, struct nearest *);
-  void nn_results(struct points *, struct nearest *);
+  void nn_results(struct points *, struct nna_par *, struct nearest *);
   void nn_statistics(struct points *, struct nna_par *, struct nearest *);
 } // end extern "C"
 #endif

Modified: grass-addons/grass7/vector/v.nnstat/main.cpp
===================================================================
--- grass-addons/grass7/vector/v.nnstat/main.cpp	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/main.cpp	2014-11-11 05:04:07 UTC (rev 62698)
@@ -4,7 +4,7 @@
  * MODULE:	v.nnstat
  * 
  * AUTHOR(S):	Eva Stopková
- *              functionsin files mbr.cpp and mbb.cpp are mostly taken 
+ *              functions in files mbr.cpp and mbb.cpp are mostly taken 
  *              from the module 
  *              v.hull (Aime, A., Neteler, M., Ducke, B., Landa, M.)
  *			   
@@ -24,13 +24,12 @@
   int main(int argc, char *argv[])
   {
     /* Vector layer and module */
-    struct Map_info map; /* input vector map */
+    struct Map_info map;    // input vector map
     struct GModule *module;
-    struct nna_par xD; /* 2D or 3D NNA */
-    struct points pnts;
-    union dat ifs; /* integer/float/string value */
+    struct nna_par xD;      // 2D or 3D NNA to be performed
+    struct points pnts;     // points: coordinates, number etc.
 
-    struct nearest nna;
+    struct nearest nna;     // structure to save results
     int field, pass;
 
     struct {
@@ -67,7 +66,7 @@
     opt.zcol->key = "zcolumn";
     opt.zcol->required = NO;
     opt.zcol->guisection = _("Fields");
-    opt.zcol->description = _("Column with z coordinate (set for 2D vectors only)");
+    opt.zcol->description = _("Column with z coordinate (set for 2D vectors only if 3D NNA is required to be performed)");
 
     G_gisinit(argv[0]);
 
@@ -85,20 +84,29 @@
     Vect_set_error_handler_io(&map, NULL);
 
     /* perform 2D or 3D NNA ? */
-    xD.v3 = Vect_is_3d(&map);
-    xD.i3 = (flg.d23->answer || xD.v3 == FALSE) ? FALSE : TRUE;
+    xD.v3 = Vect_is_3d(&map); // test if vector layer is 2D or 3D
+    xD.i3 = (flg.d23->answer || (xD.v3 == FALSE && opt.zcol->answer == NULL)) ? FALSE : TRUE; // if -2 flag or input layer is 2D (without zcolumn), perform 2D NNA, otherwise 3D
 
-    if (xD.i3 == TRUE) { /* 3D */
-      if (xD.v3 == FALSE) { /* 2D input */
-	if (opt.zcol->answer == NULL)
-	  G_fatal_error(_("To process 3D Nearest Neighbour Analysis based on 2D input, "
-			  "please set attribute column containing z coordinates "
-			  "or switch to 2D NNA."));
+    /* Fatal error */
+    /*if (xD.i3 == TRUE) { // if 3D NNA is to be performed...
+      if (xD.v3 == FALSE && opt.zcol->answer == NULL) { // ... and column with elevations for 2D input is missing 
+	G_fatal_error(_("To process 3D Nearest Neighbour Analysis based on 2D input, "
+			"please set attribute column containing z coordinates "
+			"or switch to 2D NNA."));
       }
+      }*/
+    
+    /* Warnings */
+    if (flg.d23->answer && opt.zcol->answer) { // -2 flag (2D) vs. zcolumn (3D)
+      G_warning(_("Flag -2 has higher priority than zcolumn considered in 2D layer. 2D Nearest Neighbour Analysis will be performed instead of 3D. If you wish to perform 3D Nearest Neighbour Analysis, please remove flag -2."));
     }
 
-    read_points(&map, field, &xD, opt.zcol->answer, &ifs, &pnts);
+    if (xD.v3 == TRUE && opt.zcol->answer) {
+      G_warning(_("Input layer <%s> is 3D - it was not necessary to set up attribute column. 3D Nearest Neighbour Analysis is being performed..."), opt.map->answer);
+    }
 
+    read_points(&map, field, &xD, opt.zcol->answer, &pnts);
+
     /* Nearest Neighbour Analysis */
     pass = nn_average_distance_real(&pnts, &nna);  // Average distance (AD) between NN in pointset
     density(&pnts, &xD, opt.A->answer, &nna);      // Number of points per area/volume unit

Modified: grass-addons/grass7/vector/v.nnstat/mbr.cpp
===================================================================
--- grass-addons/grass7/vector/v.nnstat/mbr.cpp	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/mbr.cpp	2014-11-11 05:04:07 UTC (rev 62698)
@@ -125,12 +125,12 @@
     hc = &hull->coord[0];
     hh = &hull->hull[0];
 
-    for (i=0; i<=hull->n; i++) {
+    for (i=0; i <= hull->n; i++) {
       if (i < hull->n) {
 	*hc = (*(r+*hh))[0];
 	*(hc+1) = (*(r+*hh))[1];
-	*(hc+2) = (*(r+*hh))[2];
-	r++;
+	*(hc+2) = (*(r+*hh))[2]; 
+	//G_debug(0,"%f %f %f", *hc, *(hc+1), *(hc+2));
 	hc += 3;
 	hh++;
       }
@@ -140,7 +140,7 @@
 	*hc = (*(r0+*hh0))[0];
 	*(hc+1) = (*(r0+*hh0))[1];
 	*(hc+2) = (*(r0+*hh0))[2];
-      }      
+      }   
     }
     return hull->n;
 }
@@ -168,35 +168,40 @@
   S_min = (pnts->r_max[0] - pnts->r_min[0]) * (pnts->r_max[1] - pnts->r_min[1]); /* Area of extent */
   
   for (i=0; i < hull.n; i++) {
-    /* Bearings of hull edges */
+    /* Bearings of each hull edge */
     us = bearing(*hc, *(hc+3), *(hc+1), *(hc+4)); // x0, x1, y0, y1
     if (us == -9999) // Identical points
       continue;
+
     cosus = cos(us);
     sinus = sin(us);
 
-    hc_k = &hull.coord[0]; // original coords
+    hc_k = &hull.coord[0]; // original coords of k-point of hull
     for (k=0; k <= hull.n; k++) {
       /* Coordinate transformation */
+      // all the points into coordinate system with x axis parallel with i-edge
       *ht = *hc_k * cosus + *(hc_k+1) * sinus;
-      *(ht+1) = -(*hc_k) * sinus + *(hc_k+1) * cosus;
+      *(ht+1) = -1. * (*hc_k) * sinus + *(hc_k+1) * cosus;
       *(ht+2) = *(hc_k+2);
+      //G_debug(0, "%f %f %f", *ht,*(ht+1),*(ht+2));
 
       /* Transformed extent */
       switch (k) {
       case 0:
-	r_min = r_max = triple(*ht, *(ht+1), *(ht+2)); break;
+	r_min = r_max = triple(*ht, *(ht+1), *(ht+2)); 
+	break;
       default:
 	r_min = triple(MIN(*ht, *r_min), MIN(*(ht+1), *(r_min+1)), MIN(*(ht+2), *(r_min+2)));
 	r_max = triple(MAX(*ht, *r_max), MAX(*(ht+1), *(r_max+1)), MAX(*(ht+2), *(r_max+2)));
       }
       hc_k += 3;
     } // end k
-
     hc += 3; // next point
-    
+        
+    //G_debug(0, "%f %f %f %f %f %f", *r_min, *(r_min+1), *(r_min+2), *r_max, *(r_max+1), *(r_max+2));
     S = (*r_max - *r_min) * (*(r_max+1) - *(r_min+1)); /* Area of transformed extent */
     S_min = MIN(S, S_min);
+    
   } // end i
 
   return S_min;

Modified: grass-addons/grass7/vector/v.nnstat/nearest_neighbour.cpp
===================================================================
--- grass-addons/grass7/vector/v.nnstat/nearest_neighbour.cpp	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/nearest_neighbour.cpp	2014-11-11 05:04:07 UTC (rev 62698)
@@ -90,23 +90,51 @@
    * Two-tailed Student's test of significance of the mean
    * ---------------------------------*/
 
-  void nn_results(struct points *pnts, struct nearest *nna)
+  void nn_results(struct points *pnts, struct nna_par *xD, struct nearest *nna)
   {
-    G_message(_("\nNearest Neighbour Analysis results\n"));
-    G_message(_("Number of points .......... %d\nArea/Volume .......... %f\nDensity of points ............ %f"), pnts->n, nna->A, nna->rho);
-    G_message(_("Average distance between the nearest neighbours ............ %f m\nAverage expected distance between the nearest neighbours ... %f m\n Ratio rA/rE ... %f\n\nResults of two-tailed test of the mean\nNull hypothesis: Point set is randomly distributed within the region.\nStandard variate of the normal curve> c = %f"), nna->rA, nna->rE, nna->R, nna->c);
+    G_message(_("\n*** Nearest Neighbour Analysis results ***\n"));
+    if (xD->zcol != NULL) {
+      G_message(_("Input settings .. 3D layer: %d .. 3D NNA: %d .. zcolumn: %s"), xD->v3, xD->i3, xD->zcol);
+    }
+    else {
+      G_message(_("Input settings .. 3D layer: %d 3D NNA: %d"), xD->v3, xD->i3);
+    }
+    G_message(_("Number of points .......... %d"), pnts->n);
+    if (xD->i3 == TRUE) {
+      G_message(_("Volume .................... %f [units^3]"), nna->A);
+    }
+    else {
+      G_message(_("Area ...................... %f [units^2]"), nna->A);
+    }
+    G_message(_("Density of points ......... %f"), nna->rho);
+    G_message(_("Average distance between the nearest neighbours ........... %.3f [units]"), nna->rA);
+    G_message(_("Average expected distance between the nearest neighbours .. %.3f [units]"), nna->rE);
+    G_message(_("Ratio rA/rE ............... %f"), nna->R);
+    G_message(_("\n*** Results of two-tailed test of the mean ***"));
+    G_message(_("Null hypothesis: Point set is randomly distributed within the region."));
+    G_message(_("Standard variate of the normal curve> c = %f"), nna->c);
 
     /* two-tailed test of the mean */
-    if (-1.96 < nna->c && nna->c < 1.96)
+    if (-1.96 < nna->c && nna->c < 1.96) {
       G_message(_("Null hypothesis IS NOT REJECTED at the significance level alpha = 0.05"));
-    if (-2.58 < nna->c && nna->c <= -1.96)
-      G_message(_("Null hypothesis IS NOT REJECTED at the significance level alpha = 0.01 => point set is clustered.\nNull hypothesis CAN BE REJECTED at the significance level alpha = 0.05 => point set is randomly distributed."));
-    if (1.96 <= nna->c && nna->c < 2.58)
-      G_message(_("Null hypothesis IS NOT REJECTED at the significance level alpha = 0.01 => point set is dispersed.\nNull hypothesis CAN BE REJECTED at the significance level alpha = 0.05 => point set is randomly distributed."));
-    if (nna->c <= -2.58)
+    }
+    if (-2.58 < nna->c && nna->c <= -1.96) {
+      G_message(_("Null hypothesis IS NOT REJECTED at the significance level alpha = 0.01 => point set is clustered."));
+      G_message(_("Null hypothesis CAN BE REJECTED at the significance level alpha = 0.05 => point set is randomly distributed."));
+    }
+    
+    if (1.96 <= nna->c && nna->c < 2.58) {
+      G_message(_("Null hypothesis IS NOT REJECTED at the significance level alpha = 0.01 => point set is dispersed."));
+      G_message(_("Null hypothesis CAN BE REJECTED at the significance level alpha = 0.05 => point set is randomly distributed."));
+    }
+
+    if (nna->c <= -2.58) {
       G_message(_("Null hypothesis CAN BE REJECTED at the significance levels alpha = 0.05 and alpha = 0.01 => point set is clustered."));
-    if (nna->c >= 2.58)
-      G_message(_("Null hypothesis CAN BE REJECTED at the significance levels alpha = 0.05 and alpha = 0.01 => point set is dispersed. %f"), nna->c);
+    }
+    if (nna->c >= 2.58) {
+      G_message(_("Null hypothesis CAN BE REJECTED at the significance levels alpha = 0.05 and alpha = 0.01 => point set is dispersed."));
+    }
+    G_message(_(""));
   }
 
   void nn_statistics(struct points *pnts, struct nna_par *xD, struct nearest *nna)
@@ -125,6 +153,6 @@
     sig_rE = sqrt(var_rE); /* standard error of the mean distance */
     nna->c = (nna->rA - nna->rE) / sig_rE; /* standard variate of the normal curve */
 
-    nn_results(pnts, nna);
+    nn_results(pnts, xD, nna);
   }
 }

Modified: grass-addons/grass7/vector/v.nnstat/v.nnstat.html
===================================================================
--- grass-addons/grass7/vector/v.nnstat/v.nnstat.html	2014-11-11 04:57:07 UTC (rev 62697)
+++ grass-addons/grass7/vector/v.nnstat/v.nnstat.html	2014-11-11 05:04:07 UTC (rev 62698)
@@ -1,5 +1,60 @@
+<<<<<<< .mine
 <h2>DESCRIPTION</h2>
 
+<em>v.nnstat</em> indicates clusters, separations or random distribution of point dataset in 2D or 3D space using Nearest Neighbour Analysis (NNA). The method is based on comparison of observed average distance between the nearest neighbours and the distance which would be expected if points in the dataset are distributed randomly. More detailed information about theoretical background is provided in (<a href="https://courses.washington.edu/bio480/Week1-PAPER-Clark_and_Evans1954.pdf">Clark and Evans, 1954</a>), (<a href="http://journals.aps.org/rmp/pdf/10.1103/RevModPhys.15.1">Chandrasekhar, 1943, p. 86-87</a>). Details about the module and testing are summarized in (<a href="http://geoinformatics.fsv.cvut.cz/pdf/geoinformatics-fce-ctu-2013-11.pdf">Stopkova, 2013</a>).
+
+<h2>EXAMPLES</h2>
+<h3>Comparison of 2D and 3D NNA</h3>
+On the example of dataset that contains 2000 randomly distributed points, basic settings of analysis dimension (2D or 3D) will be examined:
+<ul>
+<li> <b>2D NNA</b> may be performed using <b>2D vector layer</b>. If 2D NNA is required to be performed using <b>3D vector layer</b>, <u>flag <i>-2</i></u> should be marked. In following figures, the results of both cases can be seen.
+
+<div class="code"><pre>
+v.nnstat in=name_of_2D_vector_layer
+</pre></div>
+
+<div align="center" style="margin: 10px">
+<img src="images/rand_2000_2D.png" border=0><br>
+<i>2D NNA using 2D vector layer</i>
+</div>
+
+<div class="code"><pre>
+v.nnstat in=name_of_3D_vector_layer -2
+</pre></div>
+
+<div align="center" style="margin: 10px">
+<img src="images/rand_2000_3D_2D.png" border=0><br>
+<i>2D NNA using 3D vector layer (the 3rd dimension is not considered in the analysis)</i>
+</div>
+
+<p><b><u>NOTE:</b></u> Comparing the results of 2D NNA with results summarized in (<a href="http://geoinformatics.fsv.cvut.cz/pdf/geoinformatics-fce-ctu-2013-11.pdf">Stopkova, 2013</a>), there can be seen small difference between the values of area. It is assumed to be caused by differences in transformed coordinates of the convex hull that have been computed using two versions of the module. This bug will be fixed soon.</p>
+
+<li> <b>3D NNA</b> can be performed just using <b>3D vector layer</b>. If 3D NNA is required to be performed using <b>2D vector layer</b>, <u>name of the column in attribute table that contains elevation values</u> must be set. The results are summarized in following tables.
+
+<div class="code"><pre>
+v.nnstat in=name_of_3D_vector_layer
+</pre></div>
+
+<div align="center" style="margin: 10px">
+<img src="images/rand_2000_3D_3D.png" border=0><br>
+<i>3D NNA using 3D vector layer</i>
+</div>
+
+<div class="code"><pre>
+v.nnstat in=name_of_2D_vector_layer zcol=name_of_attribute_column_with_elevations
+</pre></div>
+
+<div align="center" style="margin: 10px">
+<img src="images/rand_2000_2_5D.png" border=0><br>
+<i>3D NNA using 2D vector layer and elevation values obtained from attribute table of the layer</i>
+</div>
+=======
+>>>>>>> .r62696
+
+<<<<<<< .mine
+<li> <b>Warning</b>: If flag <i>-2</i> is set up together with <i>zcolumn</i>, the flag will have higher priority and 2D NNA will be performed.
+</ul>
+=======
 <em>v.nnstat</em> indicates clusters, separations or random
 distribution of point dataset in 2D or 3D space using Nearest
 Neighbour Analysis. The method is based on comparison of observed
@@ -14,7 +69,13 @@
 summarized in
 (<a href="http://geoinformatics.fsv.cvut.cz/pdf/geoinformatics-fce-ctu-2013-11.pdf">Stopkova,
 2013</a>).
+>>>>>>> .r62696
 
+<h3>Comparison of various datasets</h3>
+<p>
+In (<a href="http://geoinformatics.fsv.cvut.cz/pdf/geoinformatics-fce-ctu-2013-11.pdf">Stopkova, 2013</a>), there might be seen other examples (also clustered and dispersed datasets).
+</p>
+
 <h2>SEE ALSO</h2>
 
 <em>
@@ -35,6 +96,9 @@
 volume (Minimum Bounding Rectangle area) are based on functions for
 computing convex hull from the module <i>v.hull</i> (Aime, A.,
 Neteler, M., Ducke, B., Landa, M.)
+<<<<<<< .mine
+=======
 
 <p>
 <i>Last changed: $Date$</i>
+>>>>>>> .r62696



More information about the grass-commit mailing list