ソースを参照

v.to.rast: change rows option to memory option (trunk, https://trac.osgeo.org/grass/changeset/61909)

git-svn-id: https://svn.osgeo.org/grass/grass/branches/releasebranch_7_0@62227 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Neteler 10 年 前
コミット
c6a56b8a22
3 ファイル変更45 行追加19 行削除
  1. 18 11
      vector/v.to.rast/main.c
  2. 23 5
      vector/v.to.rast/raster.c
  3. 4 3
      vector/v.to.rast/vect2rast.c

+ 18 - 11
vector/v.to.rast/main.c

@@ -30,11 +30,11 @@
 int main(int argc, char *argv[])
 {
     struct GModule *module;
-    struct Option *input, *output, *rows, *col, *use_opt, *val_opt,
+    struct Option *input, *output, *memory, *col, *use_opt, *val_opt,
 		  *field_opt, *type_opt, *where_opt, *cats_opt,
 	          *rgbcol_opt, *label_opt;
     struct Flag *dense_flag;
-    int nrows, use, value_type, type;
+    int cache_mb, use, value_type, type;
     double value;
     char *desc;
 
@@ -107,13 +107,14 @@ int main(int argc, char *argv[])
     val_opt->answer = "1";
     val_opt->description = _("Raster value (for use=val)");
     
-    rows = G_define_option();
-    rows->key = "rows";
-    rows->type = TYPE_INTEGER;
-    rows->required = NO;
-    rows->multiple = NO;
-    rows->answer = "4096";
-    rows->description = _("Number of rows to hold in memory");
+    memory = G_define_option();
+    memory->key = "memory";
+    memory->type = TYPE_INTEGER;
+    memory->required = NO;
+    memory->multiple = NO;
+    memory->answer = "300";
+    memory->label = _("Cache size (MiB)");
+    memory->description = _("Cache size for raster rows");
 
     dense_flag = G_define_flag();
     dense_flag->key = 'd';
@@ -125,7 +126,13 @@ int main(int argc, char *argv[])
 	exit(EXIT_FAILURE);
 
     type = Vect_option_to_types(type_opt);
-    nrows = atoi(rows->answer);
+
+    cache_mb = atoi(memory->answer);
+    if (cache_mb < 1) {
+	G_warning(_("Cache size must be at least 1 MiB, changing %d to 1"),
+	          cache_mb);
+	cache_mb = 1;
+    }
 
     switch (use_opt->answer[0]) {
     case 'a':
@@ -160,7 +167,7 @@ int main(int argc, char *argv[])
     value_type = (strchr(val_opt->answer, '.')) ? USE_DCELL : USE_CELL;
 
     if (vect_to_rast(input->answer, output->answer, field_opt->answer,
-		     col->answer, nrows, use, value, value_type,
+		     col->answer, cache_mb, use, value, value_type,
 		     rgbcol_opt->answer, label_opt->answer, type,
 		     where_opt->answer, cats_opt->answer, dense_flag->answer)) {
 	exit(EXIT_FAILURE);

+ 23 - 5
vector/v.to.rast/raster.c

@@ -33,9 +33,10 @@ static int move(int, int);
 static int (*dot) (int, int);
 
 
-int begin_rasterization(int nrows, int f, int do_dense)
+int begin_rasterization(int cache_mb, int f, int do_dense)
 {
-    int i, size;
+    int i, size, nrows;
+    double row_mb;
     int pages;
 
     dense = (do_dense != 0);
@@ -45,13 +46,30 @@ int begin_rasterization(int nrows, int f, int do_dense)
 
     format = f;
 
+    G_get_set_window(&region);
+    G_get_set_window(&page);
+
+    switch (format) {
+    case USE_CELL:
+	row_mb = (double) region.cols * (sizeof(char) + sizeof(CELL)) /
+		 (1 << 20);
+	break;
+
+    case USE_DCELL:
+	row_mb = (double) region.cols * (sizeof(char) + sizeof(DCELL)) /
+	         (1 << 20);
+	dot = dcell_dot;
+	break;
+    }
+
+    nrows = cache_mb / row_mb;
+    if (nrows < 1)
+	nrows = 1;
+
     max_rows = nrows;
     if (max_rows <= 0)
 	max_rows = 512;
 
-    G_get_set_window(&region);
-    G_get_set_window(&page);
-
     pages = (region.rows + max_rows - 1) / max_rows;
 
     if (max_rows > region.rows)

+ 4 - 3
vector/v.to.rast/vect2rast.c

@@ -8,7 +8,7 @@
 
 
 int vect_to_rast(const char *vector_map, const char *raster_map, const char *field_name,
-		 const char *column, int nrows, int use, double value,
+		 const char *column, int cache_mb, int use, double value,
 		 int value_type, const char *rgbcolumn, const char *labelcolumn,
 		 int ftype, char *where, char *cats, int dense)
 {
@@ -143,7 +143,7 @@ int vect_to_rast(const char *vector_map, const char *raster_map, const char *fie
     }
 
     nlines = 1;
-    npasses = begin_rasterization(nrows, format, dense);
+    npasses = begin_rasterization(cache_mb, format, dense);
     pass = 0;
 
     nareas_all = Vect_get_num_areas(&Map);
@@ -224,7 +224,8 @@ int vect_to_rast(const char *vector_map, const char *raster_map, const char *fie
 		  column);
 
     if (nareas_all > 0)
-	G_message(_("Converted areas: %d of %d"), nareas, nareas_all);
+	G_message(_("Converted areas: %d of %d"), nareas,
+	          nareas_all - Vect_get_num_primitives(&Map, GV_CENTROID));
     if (nplines_all > 0)
 	G_message(_("Converted points/lines: %d of %d"), nlines, nplines_all);