void run_stats(const char *mapname, int nsteps, const char *tempfile, int map_type) { char buf[32]; const char *argv[12]; int argc = 0; if (map_type == MAP_TYPE_RASTER2D) { argv[argc++] = "r.stats"; argv[argc++] = "-r"; } else argv[argc++] = "r3.stats"; argv[argc++] = "-c"; argv[argc++] = mapname; sprintf(buf, "nsteps=%d", nsteps); argv[argc++] = buf; argv[argc++] = SF_REDIRECT_FILE; argv[argc++] = SF_STDOUT; argv[argc++] = SF_MODE_OUT; argv[argc++] = tempfile; argv[argc++] = NULL; if (G_vspawn_ex(argv[0], argv) != 0) G_fatal_error("error running r.stats"); }
static int profile(int coords, const char *map, const char *nulls, char **line) { double e1, n1, e2, n2; char buf[1024], profile[1024]; const char *argv[7]; int argc = 0; int n; int projection; projection = G_projection(); argv[argc++] = "r.profile"; if (coords) argv[argc++] = "-g"; sprintf(buf, "input=%s", map); argv[argc++] = G_store(buf); argv[argc++] = "output=-"; sprintf(buf, "null_value=%s", nulls); argv[argc++] = G_store(buf); strcpy(profile, "coordinates="); for (n = 0; line[n]; n += 4) { int err = parse_line("line", &line[n], &e1, &n1, &e2, &n2, projection); if (err) { G_usage(); exit(EXIT_FAILURE); } if (n > 0) strcat(profile, ","); G_format_easting(e1, buf, projection); strcat(profile, buf); G_format_northing(n1, buf, projection); strcat(profile, ","); strcat(profile, buf); G_format_easting(e2, buf, projection); strcat(profile, ","); strcat(profile, buf); G_format_northing(n2, buf, projection); strcat(profile, ","); strcat(profile, buf); } argv[argc++] = profile; argv[argc++] = NULL; G_verbose_message(_("End coordinate: %.15g, %.15g"), e2, n2); return G_vspawn_ex(argv[0], argv); }
int main(int argc, char *argv[]) { char command[GPATH_MAX]; int err, ret; struct Option *opt1; struct Option *opt2; struct Option *opt3; struct Option *opt4; struct Option *opt5; struct Option *opt6; struct Option *opt7; struct Option *opt8; struct Option *opt9; struct Option *opt10; struct Option *opt11; struct Option *opt12; struct Option *opt13; struct Option *opt14; struct Option *opt15; struct Option *opt16; struct Flag *flag_sfd; struct Flag *flag_flow; struct Flag *flag_seg; struct Flag *flag_abs; struct Flag *flag_flat; struct GModule *module; G_gisinit(argv[0]); /* Set description */ module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("hydrology")); module->description = _("Calculates hydrological parameters and RUSLE factors."); opt1 = G_define_standard_option(G_OPT_R_ELEV); opt1->guisection = _("Inputs"); opt2 = G_define_standard_option(G_OPT_R_INPUT); opt2->key = "depression"; opt2->label = _("Name of input depressions raster map"); opt2->description = _("All non-NULL and non-zero cells are considered as real depressions"); opt2->required = NO; opt2->guisection = _("Inputs"); opt3 = G_define_standard_option(G_OPT_R_INPUT); opt3->key = "flow"; opt3->description = _("Name of input raster representing amount of overland flow per cell"); opt3->required = NO; opt3->guisection = _("Inputs"); opt4 = G_define_standard_option(G_OPT_R_INPUT); opt4->key = "disturbed_land"; opt4->label = _("Name of input raster map percent of disturbed land"); opt4->description = _("For USLE"); opt4->required = NO; opt4->guisection = _("Inputs"); opt5 = G_define_standard_option(G_OPT_R_INPUT); opt5->key = "blocking"; opt5->label = _("IName of input raster map blocking overland surface flow"); opt5->description = _("For USLE. All non-NULL and non-zero cells are considered as blocking terrain."); opt5->required = NO; opt5->guisection = _("Inputs"); opt6 = G_define_option(); opt6->key = "threshold"; opt6->description = _("Minimum size of exterior watershed basin"); opt6->required = NO; opt6->type = TYPE_INTEGER; opt6->guisection = _("Inputs"); opt7 = G_define_option(); opt7->key = "max_slope_length"; opt7->label = _("Maximum length of surface flow in map units"); opt7->description = _("For USLE"); opt7->required = NO; opt7->type = TYPE_DOUBLE; opt7->guisection = _("Inputs"); opt8 = G_define_standard_option(G_OPT_R_OUTPUT); opt8->key = "accumulation"; opt8->label = _("Name for output accumulation raster map"); opt8->description = _("Number of cells that drain through each cell"); opt8->required = NO; opt8->guisection = _("Outputs"); opt9 = G_define_standard_option(G_OPT_R_OUTPUT); opt9->key = "drainage"; opt9->description = _("Name for output drainage direction raster map"); opt9->required = NO; opt9->guisection = _("Outputs"); opt10 = G_define_standard_option(G_OPT_R_OUTPUT); opt10->key = "basin"; opt10->description = _("Name for basins raster map"); opt10->description = _("Unique label for each watershed basin"); opt10->required = NO; opt10->guisection = _("Outputs"); opt11 = G_define_standard_option(G_OPT_R_OUTPUT); opt11->key = "stream"; opt11->description = _("Name for output stream segments raster map"); opt11->required = NO; opt11->guisection = _("Outputs"); opt12 = G_define_standard_option(G_OPT_R_OUTPUT); opt12->key = "half_basin"; opt12->label = _("Name for output half basins raster map"); opt12->description = _("Each half-basin is given a unique value"); opt12->required = NO; opt12->guisection = _("Outputs"); opt13 = G_define_standard_option(G_OPT_R_OUTPUT); opt13->key = "length_slope"; opt13->label = _("Name for output slope length raster map"); opt13->description = _("Slope length and steepness (LS) factor for USLE"); opt13->required = NO; opt13->guisection = _("Outputs"); opt14 = G_define_standard_option(G_OPT_R_OUTPUT); opt14->key = "slope_steepness"; opt14->label = _("Name for output slope steepness raster map"); opt14->description = _("Slope steepness (S) factor for USLE"); opt14->required = NO; opt14->guisection = _("Outputs"); opt15 = G_define_option(); opt15->key = "convergence"; opt15->type = TYPE_INTEGER; opt15->required = NO; opt15->answer = "5"; opt15->label = _("Convergence factor for MFD (1-10)"); opt15->description = _("1 = most diverging flow, 10 = most converging flow. Recommended: 5"); opt16 = G_define_option(); opt16->key = "memory"; opt16->type = TYPE_INTEGER; opt16->required = NO; opt16->answer = "300"; /* 300MB default value, please keep r.terraflow in sync */ opt16->description = _("Maximum memory to be used with -m flag (in MB)"); flag_sfd = G_define_flag(); flag_sfd->key = 's'; flag_sfd->label = _("SFD (D8) flow (default is MFD)"); flag_sfd->description = _("SFD: single flow direction, MFD: multiple flow direction"); flag_flow = G_define_flag(); flag_flow->key = '4'; flag_flow->description = _("Allow only horizontal and vertical flow of water"); flag_seg = G_define_flag(); flag_seg->key = 'm'; flag_seg->label = _("Enable disk swap memory option: Operation is slow"); flag_seg->description = _("Only needed if memory requirements exceed available RAM; see manual on how to calculate memory requirements"); flag_abs = G_define_flag(); flag_abs->key = 'a'; flag_abs->label = _("Use positive flow accumulation even for likely underestimates"); flag_abs->description = _("See manual for a detailed description of flow accumulation output"); flag_flat = G_define_flag(); flag_flat->key = 'b'; flag_flat->label = _("Beautify flat areas"); flag_flat->description = _("Flow direction in flat areas is modified to look prettier"); if (G_parser(argc, argv)) exit(EXIT_FAILURE); /* Check option combinations */ /* Check for some output map */ if ((opt8->answer == NULL) && (opt9->answer == NULL) && (opt10->answer == NULL) && (opt11->answer == NULL) && (opt12->answer == NULL) && (opt14->answer == NULL) && (opt15->answer == NULL)) { G_fatal_error(_("Sorry, you must choose an output map.")); } err = 0; /* basin and basin threshold */ err += (opt10->answer != NULL && opt6->answer == NULL); /* stream and basin threshold */ err += (opt11->answer != NULL && opt6->answer == NULL); /* half_basin and basin threshold */ err += (opt12->answer != NULL && opt6->answer == NULL); /* LS factor and basin threshold */ err += (opt13->answer != NULL && opt6->answer == NULL); /* S factor and basin threshold */ err += (opt14->answer != NULL && opt6->answer == NULL); if (err) { G_message(_("Sorry, if any of the following options are set:\n" " basin, stream, half_basin, length_slope, or slope_steepness\n" " you MUST provide a value for the basin " "threshold parameter.")); G_usage(); exit(EXIT_FAILURE); } /* Build command line */ sprintf(command, "%s/etc/r.watershed.%s", G_gisbase(), flag_seg->answer ? "seg" : "ram"); new_argv[new_argc++] = command; if (flag_sfd->answer) new_argv[new_argc++] = "-s"; if (flag_flow->answer) new_argv[new_argc++] = "-4"; if (flag_abs->answer) new_argv[new_argc++] = "-a"; if (flag_flat->answer && !flag_seg->answer) new_argv[new_argc++] = "-b"; if (flag_flat->answer && flag_seg->answer) G_message(_("Beautify flat areas is not yet supported for disk swap mode")); do_opt(opt1); do_opt(opt2); do_opt(opt3); do_opt(opt4); do_opt(opt5); do_opt(opt6); do_opt(opt7); do_opt(opt8); do_opt(opt9); do_opt(opt10); do_opt(opt11); do_opt(opt12); do_opt(opt13); do_opt(opt14); do_opt(opt15); if (flag_seg->answer) do_opt(opt16); new_argv[new_argc++] = NULL; G_debug(1, "Mode: %s", flag_seg->answer ? "Segmented" : "All in RAM"); ret = G_vspawn_ex(new_argv[0], new_argv); if (ret != EXIT_SUCCESS) G_warning(_("Subprocess failed with exit code %d"), ret); /* record map metadata/history info */ if (opt8->answer) write_hist(opt8->answer, "Watershed accumulation: overland flow that traverses each cell", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt9->answer) write_hist(opt9->answer, "Watershed drainage direction (CCW from East divided by 45deg)", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt10->answer) write_hist(opt10->answer, "Watershed basins", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt11->answer) write_hist(opt11->answer, "Watershed stream segments", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt12->answer) write_hist(opt12->answer, "Watershed half-basins", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt13->answer) write_hist(opt13->answer, "Watershed slope length and steepness (LS) factor", opt1->answer, flag_seg->answer, flag_sfd->answer); if (opt14->answer) write_hist(opt14->answer, "Watershed slope steepness (S) factor", opt1->answer, flag_seg->answer, flag_sfd->answer); exit(ret); }
int stats(void) { char buf[1024]; char mname[GNAME_MAX], rname[GMAPSET_MAX]; const char *mmapset, *rmapset; int i, nl; size_t ns; FILE *fd; char **tokens; const char *argv[9]; int argc = 0; strcpy(mname, maps[0]); mmapset = G_find_raster2(mname, ""); if (mmapset == NULL) G_fatal_error(_("Raster map <%s> not found"), maps[0]); strcpy(rname, maps[1]); rmapset = G_find_raster2(rname, ""); if (rmapset == NULL) G_fatal_error(_("Raster map <%s> not found"), maps[1]); stats_file = G_tempfile(); argv[argc++] = "r.stats"; argv[argc++] = "-cin"; argv[argc++] = "fs=:"; sprintf(buf, "input=%s,%s", G_fully_qualified_name(maps[1], mmapset), G_fully_qualified_name(maps[0], rmapset)); argv[argc++] = buf; argv[argc++] = SF_REDIRECT_FILE; argv[argc++] = SF_STDOUT; argv[argc++] = SF_MODE_OUT; argv[argc++] = stats_file; argv[argc++] = NULL; if (G_vspawn_ex(argv[0], argv) != 0) { remove(stats_file); G_fatal_error("error running r.stats"); } fd = fopen(stats_file, "r"); if (fd == NULL) { unlink(stats_file); sprintf(buf, "Unable to open result file <%s>\n", stats_file); } while (G_getl(buf, sizeof buf, fd)) { tokens = G_tokenize(buf, ":"); i = 0; ns = nstats++; Gstats = (GSTATS *) G_realloc(Gstats, nstats * sizeof(GSTATS)); Gstats[ns].cats = (long *)G_calloc(nlayers, sizeof(long)); for (nl = 0; nl < nlayers; nl++) { if (sscanf(tokens[i++], "%ld", &Gstats[ns].cats[nl]) != 1) die(); } if (sscanf(tokens[i++], "%ld", &Gstats[ns].count) != 1) die(); G_free_tokens(tokens); } fclose(fd); unlink(stats_file); return 0; }