dem.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. /* Ported from CMU/Monarch's code, nov'98 -Padma.*/
  35. #include "config.h"
  36. #include <ctype.h>
  37. #include <errno.h>
  38. #include <stdlib.h>
  39. #include <stdio.h>
  40. #include <dem.h>
  41. int
  42. DEMFile::open()
  43. {
  44. if((demfile = fopen(fname, "r")) == 0)
  45. return EINVAL;
  46. else
  47. return 0;
  48. }
  49. int
  50. DEMFile::read_int()
  51. {
  52. read_field();
  53. return (atoi(tempbuf));
  54. }
  55. float
  56. DEMFile::read_float()
  57. {
  58. read_field();
  59. return (atof(tempbuf));
  60. }
  61. void
  62. DEMFile::read_field()
  63. {
  64. int i;
  65. char ch;
  66. bzero(tempbuf, sizeof(tempbuf));
  67. do {
  68. ch = fgetc(demfile);
  69. } while (ch != EOF && isspace (ch));
  70. tempbuf[0] = ch;
  71. for(i = 1; ; i++) {
  72. if(feof(demfile)) {
  73. fprintf(stderr, "%s: EOFn", __PRETTY_FUNCTION__);
  74. exit(1);
  75. }
  76. tempbuf[i] = fgetc(demfile);
  77. if(tempbuf[i] == 'D')
  78. tempbuf[i] = 'E';
  79. if(isspace(tempbuf[i]))
  80. break;
  81. }
  82. }
  83. void
  84. DEMFile::resolution(double &r)
  85. {
  86. r = 5.0;
  87. }
  88. void
  89. DEMFile::range(double &x, double &y)
  90. {
  91. #if 0
  92. int i;
  93. double minx = 0.0, miny = 0.0, maxx = 0.0, maxy = 0.0;
  94. for(i = 0; i < 4; i++) {
  95. if(minx == 0.0 || minx > a.corners[i][0]) {
  96. minx = a.corners[i][0];
  97. miny = a.corners[i][1];
  98. }
  99. else if(minx == a.corners[i][0] && miny > a.corners[i][1]) {
  100. miny = a.corners[i][1];
  101. }
  102. if(maxx == 0.0 || maxx < a.corners[i][0]) {
  103. maxx = a.corners[i][0];
  104. maxy = a.corners[i][1];
  105. }
  106. else if(maxx == a.corners[i][0] && maxy < a.corners[i][1]) {
  107. maxy = a.corners[i][1];
  108. }
  109. }
  110. x = maxx - minx;
  111. y = maxy - miny;
  112. #else
  113. x = y = (double) a.cols - 1;
  114. #endif
  115. }
  116. /* ======================================================================
  117.    Returns a pointer to the "grid".
  118.    ====================================================================== */
  119. int*
  120. DEMFile::process()
  121. {
  122. int i, j, offset = 0;
  123. char ch;
  124. if(fname == 0)
  125. return 0;
  126. if(open())
  127. return 0;
  128. /* ============================================================
  129.    A Record
  130.    ============================================================ */
  131. bzero(a.q_name, sizeof(a.q_name));
  132. for(i = 0; ! feof(demfile) && i < (int) sizeof(a.q_name) - 1; i++) {
  133. ch = fgetc(demfile);
  134. if(! isspace(ch)) {
  135. a.q_name[offset] = ch;
  136. offset++;
  137. }
  138. else {
  139. if(offset && ! isspace(a.q_name[offset-1])) {
  140. a.q_name[offset] = ch;
  141. offset++;
  142. }
  143. }
  144. }
  145. a.dl_code = read_int();
  146. a.p_code = read_int();
  147. a.pr_code = read_int();
  148. a.z_code = read_int();
  149. /* Map Projection Parameters */
  150. for(i = 0; i < 15; i++)
  151. a.p_parm[i] = read_float();
  152. a.g_units = read_int();
  153.         a.e_units = read_int();
  154.         a.sides = read_int();
  155. for(i = 0; i < 4; i++) {
  156. a.corners[i][0] = read_float();
  157. a.corners[i][1] = read_float();
  158. }
  159. a.min_elevation = read_float();
  160. a.max_elevation = read_float();
  161. a.angle = read_float();
  162. #if 0
  163. a.a_code = read_int();
  164. a.x_res = read_float();
  165. a.y_res = read_float();
  166. a.z_res = read_float();
  167. #else
  168. read_field();
  169. #endif
  170. a.rows = read_int();
  171. a.cols = read_int();
  172. grid = (int*) malloc(sizeof(int) * a.cols * a.cols);
  173. /* ============================================================
  174.    B Records
  175.    ============================================================ */
  176. for(int rows = 0; rows < a.cols; rows++) {
  177. b.row_id = read_int();
  178. b.col_id = read_int();
  179. b.rows = read_int();
  180. b.cols = read_int();
  181. b.x_gpc = read_float();
  182. b.y_gpc = read_float();
  183. b.elevation = read_float();
  184. b.min_elevation = read_float();
  185. b.max_elevation = read_float();
  186. i = rows * a.cols;
  187. for(j = 0; j < b.rows; j++)
  188. grid[i+j] = read_int();
  189. }
  190. return grid;
  191. }
  192. void
  193. DEMFile::dump_ARecord()
  194. {
  195. int i;
  196. fprintf(stdout, "*** A RECORD ***n");
  197. fprintf(stdout, "Quadrangle name:                   %sn", a.q_name);
  198. fprintf(stdout, "DEM Level code:                    %dn", a.dl_code);
  199. fprintf(stdout, "Pattern code:                      %dn", a.p_code);
  200. fprintf(stdout, "Planimetric reference system code: %dn", a.pr_code);
  201. fprintf(stdout, "Zone code:                         %dn", a.z_code);
  202. fprintf(stdout, "Map Projection Parameters:n");
  203. for(i = 0; i < 15; i++)
  204. fprintf(stdout, "                                   %fn",
  205. a.p_parm[i]);
  206. fprintf(stdout, "Ground planimetric coordinates:    %dn", a.g_units);
  207. fprintf(stdout, "Elevation coordinates:             %dn", a.e_units);
  208. fprintf(stdout, "Sides:                             %dn", a.sides);
  209. fprintf(stdout, "Corners:n");
  210. for(i = 0; i < 4; i++)
  211. fprintf(stdout, "                                   %f, %fn",
  212. a.corners[i][0], a.corners[i][1]);
  213. fprintf(stdout, "Min Elevation:                     %fn", a.min_elevation);
  214. fprintf(stdout, "Max Elevation:                     %fn", a.max_elevation);
  215. fprintf(stdout, "Clockwise angle:                   %fn", a.angle);
  216. fprintf(stdout, "Accuracy code:                     %dn", a.a_code);
  217. fprintf(stdout, "Spatial Resolution:n");
  218. fprintf(stdout, "                                   %f (x)n", a.x_res);
  219. fprintf(stdout, "                                   %f (y)n", a.y_res);
  220. fprintf(stdout, "                                   %f (z)n", a.z_res);
  221. fprintf(stdout, "Rows:                              %dn", a.rows);
  222. fprintf(stdout, "Columns:                           %dn", a.cols);
  223. }
  224. void
  225. DEMFile::dump_BRecord()
  226. {
  227. fprintf(stdout, "*** B RECORD ***n");
  228. fprintf(stdout, "Row ID:                            %dn", b.row_id);
  229. fprintf(stdout, "Column ID:                         %dn", b.col_id);
  230. fprintf(stdout, "Rows:                              %dn", b.rows);
  231. fprintf(stdout, "Columns:                           %dn", b.cols);
  232. fprintf(stdout, "Ground planimetric coordinates:    %f, %fn",
  233. b.x_gpc, b.y_gpc);
  234. fprintf(stdout, "Elevation:                         %fn", b.elevation);
  235. fprintf(stdout, "Min Elevation:                     %fn", b.min_elevation);
  236. fprintf(stdout, "Max Elevation:                     %fn", b.max_elevation);
  237. }
  238. void
  239. DEMFile::dump_grid()
  240. {
  241. int i, j;
  242. fprintf(stdout, "*** X,Y GRID ***n");
  243. for(i = 0; i < a.cols; i++) {
  244. fprintf(stdout, "ROW %5d --- ", i);
  245. for(j = 0; j < a.cols; j++) {
  246. fprintf(stdout, "%5d ", grid[i*a.cols + j]);
  247. }
  248. fprintf(stdout, "n");
  249. }
  250. }
  251. #if 0
  252. void main(int argc, char** argv)
  253. {
  254. DEMFile *F;
  255. if(argc != 2)
  256. exit(1);
  257. F = new DEMFile(argv[1]);
  258. F->process();
  259. F->dump_grid();
  260. }
  261. #endif