/* ---------------------------------------------------------------------- */ void setFlowAccuColorTable(char* cellname) { struct Colors colors; const char *mapset; struct Range r; mapset = G_find_raster(cellname, ""); if (mapset == NULL) { G_fatal_error (_("Raster map <%s> not found"), cellname); } if (Rast_read_range(cellname, mapset, &r) == -1) { G_fatal_error(_("cannot read range")); } /*fprintf(stderr, "%s range is: min=%d, max=%d\n", cellname, r.min, r.max);*/ int v[6]; v[0] = r.min; v[1] = 5; v[2] = 30; v[3] = 100; v[4] = 1000; v[5] = r.max; Rast_init_colors(&colors); Rast_add_c_color_rule(&v[0], 255,255,255, &v[1], 255,255,0, &colors); Rast_add_c_color_rule(&v[1], 255,255,0, &v[2], 0,255,255, &colors); Rast_add_c_color_rule(&v[2], 0,255,255, &v[3], 0,127,255, &colors); Rast_add_c_color_rule(&v[3], 0,127,255, &v[4], 0,0,255, &colors); Rast_add_c_color_rule(&v[4], 0,0,255, &v[5], 0,0,0, &colors); Rast_write_colors(cellname, mapset, &colors); Rast_free_colors(&colors); }
int write_contrast_colors (char* raster) { struct Colors colors; struct Categories cats; FCOLORS fcolors[9]={ /* colors for positive openness */ {-2500, 0, 0, 50, NULL}, {-100, 0, 0, 56, NULL}, {-15, 0, 56, 128, NULL}, {-3, 0, 128, 255, NULL}, {0, 255, 255, 255, NULL}, {3, 255, 128, 0, NULL}, {15, 128, 56, 0, NULL}, {100, 56, 0, 0, NULL}, {2500, 50, 0, 0, NULL}}; int i; Rast_init_colors(&colors); for(i=0;i<8;++i) Rast_add_d_color_rule( &fcolors[i].cat, fcolors[i].r, fcolors[i].g, fcolors[i].b, &fcolors[i+1].cat, fcolors[i+1].r, fcolors[i+1].g, fcolors[i+1].b, &colors); Rast_write_colors(raster, G_mapset(), &colors); Rast_free_colors(&colors); /* Rast_init_cats("Forms", &cats); for(i=0;i<8;++i) Rast_set_cat(&ccolors[i].cat, &ccolors[i].cat, ccolors[i].label, &cats, CELL_TYPE); Rast_write_cats(raster, &cats); Rast_free_cats(&cats); */ return 0; }
/*! \brief Unload color table \param color_data color data buffer \return -1 on failure \return 1 on success */ int Gvl_unload_colors_data(void *color_data) { Rast_free_colors(color_data); G_free(color_data); return (1); }
int support(char **names, struct Cell_stats *statf, int nfiles, struct Categories *cats, int *cats_ok, struct Colors *colr, int *colr_ok, RASTER_MAP_TYPE out_type) { int i; struct Categories pcats; struct Colors pcolr; CELL n; long count; int red, grn, blu; int do_cats, do_colr; *cats_ok = 1; *colr_ok = 1; if (Rast_read_cats(names[0], "", cats) < 0) *cats_ok = 0; G_suppress_warnings(1); if (Rast_read_colors(names[0], "", colr) < 0) *colr_ok = 0; G_suppress_warnings(0); if (*cats_ok == 0 && *colr_ok == 0) return 0; for (i = 1; i < nfiles; i++) { do_cats = *cats_ok && (Rast_read_cats(names[i], "", &pcats) >= 0); G_suppress_warnings(1); do_colr = *colr_ok && (Rast_read_colors(names[i], "", &pcolr) >= 0); G_suppress_warnings(0); if (!do_cats && !do_colr) continue; if (out_type == CELL_TYPE) { Rast_rewind_cell_stats(statf + i); while (Rast_next_cell_stat(&n, &count, statf + i)) if (n && !Rast_find_cell_stat(n, &count, statf)) { if (do_cats) { Rast_update_cell_stats(&n, 1, statf); Rast_set_c_cat(&n, &n, Rast_get_c_cat((CELL *) &n, &pcats), cats); } if (do_colr) { Rast_get_c_color(&n, &red, &grn, &blu, &pcolr); Rast_set_c_color(n, red, grn, blu, colr); } } } /* else the color will be the color of the first map */ if (do_cats) Rast_free_cats(&pcats); if (do_colr) /* otherwise this memory is used in colr pointer */ Rast_free_colors(&pcolr); } return 1; }
/*! \brief Pack color table (floating-point map) Passed a array of floats that will be converted from cell values to packed colors (0xbbggrr) and float to int Floating point data not freed here, use: gsds_free_data_buff(id, ATTY_FLOAT) \param filename raster map name \param fbuf \param ibuf \param rows number of rows \param cols number of cols */ void Gs_pack_colors_float(const char *filename, float *fbuf, int *ibuf, int rows, int cols) { const char *mapset; struct Colors colrules; unsigned char *r, *g, *b, *set; int i, j, *icur; FCELL *fcur; mapset = G_find_raster2(filename, ""); if (!mapset) { G_warning(_("Raster map <%s> not found"), filename); return; } r = (unsigned char *)G_malloc(cols); g = (unsigned char *)G_malloc(cols); b = (unsigned char *)G_malloc(cols); set = (unsigned char *)G_malloc(cols); Rast_read_colors(filename, mapset, &colrules); fcur = fbuf; icur = ibuf; G_message(_("Translating colors from raster map <%s>..."), G_fully_qualified_name(filename, mapset)); for (i = 0; i < rows; i++) { Rast_lookup_f_colors(fcur, r, g, b, set, cols, &colrules); G_percent(i, rows, 2); for (j = 0; j < cols; j++) { if (set[j]) { icur[j] = (r[j] & 0xff) | ((g[j] & 0xff) << 8) | ((b[j] & 0xff) << 16); } else { icur[j] = NO_DATA_COL; } } icur = &(icur[cols]); fcur = &(fcur[cols]); } G_percent(1, 1, 1); Rast_free_colors(&colrules); G_free(r); G_free(g); G_free(b); G_free(set); return; }
int table_toggle(char *name, char *mapset, struct Colors *colors) { CELL min, max; char *msg = '\0'; char info[100]; Rast_get_c_color_range(&min, &max, colors); Rast_free_colors(colors); sprintf(info, "Color range: %d to %d\n", min, max); toggle_number++; toggle_number &= 6; switch (toggle_number) { case 0: msg = "Original colors"; Rast_read_colors(name, mapset, colors); break; case 1: msg = "Ramp colors"; Rast_make_ramp_colors(colors, min, max); break; case 2: msg = "Grey scale colors"; Rast_make_grey_scale_colors(colors, min, max); break; case 3: msg = "Random colors"; Rast_make_random_colors(colors, min, max); break; case 4: msg = "Wave colors"; Rast_make_wave_colors(colors, min, max); break; case 5: msg = "Aspect colors"; Rast_make_aspect_colors(colors, min, max); break; } Write_message(2, msg); Write_message(3, info); return 0; }
int write_form_cat_colors (char* raster, CATCOLORS* ccolors) { struct Colors colors; struct Categories cats; int i; Rast_init_colors(&colors); for(i=1;i<CNT;++i) Rast_add_color_rule( &ccolors[i].cat, ccolors[i].r, ccolors[i].g, ccolors[i].b, &ccolors[i].cat, ccolors[i].r, ccolors[i].g, ccolors[i].b, &colors, CELL_TYPE); Rast_write_colors(raster, G_mapset(), &colors); Rast_free_colors(&colors); Rast_init_cats("Forms", &cats); for(i=1;i<CNT;++i) Rast_set_cat(&ccolors[i].cat, &ccolors[i].cat, ccolors[i].label, &cats, CELL_TYPE); Rast_write_cats(raster, &cats); Rast_free_cats(&cats); return 0; }
/* ---------------------------------------------------------------------- */ void setSinkWatershedColorTable(char* cellname) { struct Colors colors; const char *mapset; struct Range r; mapset = G_find_raster(cellname, ""); if (mapset == NULL) { G_fatal_error (_("Raster map <%s> not found"), cellname); } if (Rast_read_range(cellname, mapset, &r) == -1) { G_fatal_error(_("cannot read range")); } Rast_init_colors(&colors); Rast_make_random_colors(&colors, 1, r.max); Rast_write_colors(cellname, mapset, &colors); Rast_free_colors(&colors); }
void write_cols(void) { struct Colors colours; CELL val1, val2; Rast_init_colors(&colours); val1 = FLAT; val2 = PIT; Rast_add_c_color_rule(&val1, 180, 180, 180, /* White */ &val2, 0, 0, 0, &colours); /* Black */ val1 = CHANNEL; val2 = PASS; Rast_add_c_color_rule(&val1, 0, 0, 255, /* Blue */ &val2, 0, 255, 0, &colours); /* Green */ val1 = RIDGE; val2 = PEAK; Rast_add_c_color_rule(&val1, 255, 255, 0, /* Yellow */ &val2, 255, 0, 0, &colours); /* Red */ Rast_write_colors(rast_out_name, G_mapset(), &colours); Rast_free_colors(&colours); }
int main(int argc, char *argv[]) { char *name, *outfile; const char *unit; int unit_id; double factor; int fd, projection; FILE *fp, *coor_fp; double res; char *null_string; char ebuf[256], nbuf[256], label[512], formatbuff[256]; char b1[100], b2[100]; int n; int havefirst = FALSE; int coords = 0, i, k = -1; double e1, e2, n1, n2; RASTER_MAP_TYPE data_type; struct Cell_head window; struct { struct Option *opt1, *profile, *res, *output, *null_str, *coord_file, *units; struct Flag *g, *c, *m; } parm; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("profile")); module->description = _("Outputs the raster map layer values lying on user-defined line(s)."); parm.opt1 = G_define_standard_option(G_OPT_R_INPUT); parm.output = G_define_standard_option(G_OPT_F_OUTPUT); parm.output->required = NO; parm.output->answer = "-"; parm.output->description = _("Name of file for output (use output=- for stdout)"); parm.profile = G_define_standard_option(G_OPT_M_COORDS); parm.profile->required = NO; parm.profile->multiple = YES; parm.profile->description = _("Profile coordinate pairs"); parm.coord_file = G_define_standard_option(G_OPT_F_INPUT); parm.coord_file->key = "file"; parm.coord_file->required = NO; parm.coord_file->label = _("Name of input file containing coordinate pairs"); parm.coord_file->description = _("Use instead of the 'coordinates' option. " "\"-\" reads from stdin."); parm.res = G_define_option(); parm.res->key = "resolution"; parm.res->type = TYPE_DOUBLE; parm.res->required = NO; parm.res->description = _("Resolution along profile (default = current region resolution)"); parm.null_str = G_define_option(); parm.null_str->key = "null"; parm.null_str->type = TYPE_STRING; parm.null_str->required = NO; parm.null_str->answer = "*"; parm.null_str->description = _("Character to represent no data cell"); parm.g = G_define_flag(); parm.g->key = 'g'; parm.g->description = _("Output easting and northing in first two columns of four column output"); parm.c = G_define_flag(); parm.c->key = 'c'; parm.c->description = _("Output RRR:GGG:BBB color values for each profile point"); parm.units = G_define_standard_option(G_OPT_M_UNITS); parm.units->options = "meters,kilometers,feet,miles"; parm.units->label = parm.units->description; parm.units->description = _("If units are not specified, current location units are used. " "Meters are used by default in geographic (latlon) locations."); if (G_parser(argc, argv)) exit(EXIT_FAILURE); clr = 0; if (parm.c->answer) clr = 1; /* color output */ null_string = parm.null_str->answer; if ((parm.profile->answer && parm.coord_file->answer) || (!parm.profile->answer && !parm.coord_file->answer)) G_fatal_error(_("Either use profile option or coordinate_file " " option, but not both")); G_get_window(&window); projection = G_projection(); /* get conversion factor and units name */ if (parm.units->answer) { unit_id = G_units(parm.units->answer); factor = 1. / G_meters_to_units_factor(unit_id); unit = G_get_units_name(unit_id, 1, 0); } /* keep meters in case of latlon */ else if (projection == PROJECTION_LL) { factor = 1; unit = "meters"; } else { /* get conversion factor to current units */ unit = G_database_unit_name(1); factor = G_database_units_to_meters_factor(); } if (parm.res->answer) { res = atof(parm.res->answer); /* Catch bad resolution ? */ if (res <= 0) G_fatal_error(_("Illegal resolution %g [%s]"), res / factor, unit); } else { /* Do average of EW and NS res */ res = (window.ew_res + window.ns_res) / 2; } G_message(_("Using resolution: %g [%s]"), res / factor, unit); G_begin_distance_calculations(); /* Open Input File for reading */ /* Get Input Name */ name = parm.opt1->answer; if (parm.g->answer) coords = 1; /* Open Raster File */ fd = Rast_open_old(name, ""); /* initialize color structure */ if (clr) Rast_read_colors(name, "", &colors); /* Open ASCII file for output or stdout */ outfile = parm.output->answer; if ((strcmp("-", outfile)) == 0) { fp = stdout; } else if (NULL == (fp = fopen(outfile, "w"))) G_fatal_error(_("Unable to open file <%s>"), outfile); /* Get Raster Type */ data_type = Rast_get_map_type(fd); /* Done with file */ /* Show message giving output format */ G_message(_("Output columns:")); if (coords == 1) sprintf(formatbuff, _("Easting, Northing, Along track dist. [%s], Elevation"), unit); else sprintf(formatbuff, _("Along track dist. [%s], Elevation"), unit); if (clr) strcat(formatbuff, _(" RGB color")); G_message(formatbuff); /* Get Profile Start Coords */ if (parm.coord_file->answer) { if (strcmp("-", parm.coord_file->answer) == 0) coor_fp = stdin; else coor_fp = fopen(parm.coord_file->answer, "r"); if (coor_fp == NULL) G_fatal_error(_("Could not open <%s>"), parm.coord_file->answer); for (n = 1; input(b1, ebuf, b2, nbuf, label, coor_fp); n++) { G_debug(4, "stdin line %d: ebuf=[%s] nbuf=[%s]", n, ebuf, nbuf); if (!G_scan_easting(ebuf, &e2, G_projection()) || !G_scan_northing(nbuf, &n2, G_projection())) G_fatal_error(_("Invalid coordinates %s %s"), ebuf, nbuf); if (havefirst) do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); e1 = e2; n1 = n2; havefirst = TRUE; } if (coor_fp != stdin) fclose(coor_fp); } else { /* Coords given on the Command Line using the profile= option */ for (i = 0; parm.profile->answers[i]; i += 2) { /* Test for number coordinate pairs */ k = i; } if (k == 0) { /* Only one coordinate pair supplied */ G_scan_easting(parm.profile->answers[0], &e1, G_projection()); G_scan_northing(parm.profile->answers[1], &n1, G_projection()); e2 = e1; n2 = n1; /* Get profile info */ do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); } else { for (i = 0; i <= k - 2; i += 2) { G_scan_easting(parm.profile->answers[i], &e1, G_projection()); G_scan_northing(parm.profile->answers[i + 1], &n1, G_projection()); G_scan_easting(parm.profile->answers[i + 2], &e2, G_projection()); G_scan_northing(parm.profile->answers[i + 3], &n2, G_projection()); /* Get profile info */ do_profile(e1, e2, n1, n2, coords, res, fd, data_type, fp, null_string, unit, factor); } } } Rast_close(fd); fclose(fp); if (clr) Rast_free_colors(&colors); exit(EXIT_SUCCESS); } /* Done with main */
int main(int argc, char **argv) { char *mapname, /* ptr to name of output layer */ *setname, /* ptr to name of input mapset */ *ipolname; /* name of interpolation method */ int fdi, /* input map file descriptor */ fdo, /* output map file descriptor */ method, /* position of method in table */ permissions, /* mapset permissions */ cell_type, /* output celltype */ cell_size, /* size of a cell in bytes */ row, col, /* counters */ irows, icols, /* original rows, cols */ orows, ocols, have_colors, /* Input map has a colour table */ overwrite, /* Overwrite */ curr_proj; /* output projection (see gis.h) */ void *obuffer, /* buffer that holds one output row */ *obufptr; /* column ptr in output buffer */ struct cache *ibuffer; /* buffer that holds the input map */ func interpolate; /* interpolation routine */ double xcoord1, xcoord2, /* temporary x coordinates */ ycoord1, ycoord2, /* temporary y coordinates */ col_idx, /* column index in input matrix */ row_idx, /* row index in input matrix */ onorth, osouth, /* save original border coords */ oeast, owest, inorth, isouth, ieast, iwest; char north_str[30], south_str[30], east_str[30], west_str[30]; struct Colors colr; /* Input map colour table */ struct History history; struct pj_info iproj, /* input map proj parameters */ oproj; /* output map proj parameters */ struct Key_Value *in_proj_info, /* projection information of */ *in_unit_info, /* input and output mapsets */ *out_proj_info, *out_unit_info; struct GModule *module; struct Flag *list, /* list files in source location */ *nocrop, /* don't crop output map */ *print_bounds, /* print output bounds and exit */ *gprint_bounds; /* same but print shell style */ struct Option *imapset, /* name of input mapset */ *inmap, /* name of input layer */ *inlocation, /* name of input location */ *outmap, /* name of output layer */ *indbase, /* name of input database */ *interpol, /* interpolation method: nearest neighbor, bilinear, cubic */ *memory, /* amount of memory for cache */ *res; /* resolution of target map */ struct Cell_head incellhd, /* cell header of input map */ outcellhd; /* and output map */ G_gisinit(argv[0]); module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("projection")); G_add_keyword(_("transformation")); module->description = _("Re-projects a raster map from given location to the current location."); inmap = G_define_standard_option(G_OPT_R_INPUT); inmap->description = _("Name of input raster map to re-project"); inmap->required = NO; inmap->guisection = _("Source"); inlocation = G_define_option(); inlocation->key = "location"; inlocation->type = TYPE_STRING; inlocation->required = YES; inlocation->description = _("Location containing input raster map"); inlocation->gisprompt = "old,location,location"; inlocation->key_desc = "name"; imapset = G_define_standard_option(G_OPT_M_MAPSET); imapset->label = _("Mapset containing input raster map"); imapset->description = _("default: name of current mapset"); imapset->guisection = _("Source"); indbase = G_define_option(); indbase->key = "dbase"; indbase->type = TYPE_STRING; indbase->required = NO; indbase->description = _("Path to GRASS database of input location"); indbase->gisprompt = "old,dbase,dbase"; indbase->key_desc = "path"; indbase->guisection = _("Source"); outmap = G_define_standard_option(G_OPT_R_OUTPUT); outmap->required = NO; outmap->description = _("Name for output raster map (default: same as 'input')"); outmap->guisection = _("Target"); ipolname = make_ipol_list(); interpol = G_define_option(); interpol->key = "method"; interpol->type = TYPE_STRING; interpol->required = NO; interpol->answer = "nearest"; interpol->options = ipolname; interpol->description = _("Interpolation method to use"); interpol->guisection = _("Target"); interpol->descriptions = make_ipol_desc(); memory = G_define_option(); memory->key = "memory"; memory->type = TYPE_INTEGER; memory->required = NO; memory->description = _("Cache size (MiB)"); res = G_define_option(); res->key = "resolution"; res->type = TYPE_DOUBLE; res->required = NO; res->description = _("Resolution of output raster map"); res->guisection = _("Target"); list = G_define_flag(); list->key = 'l'; list->description = _("List raster maps in input location and exit"); nocrop = G_define_flag(); nocrop->key = 'n'; nocrop->description = _("Do not perform region cropping optimization"); print_bounds = G_define_flag(); print_bounds->key = 'p'; print_bounds->description = _("Print input map's bounds in the current projection and exit"); print_bounds->guisection = _("Target"); gprint_bounds = G_define_flag(); gprint_bounds->key = 'g'; gprint_bounds->description = _("Print input map's bounds in the current projection and exit (shell style)"); gprint_bounds->guisection = _("Target"); /* The parser checks if the map already exists in current mapset, we switch out the check and do it in the module after the parser */ overwrite = G_check_overwrite(argc, argv); if (G_parser(argc, argv)) exit(EXIT_FAILURE); /* get the method */ for (method = 0; (ipolname = menu[method].name); method++) if (strcmp(ipolname, interpol->answer) == 0) break; if (!ipolname) G_fatal_error(_("<%s=%s> unknown %s"), interpol->key, interpol->answer, interpol->key); interpolate = menu[method].method; mapname = outmap->answer ? outmap->answer : inmap->answer; if (mapname && !list->answer && !overwrite && G_find_raster(mapname, G_mapset())) G_fatal_error(_("option <%s>: <%s> exists."), "output", mapname); setname = imapset->answer ? imapset->answer : G_store(G_mapset()); if (strcmp(inlocation->answer, G_location()) == 0 && (!indbase->answer || strcmp(indbase->answer, G_gisdbase()) == 0)) #if 0 G_fatal_error(_("Input and output locations can not be the same")); #else G_warning(_("Input and output locations are the same")); #endif G_get_window(&outcellhd); if(gprint_bounds->answer && !print_bounds->answer) print_bounds->answer = gprint_bounds->answer; curr_proj = G_projection(); /* Get projection info for output mapset */ if ((out_proj_info = G_get_projinfo()) == NULL) G_fatal_error(_("Unable to get projection info of output raster map")); if ((out_unit_info = G_get_projunits()) == NULL) G_fatal_error(_("Unable to get projection units of output raster map")); if (pj_get_kv(&oproj, out_proj_info, out_unit_info) < 0) G_fatal_error(_("Unable to get projection key values of output raster map")); /* Change the location */ G__create_alt_env(); G__setenv("GISDBASE", indbase->answer ? indbase->answer : G_gisdbase()); G__setenv("LOCATION_NAME", inlocation->answer); permissions = G__mapset_permissions(setname); if (permissions < 0) /* can't access mapset */ G_fatal_error(_("Mapset <%s> in input location <%s> - %s"), setname, inlocation->answer, permissions == 0 ? _("permission denied") : _("not found")); /* if requested, list the raster maps in source location - MN 5/2001 */ if (list->answer) { int i; char **list; G_verbose_message(_("Checking location <%s> mapset <%s>"), inlocation->answer, setname); list = G_list(G_ELEMENT_RASTER, G__getenv("GISDBASE"), G__getenv("LOCATION_NAME"), setname); for (i = 0; list[i]; i++) { fprintf(stdout, "%s\n", list[i]); } fflush(stdout); exit(EXIT_SUCCESS); /* leave r.proj after listing */ } if (!inmap->answer) G_fatal_error(_("Required parameter <%s> not set"), inmap->key); if (!G_find_raster(inmap->answer, setname)) G_fatal_error(_("Raster map <%s> in location <%s> in mapset <%s> not found"), inmap->answer, inlocation->answer, setname); /* Read input map colour table */ have_colors = Rast_read_colors(inmap->answer, setname, &colr); /* Get projection info for input mapset */ if ((in_proj_info = G_get_projinfo()) == NULL) G_fatal_error(_("Unable to get projection info of input map")); if ((in_unit_info = G_get_projunits()) == NULL) G_fatal_error(_("Unable to get projection units of input map")); if (pj_get_kv(&iproj, in_proj_info, in_unit_info) < 0) G_fatal_error(_("Unable to get projection key values of input map")); G_free_key_value(in_proj_info); G_free_key_value(in_unit_info); G_free_key_value(out_proj_info); G_free_key_value(out_unit_info); if (G_verbose() > G_verbose_std()) pj_print_proj_params(&iproj, &oproj); /* this call causes r.proj to read the entire map into memeory */ Rast_get_cellhd(inmap->answer, setname, &incellhd); Rast_set_input_window(&incellhd); if (G_projection() == PROJECTION_XY) G_fatal_error(_("Unable to work with unprojected data (xy location)")); /* Save default borders so we can show them later */ inorth = incellhd.north; isouth = incellhd.south; ieast = incellhd.east; iwest = incellhd.west; irows = incellhd.rows; icols = incellhd.cols; onorth = outcellhd.north; osouth = outcellhd.south; oeast = outcellhd.east; owest = outcellhd.west; orows = outcellhd.rows; ocols = outcellhd.cols; if (print_bounds->answer) { G_message(_("Input map <%s@%s> in location <%s>:"), inmap->answer, setname, inlocation->answer); if (pj_do_proj(&iwest, &isouth, &iproj, &oproj) < 0) G_fatal_error(_("Error in pj_do_proj (projection of input coordinate pair)")); if (pj_do_proj(&ieast, &inorth, &iproj, &oproj) < 0) G_fatal_error(_("Error in pj_do_proj (projection of input coordinate pair)")); G_format_northing(inorth, north_str, curr_proj); G_format_northing(isouth, south_str, curr_proj); G_format_easting(ieast, east_str, curr_proj); G_format_easting(iwest, west_str, curr_proj); if(gprint_bounds->answer) { fprintf(stdout, "n=%s s=%s w=%s e=%s rows=%d cols=%d\n", north_str, south_str, west_str, east_str, irows, icols); } else { fprintf(stdout, "Source cols: %d\n", icols); fprintf(stdout, "Source rows: %d\n", irows); fprintf(stdout, "Local north: %s\n", north_str); fprintf(stdout, "Local south: %s\n", south_str); fprintf(stdout, "Local west: %s\n", west_str); fprintf(stdout, "Local east: %s\n", east_str); } /* somehow approximate local ewres, nsres ?? (use 'g.region -m' on lat/lon side) */ exit(EXIT_SUCCESS); } /* Cut non-overlapping parts of input map */ if (!nocrop->answer) bordwalk(&outcellhd, &incellhd, &oproj, &iproj); /* Add 2 cells on each side for bilinear/cubic & future interpolation methods */ /* (should probably be a factor based on input and output resolution) */ incellhd.north += 2 * incellhd.ns_res; incellhd.east += 2 * incellhd.ew_res; incellhd.south -= 2 * incellhd.ns_res; incellhd.west -= 2 * incellhd.ew_res; if (incellhd.north > inorth) incellhd.north = inorth; if (incellhd.east > ieast) incellhd.east = ieast; if (incellhd.south < isouth) incellhd.south = isouth; if (incellhd.west < iwest) incellhd.west = iwest; Rast_set_input_window(&incellhd); /* And switch back to original location */ G__switch_env(); /* Adjust borders of output map */ if (!nocrop->answer) bordwalk(&incellhd, &outcellhd, &iproj, &oproj); #if 0 outcellhd.west = outcellhd.south = HUGE_VAL; outcellhd.east = outcellhd.north = -HUGE_VAL; for (row = 0; row < incellhd.rows; row++) { ycoord1 = Rast_row_to_northing((double)(row + 0.5), &incellhd); for (col = 0; col < incellhd.cols; col++) { xcoord1 = Rast_col_to_easting((double)(col + 0.5), &incellhd); pj_do_proj(&xcoord1, &ycoord1, &iproj, &oproj); if (xcoord1 > outcellhd.east) outcellhd.east = xcoord1; if (ycoord1 > outcellhd.north) outcellhd.north = ycoord1; if (xcoord1 < outcellhd.west) outcellhd.west = xcoord1; if (ycoord1 < outcellhd.south) outcellhd.south = ycoord1; } } #endif if (res->answer != NULL) /* set user defined resolution */ outcellhd.ns_res = outcellhd.ew_res = atof(res->answer); G_adjust_Cell_head(&outcellhd, 0, 0); Rast_set_output_window(&outcellhd); G_message(" "); G_message(_("Input:")); G_message(_("Cols: %d (%d)"), incellhd.cols, icols); G_message(_("Rows: %d (%d)"), incellhd.rows, irows); G_message(_("North: %f (%f)"), incellhd.north, inorth); G_message(_("South: %f (%f)"), incellhd.south, isouth); G_message(_("West: %f (%f)"), incellhd.west, iwest); G_message(_("East: %f (%f)"), incellhd.east, ieast); G_message(_("EW-res: %f"), incellhd.ew_res); G_message(_("NS-res: %f"), incellhd.ns_res); G_message(" "); G_message(_("Output:")); G_message(_("Cols: %d (%d)"), outcellhd.cols, ocols); G_message(_("Rows: %d (%d)"), outcellhd.rows, orows); G_message(_("North: %f (%f)"), outcellhd.north, onorth); G_message(_("South: %f (%f)"), outcellhd.south, osouth); G_message(_("West: %f (%f)"), outcellhd.west, owest); G_message(_("East: %f (%f)"), outcellhd.east, oeast); G_message(_("EW-res: %f"), outcellhd.ew_res); G_message(_("NS-res: %f"), outcellhd.ns_res); G_message(" "); /* open and read the relevant parts of the input map and close it */ G__switch_env(); Rast_set_input_window(&incellhd); fdi = Rast_open_old(inmap->answer, setname); cell_type = Rast_get_map_type(fdi); ibuffer = readcell(fdi, memory->answer); Rast_close(fdi); G__switch_env(); Rast_set_output_window(&outcellhd); if (strcmp(interpol->answer, "nearest") == 0) { fdo = Rast_open_new(mapname, cell_type); obuffer = (CELL *) Rast_allocate_output_buf(cell_type); } else { fdo = Rast_open_fp_new(mapname); cell_type = FCELL_TYPE; obuffer = (FCELL *) Rast_allocate_output_buf(cell_type); } cell_size = Rast_cell_size(cell_type); xcoord1 = xcoord2 = outcellhd.west + (outcellhd.ew_res / 2); /**/ ycoord1 = ycoord2 = outcellhd.north - (outcellhd.ns_res / 2); /**/ G_important_message(_("Projecting...")); G_percent(0, outcellhd.rows, 2); for (row = 0; row < outcellhd.rows; row++) { obufptr = obuffer; for (col = 0; col < outcellhd.cols; col++) { /* project coordinates in output matrix to */ /* coordinates in input matrix */ if (pj_do_proj(&xcoord1, &ycoord1, &oproj, &iproj) < 0) Rast_set_null_value(obufptr, 1, cell_type); else { /* convert to row/column indices of input matrix */ col_idx = (xcoord1 - incellhd.west) / incellhd.ew_res; row_idx = (incellhd.north - ycoord1) / incellhd.ns_res; /* and resample data point */ interpolate(ibuffer, obufptr, cell_type, &col_idx, &row_idx, &incellhd); } obufptr = G_incr_void_ptr(obufptr, cell_size); xcoord2 += outcellhd.ew_res; xcoord1 = xcoord2; ycoord1 = ycoord2; } Rast_put_row(fdo, obuffer, cell_type); xcoord1 = xcoord2 = outcellhd.west + (outcellhd.ew_res / 2); ycoord2 -= outcellhd.ns_res; ycoord1 = ycoord2; G_percent(row, outcellhd.rows - 1, 2); } Rast_close(fdo); if (have_colors > 0) { Rast_write_colors(mapname, G_mapset(), &colr); Rast_free_colors(&colr); } Rast_short_history(mapname, "raster", &history); Rast_command_history(&history); Rast_write_history(mapname, &history); G_done_msg(NULL); exit(EXIT_SUCCESS); }
void set_map(char *name, char *name1, char *name2, struct Cell_head window, int top, int bot, int left, int right) { char cmd[30], cmd1[30], cmd2[30], **sel; int i, j, btn, d, class, top0, bot0, right0, left0, paint = 0, method; double msc[2], dtmp; /* VARIABLES IN: name = raster map name to be set up name1 = overlay vector map name name2 = overlay site map name */ colors_old = (struct Colors *)G_malloc(1 * sizeof(struct Colors)); Rast_init_colors(colors_old); Rast_read_colors(name, G_mapset(), colors_old); G_system("clear"); paint_map(name, name1, name2); paint = 1; /* setup the screen to raster map coordinate conversion system */ scr_cell(&window, top, bot, left, right, msc); top0 = top; bot0 = bot; left0 = left; right0 = right; /* display the menu and instructions */ again: if (!paint) { if (G_yes ("\n Refresh the screen before choosing more setup? ", 1)) paint_map(name, name1, name2); } else G_system("clear"); fprintf(stderr, "\n\n CHOOSE THE SETUP OPTION:\n\n"); fprintf(stderr, " Draw sampling regions 1\n"); fprintf(stderr, " Setup a sampling frame 2\n"); fprintf(stderr, " Setup sampling units 3\n"); fprintf(stderr, " Setup a moving window 4\n"); fprintf(stderr, " Setup group or class limits 5\n"); fprintf(stderr, " Change the raster map color table 6\n"); fprintf(stderr, " Exit and save setup 7\n"); do { fprintf(stderr, "\n Which Number? "); dtmp = 5.0; numtrap(1, &dtmp); if ((method = fabs(dtmp)) > 7 || method < 1) { fprintf(stderr, "\n Choice must between 1-7; try again"); } } while (method > 7 || method < 1); /* setup regions */ if (method == 1) set_rgn(msc, name, name1, name2); /* setup the sampling frame */ else if (method == 2) { top = top0; bot = bot0; right = right0; left = left0; set_frame(msc, &top, &bot, &left, &right); } /* setup sampling units */ else if (method == 3) { sample(top, bot, left, right, name, name1, name2, msc); } /* setup the moving window */ else if (method == 4) { mov_wind(top, bot, left, right, name, name1, name2, msc); } /* setup group/class limits */ else if (method == 5) { /* setup the buffer to store the user's input */ sel = (char **)G_malloc(10 * sizeof(char *)); for (i = 0; i < 9; i++) sel[i] = (char *)G_calloc(2, sizeof(char)); back: ask_group(sel); /* check for no input */ if (sel[0][0] != 'x' && sel[1][0] != 'x' && sel[2][0] != 'x' && sel[3][0] != 'x' && sel[4][0] != 'x' && sel[5][0] != 'x' && sel[6][0] != 'x' && sel[7][0] != 'x' && sel[8][0] != 'x') { G_system("clear"); fprintf(stderr, " Did you mean to not make any attribute group"); if (!G_yes("\n or index class setup choices? ", 1)) goto back; } /* if there is input, then invoke the group/class setup module and then free the memory allocated for selections */ else { get_group_drv(sel); for (i = 0; i < 9; i++) G_free(sel[i]); G_free(sel); } } /* change color tables */ else if (method == 6) change_color(name, name1, name2); /* reset the colortable and exit */ else if (method == 7) { Rast_write_colors(name, G_mapset(), colors_old); Rast_free_colors(colors_old); /* R_close_driver(); */ G_system("d.frame -e"); exit(0); } paint = 0; goto again; return; }
int close_array_seg(void) { struct Colors colors; int incr, max, red, green, blue, rd, gr, bl, flag; int c, r, map_fd; CELL *cellrow, value; CELL *theseg; RAMSEG thesegseg; cellrow = Rast_allocate_c_buf(); if (seg_flag || bas_flag || haf_flag) { if (seg_flag) { theseg = bas; thesegseg = bas_seg; } else if (bas_flag) { theseg = bas; thesegseg = bas_seg; } else { theseg = haf; thesegseg = haf_seg; } max = n_basins; G_debug(1, "%d basins created", max); Rast_init_colors(&colors); if (max > 0) Rast_make_random_colors(&colors, 1, max); else { G_warning(_("No basins were created. Verify threshold and region settings.")); Rast_make_random_colors(&colors, 1, 2); } if (max < 1000 && max > 0) { Rast_set_c_color((CELL) 0, 0, 0, 0, &colors); r = 1; incr = 0; while (incr >= 0) { G_percent(r, max, 2); for (gr = 130 + incr; gr <= 255; gr += 20) { for (rd = 90 + incr; rd <= 255; rd += 30) { for (bl = 90 + incr; bl <= 255; bl += 40) { flag = 1; while (flag) { Rast_get_c_color(&r, &red, &green, &blue, &colors); /* if existing rule is too dark then append a new rule to override it */ if ((blue * .11 + red * .30 + green * .59) < 100) { Rast_set_c_color(r, rd, gr, bl, &colors); flag = 0; } if (++r > max) { gr = rd = bl = 300; flag = 0; incr = -1; } } } } } if (incr >= 0) { incr += 15; if (incr > 120) incr = 7; } } G_percent(r - 1, max, 3); /* finish it */ } else G_debug(1, "Too many subbasins to reasonably check for color brightness"); /* using the existing stack of while/for/for/for/while loops ... */ } /* stream segments map */ if (seg_flag) { map_fd = Rast_open_c_new(seg_name); for (r = 0; r < nrows; r++) { Rast_set_c_null_value(cellrow, ncols); /* reset row to all NULL */ for (c = 0; c < ncols; c++) { value = FLAG_GET(swale, r, c); if (value) cellrow[c] = bas[SEG_INDEX(bas_seg, r, c)]; } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(seg_name, this_mapset, &colors); } /* basins map */ if (bas_flag) { map_fd = Rast_open_c_new(bas_name); for (r = 0; r < nrows; r++) { for (c = 0; c < ncols; c++) { cellrow[c] = bas[SEG_INDEX(bas_seg, r, c)]; if (cellrow[c] == 0) Rast_set_c_null_value(cellrow + c, 1); } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(bas_name, this_mapset, &colors); } /* half_basins map */ if (haf_flag) { map_fd = Rast_open_c_new(haf_name); for (r = 0; r < nrows; r++) { for (c = 0; c < ncols; c++) { cellrow[c] = haf[SEG_INDEX(haf_seg, r, c)]; if (cellrow[c] == 0) Rast_set_c_null_value(cellrow + c, 1); } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(haf_name, this_mapset, &colors); } if (seg_flag || bas_flag || haf_flag) Rast_free_colors(&colors); G_free(haf); G_free(bas); G_free(cellrow); if (arm_flag) fclose(fp); close_maps(); return 0; }
int exec_rectify(char *extension, char *interp_method, char *angle_map) { char *name; char *mapset; char *result; char *type = "raster"; int n; struct Colors colr; struct Categories cats; struct History hist; int colr_ok, cats_ok; long start_time, rectify_time; double aver_z; int elevfd; struct cache *ebuffer; G_debug(1, "Open elevation raster: "); /* open elevation raster */ select_target_env(); G_set_window(&target_window); G_debug(1, "target window: rs=%d cs=%d n=%f s=%f w=%f e=%f\n", target_window.rows, target_window.cols, target_window.north, target_window.south, target_window.west, target_window.east); elevfd = Rast_open_old(elev_name, elev_mapset); if (elevfd < 0) { G_fatal_error(_("Could not open elevation raster")); return 1; } ebuffer = readcell(elevfd, seg_mb_elev, 1); select_target_env(); Rast_close(elevfd); /* get an average elevation of the control points */ /* this is used only if target cells have no elevation */ get_aver_elev(&group.control_points, &aver_z); G_message("-----------------------------------------------"); /* rectify each file */ for (n = 0; n < group.group_ref.nfiles; n++) { if (!ref_list[n]) continue; name = group.group_ref.file[n].name; mapset = group.group_ref.file[n].mapset; result = G_malloc(strlen(group.group_ref.file[n].name) + strlen(extension) + 1); strcpy(result, group.group_ref.file[n].name); strcat(result, extension); G_debug(2, "ORTHO RECTIFYING:"); G_debug(2, "NAME %s", name); G_debug(2, "MAPSET %s", mapset); G_debug(2, "RESULT %s", result); G_debug(2, "select_current_env..."); select_current_env(); cats_ok = Rast_read_cats(name, mapset, &cats) >= 0; colr_ok = Rast_read_colors(name, mapset, &colr) > 0; /* Initialze History */ if (Rast_read_history(name, mapset, &hist) < 0) Rast_short_history(result, type, &hist); G_debug(2, "reading was fine..."); time(&start_time); G_debug(2, "Starting the rectification..."); if (rectify(name, mapset, ebuffer, aver_z, result, interp_method)) { G_debug(2, "Done. Writing results..."); select_target_env(); if (cats_ok) { Rast_write_cats(result, &cats); Rast_free_cats(&cats); } if (colr_ok) { Rast_write_colors(result, G_mapset(), &colr); Rast_free_colors(&colr); } /* Write out History */ Rast_command_history(&hist); Rast_write_history(result, &hist); select_current_env(); time(&rectify_time); report(rectify_time - start_time, 1); } else report((long)0, 0); G_free(result); } close(ebuffer->fd); release_cache(ebuffer); if (angle_map) { camera_angle(angle_map); } return 0; }
int main(int argc, char *argv[]) { char *name, *outfile; int fd, projection; FILE *fp; double res; char *null_string; char ebuf[256], nbuf[256], label[512], formatbuff[256]; char b1[100], b2[100]; int n; int havefirst = FALSE; int coords = 0, i, k = -1; double e1, e2, n1, n2; RASTER_MAP_TYPE data_type; struct Cell_head window; struct { struct Option *opt1, *profile, *res, *output, *null_str; struct Flag *g, *c; } parm; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("profile")); module->description = _("Outputs the raster map layer values lying on user-defined line(s)."); parm.opt1 = G_define_standard_option(G_OPT_R_INPUT); parm.output = G_define_option(); parm.output->key = "output"; parm.output->type = TYPE_STRING; parm.output->required = NO; parm.output->answer = "-"; parm.output->gisprompt = "new_file,file,output"; parm.output->description = _("Name of file for output (use output=- for stdout)"); parm.profile = G_define_option(); parm.profile->key = "profile"; parm.profile->type = TYPE_STRING; parm.profile->required = NO; parm.profile->multiple = YES; parm.profile->key_desc = "east,north"; parm.profile->description = _("Profile coordinate pairs"); parm.res = G_define_option(); parm.res->key = "res"; parm.res->type = TYPE_DOUBLE; parm.res->required = NO; parm.res->description = _("Resolution along profile (default = current region resolution)"); parm.null_str = G_define_option(); parm.null_str->key = "null"; parm.null_str->type = TYPE_STRING; parm.null_str->required = NO; parm.null_str->answer = "*"; parm.null_str->description = _("Character to represent no data cell"); parm.g = G_define_flag(); parm.g->key = 'g'; parm.g->description = _("Output easting and northing in first two columns of four column output"); parm.c = G_define_flag(); parm.c->key = 'c'; parm.c->description = _("Output RRR:GGG:BBB color values for each profile point"); if (G_parser(argc, argv)) exit(EXIT_FAILURE); clr = 0; if (parm.c->answer) clr = 1; /* color output */ null_string = parm.null_str->answer; G_get_window(&window); projection = G_projection(); if (parm.res->answer) { res = atof(parm.res->answer); /* Catch bad resolution ? */ if (res <= 0) G_fatal_error(_("Illegal resolution! [%g]"), res); } else { /* Do average of EW and NS res */ res = (window.ew_res + window.ns_res) / 2; } G_message(_("Using resolution [%g]"), res); G_begin_distance_calculations(); /* Open Input File for reading */ /* Get Input Name */ name = parm.opt1->answer; if (parm.g->answer) coords = 1; /* Open Raster File */ fd = Rast_open_old(name, ""); /* initialize color structure */ if (clr) Rast_read_colors(name, "", &colors); /* Open ASCII file for output or stdout */ outfile = parm.output->answer; if ((strcmp("-", outfile)) == 0) { fp = stdout; } else if (NULL == (fp = fopen(outfile, "w"))) G_fatal_error(_("Unable to open file <%s>"), outfile); /* Get Raster Type */ data_type = Rast_get_map_type(fd); /* Done with file */ /* Show message giving output format */ G_message(_("Output Format:")); if (coords == 1) sprintf(formatbuff, _("[Easting] [Northing] [Along Track Dist.(m)] [Elevation]")); else sprintf(formatbuff, _("[Along Track Dist.(m)] [Elevation]")); if (clr) strcat(formatbuff, _(" [RGB Color]")); G_message(formatbuff); /* Get Profile Start Coords */ if (!parm.profile->answer) { /* Assume input from stdin */ for (n = 1; input(b1, ebuf, b2, nbuf, label); n++) { G_debug(4, "stdin line %d: ebuf=[%s] nbuf=[%s]", n, ebuf, nbuf); if (!G_scan_easting(ebuf, &e2, G_projection()) || !G_scan_northing(nbuf, &n2, G_projection())) G_fatal_error(_("Invalid coordinates %s %s"), ebuf, nbuf); if (havefirst) do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); e1 = e2; n1 = n2; havefirst = TRUE; } } else { /* Coords from Command Line */ for (i = 0; parm.profile->answers[i]; i += 2) { /* Test for number coordinate pairs */ k = i; } if (k == 0) { /* Only one coordinate pair supplied */ G_scan_easting(parm.profile->answers[0], &e1, G_projection()); G_scan_northing(parm.profile->answers[1], &n1, G_projection()); e2 = e1; n2 = n1; /* Get profile info */ do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); } else { for (i = 0; i <= k - 2; i += 2) { G_scan_easting(parm.profile->answers[i], &e1, G_projection()); G_scan_northing(parm.profile->answers[i + 1], &n1, G_projection()); G_scan_easting(parm.profile->answers[i + 2], &e2, G_projection()); G_scan_northing(parm.profile->answers[i + 3], &n2, G_projection()); /* Get profile info */ do_profile(e1, e2, n1, n2, name, coords, res, fd, data_type, fp, null_string); } } } Rast_close(fd); fclose(fp); if (clr) Rast_free_colors(&colors); exit(EXIT_SUCCESS); } /* Done with main */