8 #define RADEG 57.29577951
34 float bilin(
float *,
float *, int32 *,
int16 *, int32 *);
44 static float tilat, tilon, tslon, tslat, tansnz, sinsna, cossna;
45 static float x0, y0,
x,
y, dx, dy, dd, dist, distn, ddist;
46 static float coslat, hgt1, hgt2, los1, los2;
48 static int16 i, irow, icol, itile;
53 static int firstCall = 1;
54 static int32 idims[3] = {1, 220, 220};
55 static int32 istart[3] = {0, 0, 0};
56 static int32 itilem = -999;
57 static float step = .5f;
58 static float tszmin = .01f;
59 static float snzmax = 56.f;
60 static float remm = 6371000.f;
75 tslat = 180.f / (
dem.nrows - 1);
78 distn = remm * tslat / (
dem.itsize *
RADEG);
85 irow = (*
xlat - 0.0001f + 90.f) / tslat + .5
f;
86 icol = (*
xlon - 0.0001f + 180.f) / 360.
f *
dem.ncols[irow];
87 itile =
dem.nstart[irow] + icol;
109 dist = *height * tansnz * remm / (remm + *height);
115 if (itile != itilem) {
118 istart[0] =
dem.irecno[itile];
121 if (SDreaddata(tileid, istart,
NULL, idims, tile) != 0) {
122 printf(
"Error reading tile %d record %d\n",
123 itile,
dem.irecno[itile]);
128 tslon = 360.f /
dem.ncols[irow];
131 tilat = (irow - .5f) * tslat - 90.
f;
132 tilon = icol * tslon - 180.f;
138 npts =
dem.ihmax[itile] * tansnz / ddist + 2;
142 x0 = (*
xlon - tilon) / tslon *
dem.itsize +
dem.ioff + .5f;
143 y0 = (*
xlat - tilat) / tslat *
dem.itsize +
dem.ioff + .5f;
150 if (*height == 0.
f &&
iflag == 2) {
158 dx = dx * tslat / (coslat * tslon);
163 if (tansnz < tszmin) {
164 dist = *height * tansnz;
176 los1 = dist * (dist * tansnz / 2.f + remm)
177 / (remm * tansnz - dist);
180 while (los1 > hgt1) {
191 printf(
"Warning: %d %d outside tile range\n", (
int)
x, (
int)
y);
193 los1 = dist * (dist * tansnz / 2.f + remm)
194 / (remm * tansnz - dist);
198 dd = (hgt1 - los1) / (hgt1 - los1 + los2 - hgt2);
208 if (*
senz <= snzmax) {
209 printf(
"Bilinear interpolation error %d %d %d\n",
210 (
int)
x, (
int)
y, (
int)
dem.isize);
223 *
xlon += dist * sinsna *
RADEG / (remm * coslat);
231 if (*
xlon < -180.
f) {
240 #define tile_ref(a_1,a_2) tile[(a_2)*tile_dim1 + a_1]
244 int tile_dim1, tile_offset;
253 tile_offset = 1 + tile_dim1;
254 tile -= (int32) tile_offset;
261 if ((ix > 0) && (ix < *
isize) && (iy > 0) && (iy < *
isize)) {
266 ret_val = (1 - dx) * (1 - dy) *
tile_ref(ix, iy)
267 + dx * (1 - dy) *
tile_ref(ix + 1, iy)
268 + (1 - dx) * dy *
tile_ref(ix, iy + 1)
269 + dx * dy *
tile_ref(ix + 1, iy + 1);
284 static int32 istart = 0;
285 static int32 istr = 1;
289 static int32 at_id, sd_id, idims, fileid;
295 fileid = SDstart(demfile, DFACC_RDONLY);
297 printf(
"Error opening DEM file: %s\n", demfile);
304 at_id = SDfindattr(fileid,
"Number of rows");
306 printf(
"Error getting index for Number of rows\n");
309 status = SDreadattr(fileid, at_id, &
dem.nrows);
311 printf(
"Error getting value for Number of rows\n");
315 at_id = SDfindattr(fileid,
"Equator tiles");
317 printf(
"Error getting index for Equator tiles\n");
320 status = SDreadattr(fileid, at_id, &
dem.neq);
322 printf(
"Error getting value for Equator tiles\n");
326 at_id = SDfindattr(fileid,
"Array size");
328 printf(
"Error getting index for Array size\n");
331 status = SDreadattr(fileid, at_id, &
dem.isize);
333 printf(
"Error getting value for Array size\n");
337 at_id = SDfindattr(fileid,
"Tile size");
339 printf(
"Error getting index for Tile size\n");
342 status = SDreadattr(fileid, at_id, &
dem.itsize);
344 printf(
"Error getting value for Tile size\n");
348 at_id = SDfindattr(fileid,
"Array tile offset");
350 printf(
"Error getting index for Array tile offset\n");
353 status = SDreadattr(fileid, at_id, &
dem.ioff);
355 printf(
"Error getting value for Array tile offset\n");
359 at_id = SDfindattr(fileid,
"Number of tiles");
361 printf(
"Error getting index for Number of tiles\n");
364 status = SDreadattr(fileid, at_id, &
dem.ntiles);
366 printf(
"Error getting value for Number of tiles\n");
370 at_id = SDfindattr(fileid,
"Number of filled tiles");
372 printf(
"Error getting index for Number of filled tiles\n");
375 status = SDreadattr(fileid, at_id, &
dem.nftiles);
377 printf(
"Error getting value for Number of filled tiles\n");
385 ind = SDnametoindex(fileid,
"Row_number_of_tiles");
387 printf(
"Error getting index for Row_number_of_tiles\n");
390 sd_id = SDselect(fileid, ind);
392 printf(
"Error selecting Row_number_of_tiles\n");
395 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.ncols);
397 printf(
"Error reading Row_number_of_tiles\n");
400 status = SDendaccess(sd_id);
402 ind = SDnametoindex(fileid,
"Row_start_tile");
404 printf(
"Error getting index for Row_start_tile\n");
407 sd_id = SDselect(fileid, ind);
409 printf(
"Error selecting Row_start_tile\n");
412 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.nstart);
414 printf(
"Error reading Row_start_tile\n");
417 status = SDendaccess(sd_id);
421 ind = SDnametoindex(fileid,
"DEM_tile_record");
423 printf(
"Error getting index for DEM_tile_record\n");
426 sd_id = SDselect(fileid, ind);
428 printf(
"Error selecting DEM_tile_record\n");
431 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.irecno);
433 printf(
"Error reading DEM_tile_record\n");
436 status = SDendaccess(sd_id);
438 ind = SDnametoindex(fileid,
"DEM_tile_flag");
440 printf(
"Error getting index for DEM_tile_flag\n");
443 sd_id = SDselect(fileid, ind);
445 printf(
"Error selecting DEM_tile_flag\n");
448 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.iflag);
450 printf(
"Error reading DEM_tile_flag\n");
453 status = SDendaccess(sd_id);
455 ind = SDnametoindex(fileid,
"Tile_minimum_height");
457 printf(
"Error getting index for Tile_minimum_height\n");
460 sd_id = SDselect(fileid, ind);
462 printf(
"Error selecting Tile_minimum_height\n");
465 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.ihmin);
467 printf(
"Error reading Tile_minimum_height\n");
470 status = SDendaccess(sd_id);
472 ind = SDnametoindex(fileid,
"Tile_maximum_height");
474 printf(
"Error getting index for Tile_maximum_height\n");
477 sd_id = SDselect(fileid, ind);
479 printf(
"Error selecting Tile_maximum_height\n");
482 status = SDreaddata(sd_id, &istart, &istr, &idims,
dem.ihmax);
484 printf(
"Error reading Tile_maximum_height\n");
487 status = SDendaccess(sd_id);
490 ind = SDnametoindex(fileid,
"DEM_tile_data");
492 printf(
"Error getting index for DEM_tile_data\n");
495 tileid[0] = SDselect(fileid, ind);
496 if (tileid[0] == -1) {
497 printf(
"Error selecting DEM_tile_flag\n");
509 static float tilat, tilon, tslon, tslat;
512 static int16 irow, icol, itile;
517 static int firstCall = 1;
518 static int32 idims[3] = {1, 220, 220};
519 static int32 istart[3] = {0, 0, 0};
520 static int32 itilem = -999;
535 tslat = 180.f / (
dem.nrows - 1);
539 irow = (*
xlat - 0.0001f + 90.f) / tslat + .5
f;
540 icol = (*
xlon - 0.0001f + 180.f) / 360.
f *
dem.ncols[irow];
541 itile =
dem.nstart[irow] + icol;
560 if (itile != itilem) {
563 istart[0] =
dem.irecno[itile];
566 if (SDreaddata(tileid, istart,
NULL, idims, tile) != 0) {
567 printf(
"Error reading tile %d record %d\n",
568 itile,
dem.irecno[itile]);
573 tslon = 360.f /
dem.ncols[irow];
576 tilat = (irow - .5f) * tslat - 90.
f;
577 tilon = icol * tslon - 180.f;
582 x0 = (*
xlon - tilon) / tslon *
dem.itsize +
dem.ioff + .5f;
583 y0 = (*
xlat - tilat) / tslat *
dem.itsize +
dem.ioff + .5f;