[GRASS-SVN] r55511 - in grass/trunk/raster: . r.tile
svn_grass at osgeo.org
svn_grass at osgeo.org
Sun Mar 24 19:54:36 PDT 2013
Author: glynn
Date: 2013-03-24 19:54:36 -0700 (Sun, 24 Mar 2013)
New Revision: 55511
Added:
grass/trunk/raster/r.tile/
grass/trunk/raster/r.tile/Makefile
grass/trunk/raster/r.tile/main.c
grass/trunk/raster/r.tile/r.tile.html
Log:
r.tile - split raster map into tiles
Added: grass/trunk/raster/r.tile/Makefile
===================================================================
--- grass/trunk/raster/r.tile/Makefile (rev 0)
+++ grass/trunk/raster/r.tile/Makefile 2013-03-25 02:54:36 UTC (rev 55511)
@@ -0,0 +1,10 @@
+MODULE_TOPDIR = ../..
+
+PGM = r.tile
+
+LIBES = $(RASTERLIB) $(GISLIB)
+DEPENDENCIES = $(RASTERDEP) $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd
Added: grass/trunk/raster/r.tile/main.c
===================================================================
--- grass/trunk/raster/r.tile/main.c (rev 0)
+++ grass/trunk/raster/r.tile/main.c 2013-03-25 02:54:36 UTC (rev 55511)
@@ -0,0 +1,173 @@
+
+/****************************************************************************
+ *
+ * MODULE: r.tile
+ * AUTHOR(S): Glynn Clements <glynn gclements.plus.com>
+ * PURPOSE:
+ * COPYRIGHT: (C) 2013 by Glynn Clements and the GRASS Development Team
+ *
+ * This program is free software under the GNU General Public
+ * License (>=v2). Read the file COPYING that comes with GRASS
+ * for details.
+ *
+ *****************************************************************************/
+
+#include <stdlib.h>
+#include <grass/gis.h>
+#include <grass/raster.h>
+#include <grass/glocale.h>
+
+static struct
+{
+ struct Option *rastin, *rastout, *width, *height;
+} parm;
+static struct Cell_head dst_w, src_w;
+static int xtiles, ytiles;
+static RASTER_MAP_TYPE map_type;
+
+static void write_support_files(int xtile, int ytile);
+
+int main(int argc, char *argv[])
+{
+ struct GModule *module;
+ int infile;
+ size_t xtile_size;
+ int ytile, xtile, y;
+ int *outfiles;
+ void *inbuf;
+
+ G_gisinit(argv[0]);
+
+ module = G_define_module();
+ G_add_keyword(_("raster"));
+ G_add_keyword(_("retile"));
+ module->description =
+ _("Splits a raster map into tiles.");
+
+ parm.rastin = G_define_standard_option(G_OPT_R_INPUT);
+
+ parm.rastout = G_define_option();
+ parm.rastout->key = "output";
+ parm.rastout->type = TYPE_STRING;
+ parm.rastout->required = YES;
+ parm.rastout->multiple = NO;
+ parm.rastout->description = _("Output base name");
+
+ parm.width = G_define_option();
+ parm.width->key = "width";
+ parm.width->type = TYPE_INTEGER;
+ parm.width->required = YES;
+ parm.width->multiple = NO;
+ parm.width->description = _("Width of tiles");
+
+ parm.height = G_define_option();
+ parm.height->key = "height";
+ parm.height->type = TYPE_INTEGER;
+ parm.height->required = YES;
+ parm.height->multiple = NO;
+ parm.height->description = _("Height of tiles");
+
+ if (G_parser(argc, argv))
+ exit(EXIT_FAILURE);
+
+ G_get_set_window(&src_w);
+
+ /* set window to old map */
+ Rast_get_cellhd(parm.rastin->answer, "", &src_w);
+ dst_w = src_w;
+ dst_w.cols = atoi(parm.width->answer);
+ dst_w.rows = atoi(parm.height->answer);
+ G_adjust_Cell_head(&dst_w, 1, 1);
+
+ xtiles = (src_w.cols + dst_w.cols - 1) / dst_w.cols;
+ ytiles = (src_w.rows + dst_w.rows - 1) / dst_w.rows;
+
+ G_debug(1, "X: %d * %d, Y: %d * %d",
+ xtiles, dst_w.cols, ytiles, dst_w.rows);
+
+ src_w.cols = xtiles * dst_w.cols;
+ src_w.rows = ytiles * dst_w.rows;
+ src_w.east = src_w.west + src_w.cols * src_w.ew_res;
+ src_w.south = src_w.north - src_w.rows * src_w.ns_res;
+
+ Rast_set_input_window(&src_w);
+ Rast_set_output_window(&dst_w);
+
+ infile = Rast_open_old(parm.rastin->answer, "");
+ map_type = Rast_get_map_type(infile);
+ xtile_size = dst_w.cols * Rast_cell_size(map_type);
+
+ inbuf = Rast_allocate_input_buf(map_type);
+
+ outfiles = G_malloc(xtiles * sizeof(int));
+
+ G_debug(1, "X: %d * %d, Y: %d * %d",
+ xtiles, dst_w.cols, ytiles, dst_w.rows);
+
+ for (ytile = 0; ytile < ytiles; ytile++) {
+ G_debug(1, "reading y tile: %d", ytile);
+ for (xtile = 0; xtile < xtiles; xtile++) {
+ char name[GNAME_MAX];
+ sprintf(name, "%s-%03d-%03d", parm.rastout->answer, ytile, xtile);
+ outfiles[xtile] = Rast_open_new(name, map_type);
+ }
+
+ for (y = 0; y < dst_w.rows; y++) {
+ int row = ytile * dst_w.rows + y;
+ G_debug(1, "reading row: %d", row);
+ Rast_get_row(infile, inbuf, row, map_type);
+ for (xtile = 0; xtile < xtiles; xtile++) {
+ void *ptr = G_incr_void_ptr(inbuf, xtile * xtile_size);
+ Rast_put_row(outfiles[xtile], ptr, map_type);
+ }
+ }
+
+ for (xtile = 0; xtile < xtiles; xtile++) {
+ Rast_close(outfiles[xtile]);
+ write_support_files(xtile, ytile);
+ }
+ }
+
+ Rast_close(infile);
+
+ return EXIT_SUCCESS;
+}
+
+static void write_support_files(int xtile, int ytile)
+{
+ char name[GNAME_MAX];
+ struct Cell_head cellhd;
+ char title[64];
+ struct History history;
+ struct Colors colors;
+
+ sprintf(name, "%s-%03d-%03d", parm.rastout->answer, ytile, xtile);
+
+ Rast_get_cellhd(name, G_mapset(), &cellhd);
+
+ cellhd.north = src_w.north - ytile * dst_w.rows * src_w.ns_res;
+ cellhd.south = cellhd.north - dst_w.rows * src_w.ns_res;
+ cellhd.west = src_w.west + xtile * dst_w.cols * src_w.ew_res;
+ cellhd.east = cellhd.west + dst_w.cols * src_w.ew_res;
+
+ Rast_put_cellhd(name, &cellhd);
+
+ /* record map metadata/history info */
+
+ sprintf(title, "Tile %d,%d of %s", xtile, ytile, parm.rastin->answer);
+ Rast_put_cell_title(parm.rastout->answer, title);
+
+ Rast_short_history(name, "raster", &history);
+ Rast_set_history(&history, HIST_DATSRC_1, parm.rastin->answer);
+ Rast_command_history(&history);
+ Rast_write_history(name, &history);
+
+ /* copy color table from source map */
+ if (Rast_read_colors(parm.rastin->answer, "", &colors) < 0)
+ G_fatal_error(_("Unable to read color table for %s"),
+ parm.rastin->answer);
+ if (map_type != CELL_TYPE)
+ Rast_mark_colors_as_fp(&colors);
+ Rast_write_colors(name, G_mapset(), &colors);
+}
+
Added: grass/trunk/raster/r.tile/r.tile.html
===================================================================
--- grass/trunk/raster/r.tile/r.tile.html (rev 0)
+++ grass/trunk/raster/r.tile/r.tile.html 2013-03-25 02:54:36 UTC (rev 55511)
@@ -0,0 +1,14 @@
+<h2>DESCRIPTION</h2>
+
+<h2>NOTES</h2>
+
+<h2>SEE ALSO</h2>
+
+<em><a href="g.region.html">g.region</a></em>,
+<em><a href="r3.retile.html">r3.retile</a></em>,
+
+<h2>AUTHOR</h2>
+
+Glynn Clements
+
+<p><i>Last changed: $Date: 2011-11-08 21:24:20 +0000 (Tue, 08 Nov 2011) $</i>
More information about the grass-commit
mailing list