main.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <grass/gis.h>
  6. #include <grass/raster.h>
  7. #include <grass/glocale.h>
  8. /*
  9. ****************************************************************************
  10. *
  11. * MODULE: r.out.arc
  12. * AUTHOR(S): Original author: Michael Shapiro (r.out.ascii)
  13. * modified to r.out.arc by Markus Neteler, Univ. of Hannover
  14. * neteler geog.uni-hannover.de (11/99)
  15. * PURPOSE: r.out.arc: writes ARC/INFO ASCII GRID file
  16. * COPYRIGHT: (C) 2000 by the GRASS Development Team
  17. *
  18. * This program is free software under the GNU General Public
  19. * License (>=v2). Read the file COPYING that comes with GRASS
  20. * for details.
  21. *
  22. *****************************************************************************/
  23. int main(int argc, char *argv[])
  24. {
  25. void *raster, *ptr;
  26. /*
  27. char *null_row;
  28. */
  29. RASTER_MAP_TYPE out_type, map_type;
  30. char *outfile;
  31. char null_str[80];
  32. char cell_buf[300];
  33. int fd;
  34. int row, col;
  35. int nrows, ncols, dp;
  36. int do_stdout;
  37. FILE *fp;
  38. double cellsize;
  39. struct GModule *module;
  40. struct
  41. {
  42. struct Option *map;
  43. struct Option *output;
  44. struct Option *dp;
  45. struct Option *null;
  46. } parm;
  47. struct
  48. {
  49. struct Flag *noheader;
  50. struct Flag *singleline;
  51. struct Flag *ccenter;
  52. } flag;
  53. G_gisinit(argv[0]);
  54. module = G_define_module();
  55. G_add_keyword(_("raster"));
  56. G_add_keyword(_("export"));
  57. G_add_keyword("ASCII");
  58. module->description =
  59. _("Converts a raster map layer into an ESRI ARCGRID file.");
  60. /* Define the different options */
  61. parm.map = G_define_standard_option(G_OPT_R_INPUT);
  62. parm.output = G_define_standard_option(G_OPT_F_OUTPUT);
  63. parm.output->description =
  64. _("Name for output ARC-GRID file (use out=- for stdout)");
  65. parm.dp = G_define_option();
  66. parm.dp->key = "dp";
  67. parm.dp->type = TYPE_INTEGER;
  68. parm.dp->required = NO;
  69. parm.dp->answer = "8";
  70. parm.dp->description = _("Number of decimal places");
  71. flag.noheader = G_define_flag();
  72. flag.noheader->key = 'h';
  73. flag.noheader->description = _("Suppress printing of header information");
  74. /* Added to optionally produce a single line output. -- emes -- 12.10.92 */
  75. flag.singleline = G_define_flag();
  76. flag.singleline->key = '1';
  77. flag.singleline->description =
  78. _("List one entry per line instead of full row");
  79. /* use cell center in header instead of cell corner */
  80. flag.ccenter = G_define_flag();
  81. flag.ccenter->key = 'c';
  82. flag.ccenter->description =
  83. _("Use cell center reference in header instead of cell corner");
  84. if (G_parser(argc, argv))
  85. exit(EXIT_FAILURE);
  86. sscanf(parm.dp->answer, "%d", &dp);
  87. if (dp > 20 || dp < 0)
  88. G_fatal_error("dp has to be from 0 to 20");
  89. outfile = parm.output->answer;
  90. if ((strcmp("-", outfile)) == 0)
  91. do_stdout = 1;
  92. else
  93. do_stdout = 0;
  94. sprintf(null_str, "-9999");
  95. fd = Rast_open_old(parm.map->answer, "");
  96. map_type = Rast_get_map_type(fd);
  97. out_type = map_type;
  98. /*
  99. null_row = Rast_allocate_null_buf();
  100. */
  101. raster = Rast_allocate_buf(out_type);
  102. nrows = Rast_window_rows();
  103. ncols = Rast_window_cols();
  104. /* open arc file for writing */
  105. if (do_stdout)
  106. fp = stdout;
  107. else if (NULL == (fp = fopen(outfile, "w")))
  108. G_fatal_error(_("Unable to open file <%s>"), outfile);
  109. if (!flag.noheader->answer) {
  110. struct Cell_head region;
  111. char buf[128];
  112. G_get_window(&region);
  113. fprintf(fp, "ncols %d\n", region.cols);
  114. fprintf(fp, "nrows %d\n", region.rows);
  115. cellsize = fabs(region.east - region.west) / region.cols;
  116. if (G_projection() != PROJECTION_LL) { /* Is Projection != LL (3) */
  117. if (!flag.ccenter->answer) {
  118. G_format_easting(region.west, buf, region.proj);
  119. fprintf(fp, "xllcorner %s\n", buf);
  120. G_format_northing(region.south, buf, region.proj);
  121. fprintf(fp, "yllcorner %s\n", buf);
  122. }
  123. else {
  124. G_format_easting(region.west + cellsize / 2., buf, region.proj);
  125. fprintf(fp, "xllcenter %s\n", buf);
  126. G_format_northing(region.south + cellsize / 2., buf, region.proj);
  127. fprintf(fp, "yllcenter %s\n", buf);
  128. }
  129. }
  130. else { /* yes, lat/long */
  131. G_format_easting(region.west, buf, -1);
  132. fprintf(fp, "xllcorner %s\n", buf);
  133. G_format_northing(region.south, buf, -1);
  134. fprintf(fp, "yllcorner %s\n", buf);
  135. }
  136. G_format_resolution(cellsize, buf, -1);
  137. fprintf(fp, "cellsize %s\n", buf);
  138. fprintf(fp, "NODATA_value %s\n", null_str);
  139. }
  140. for (row = 0; row < nrows; row++) {
  141. G_percent(row, nrows, 2);
  142. Rast_get_row(fd, raster, row, out_type);
  143. /*
  144. Rast_get_null_value_row(fd, null_row, row);
  145. */
  146. for (col = 0, ptr = raster; col < ncols; col++,
  147. ptr = G_incr_void_ptr(ptr, Rast_cell_size(out_type))) {
  148. if (!Rast_is_null_value(ptr, out_type)) {
  149. if (out_type == CELL_TYPE)
  150. fprintf(fp, "%d", *((CELL *) ptr));
  151. else if (out_type == FCELL_TYPE) {
  152. sprintf(cell_buf, "%.*f", dp, *((FCELL *) ptr));
  153. G_trim_decimal(cell_buf);
  154. fprintf(fp, "%s", cell_buf);
  155. }
  156. else if (out_type == DCELL_TYPE) {
  157. sprintf(cell_buf, "%.*f", dp, *((DCELL *) ptr));
  158. G_trim_decimal(cell_buf);
  159. fprintf(fp, "%s", cell_buf);
  160. }
  161. }
  162. else
  163. fprintf(fp, "%s", null_str);
  164. if (!flag.singleline->answer)
  165. fprintf(fp, " ");
  166. else
  167. fprintf(fp, "\n");
  168. }
  169. if (!flag.singleline->answer)
  170. fprintf(fp, "\n");
  171. /*
  172. for (col = 0; col < ncols; col++)
  173. fprintf (fp,"%d ", null_row[col]);
  174. fprintf (fp,"\n");
  175. */
  176. }
  177. /* make sure it got to 100% */
  178. G_percent(1, 1, 2);
  179. Rast_close(fd);
  180. fclose(fp);
  181. exit(EXIT_SUCCESS);
  182. }