main.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /****************************************************************************
  2. *
  3. * MODULE: r.random
  4. *
  5. * AUTHOR(S): Dr. James Hinthorne - Central Wash. Uni. GIS Lab
  6. * Modified for GRASS 5.x
  7. * Eric G. Miller
  8. * Modified for GRASS 6.x and updates
  9. * Brad Douglas
  10. *
  11. * PURPOSE: Generate a vector or raster map of random points
  12. * selected from an input map
  13. *
  14. * COPYRIGHT: (C) 2003-2007 by the GRASS Development Team
  15. *
  16. * This program is free software under the GNU General Public
  17. * License (>=v2). Read the file COPYING that comes with GRASS
  18. * for details.
  19. *
  20. *****************************************************************************/
  21. #include <stdlib.h>
  22. #include <grass/gis.h>
  23. #include <grass/glocale.h>
  24. #include "local_proto.h"
  25. static int has_percent(char *);
  26. int main(int argc, char *argv[])
  27. {
  28. short percent;
  29. double percentage;
  30. long targets;
  31. long count;
  32. struct rr_state myState;
  33. struct GModule *module;
  34. struct
  35. {
  36. struct Option *input, *cover, *raster, *sites, *npoints;
  37. } parm;
  38. struct
  39. {
  40. struct Flag *zero, *info, *z_geometry, *notopol_flag;
  41. } flag;
  42. G_gisinit(argv[0]);
  43. module = G_define_module();
  44. G_add_keyword(_("raster"));
  45. G_add_keyword(_("sampling"));
  46. G_add_keyword(_("vector"));
  47. G_add_keyword(_("random"));
  48. module->description =
  49. _("Creates a raster map layer and vector point map "
  50. "containing randomly located points.");
  51. parm.input = G_define_standard_option(G_OPT_R_INPUT);
  52. parm.input->description = _("Name of input raster map");
  53. parm.cover = G_define_standard_option(G_OPT_R_INPUT);
  54. parm.cover->key = "cover";
  55. parm.cover->required = NO;
  56. parm.cover->description = _("Name of cover raster map");
  57. parm.npoints = G_define_option();
  58. parm.npoints->key = "n";
  59. parm.npoints->key_desc = "number[%]";
  60. parm.npoints->type = TYPE_STRING;
  61. parm.npoints->required = YES;
  62. parm.npoints->description = _("The number of points to allocate");
  63. parm.raster = G_define_standard_option(G_OPT_R_OUTPUT);
  64. parm.raster->required = NO;
  65. parm.raster->key = "raster_output";
  66. parm.sites = G_define_standard_option(G_OPT_V_OUTPUT);
  67. parm.sites->required = NO;
  68. parm.sites->key = "vector_output";
  69. flag.zero = G_define_flag();
  70. flag.zero->key = 'z';
  71. flag.zero->description = _("Generate points also for NULL category");
  72. flag.info = G_define_flag();
  73. flag.info->key = 'i';
  74. flag.info->description =
  75. _("Report information about input raster and exit");
  76. flag.z_geometry = G_define_flag();
  77. flag.z_geometry->key = 'd';
  78. flag.z_geometry->description = _("Generate vector points as 3D points");
  79. flag.notopol_flag = G_define_standard_flag(G_FLG_V_TOPO);
  80. flag.notopol_flag->description = _("Do not build topology in points mode");
  81. flag.notopol_flag->guisection = _("Points");
  82. if (G_parser(argc, argv) != 0)
  83. exit(EXIT_FAILURE);
  84. /* Set some state variables */
  85. myState.use_nulls = flag.zero->answer;
  86. myState.inraster = parm.input->answer;
  87. if (parm.cover->answer) {
  88. myState.docover = TRUE;
  89. myState.inrcover = parm.cover->answer;
  90. }
  91. else {
  92. myState.docover = FALSE;
  93. myState.inrcover = NULL;
  94. }
  95. myState.outraster = parm.raster->answer;
  96. myState.outvector = parm.sites->answer;
  97. myState.z_geometry = flag.z_geometry->answer;
  98. myState.notopol = flag.notopol_flag->answer;
  99. /* If they only want info we ignore the rest */
  100. get_stats(&myState);
  101. if (flag.info->answer) {
  102. G_message("Raster: %s\n"
  103. "Cover: %s\n"
  104. "Cell Count: %d\n"
  105. "Null Cells: %d\n\n",
  106. myState.inraster, myState.inrcover,
  107. (int)myState.nCells, (int)myState.nNulls);
  108. exit(EXIT_SUCCESS);
  109. }
  110. if (!(parm.raster->answer || parm.sites->answer))
  111. G_fatal_error(_("Note: one (or both) of %s and %s must be specified"),
  112. parm.raster->key, parm.sites->key);
  113. /* look for n[%] */
  114. percent = has_percent(parm.npoints->answer);
  115. if (percent) {
  116. if (sscanf(parm.npoints->answer, "%lf", &percentage) != 1
  117. || percentage <= 0.0 || percentage > 100.0) {
  118. G_fatal_error(_("<%s=%s> invalid percentage"),
  119. parm.npoints->key, parm.npoints->answer);
  120. }
  121. }
  122. else {
  123. if (sscanf(parm.npoints->answer, "%ld", &targets) != 1
  124. || targets <= 0) {
  125. G_fatal_error(_("<%s=%s> invalid number of points"),
  126. parm.npoints->key, parm.npoints->answer);
  127. }
  128. }
  129. count = (myState.use_nulls) ? myState.nCells :
  130. myState.nCells - myState.nNulls;
  131. if (percent)
  132. myState.nRand = (int)(count * percentage / 100.0 + .5);
  133. else {
  134. if (targets > count) {
  135. if (myState.use_nulls)
  136. G_fatal_error(_("There aren't [%ld] cells in the current region"),
  137. targets);
  138. else
  139. G_fatal_error(_("There aren't [%ld] non-NULL cells in the current region"),
  140. targets);
  141. }
  142. if (targets <= 0)
  143. G_fatal_error(_("There are no valid locations in the current region"));
  144. myState.nRand = targets;
  145. }
  146. execute_random(&myState);
  147. if (myState.outraster)
  148. make_support(&myState, percent, percentage);
  149. return EXIT_SUCCESS;
  150. }
  151. static int has_percent(char *s)
  152. {
  153. while (*s)
  154. if (*s++ == '%')
  155. return 1;
  156. return 0;
  157. }