Line data Source code
1 : /*****************************************************************************
2 : * $Id$
3 : *
4 : * This module has a number of additions and improvements over the original
5 : * implementation to be suitable for usage in GDAL HDF driver.
6 : *
7 : * Andrey Kiselev <dron@ak4719.spb.edu> is responsible for all the changes.
8 : ****************************************************************************/
9 :
10 : /*
11 : Copyright (C) 1996 Hughes and Applied Research Corporation
12 :
13 : Permission to use, modify, and distribute this software and its documentation
14 : for any purpose without fee is hereby granted, provided that the above
15 : copyright notice appear in all copies and that both that copyright notice and
16 : this permission notice appear in supporting documentation.
17 : */
18 : /*****************************************************************************
19 : REVISIONS:
20 :
21 : Aug 31, 1999 Abe Taaheri Changed memory allocation for utility strings to
22 : the size of UTLSTR_MAX_SIZE.
23 : Added error check for memory unavailability in
24 : several functions.
25 : Added check for NULL metabuf returned from
26 : EHmeta... functions. NULL pointer returned from
27 : EHmeta... functions indicate that memory could not
28 : be allocated for metabuf.
29 : Jun 27, 2000 Abe Taaheri Added support for EASE grid that uses
30 : Behrmann Cylinderical Equal Area (BCEA) projection
31 : Oct 23, 2000 Abe Taaheri Updated for ISINUS projection, so that both codes
32 : 31 and 99 can be used for this projection.
33 : Jan 15, 2003 Abe Taaheri Modified for generalization of EASE Grid.
34 :
35 : Jun 05, 2003 Bruce Beaumont / Abe Taaheri
36 :
37 : Fixed SQUARE definition.
38 : Added static projection number/name translation
39 : Added projection table lookup in GDdefproj.
40 : Removed projection table from GDdefproj
41 : Added projection table lookup in GDprojinfo
42 : Removed projection table from GDprojinfo
43 : Added cast for compcode in call to SDsetcompress
44 : in GDdeffield to avoid compiler errors
45 : Removed declaration for unused variable endptr
46 : in GDSDfldsrch
47 : Removed initialization code for unused variables
48 : in GDSDfldsrch
49 : Removed declarations for unused variables
50 : BCEA_scale, r0, s0, xMtr0, xMtr1, yMtr0,
51 : and yMtr1 in GDll2ij
52 : Removed initialization code for unused variables
53 : in GDll2ij
54 : Added code in GEO projection handling to allow
55 : map to span dateline in GDll2ij
56 : Changed "for each point" loop in GDll2ij to
57 : return -2147483648.0 for xVal and yVal if
58 : for_trans returned an error instead of
59 : returning an error to the caller
60 : (Note: MAXLONG is defined as 2147483647.0 in
61 : function cproj.c of GCTP)
62 : Added code in GDij2ll to use for_trans to
63 : translate the BCEA corner points from packed
64 : degrees to meters
65 : Removed declarations for unused variables
66 : BCEA_scale, r0, s0, xMtr, yMtr, epsilon,
67 : beta, qp_cea, kz_cea, eccen, eccen_sq,
68 : phi1, sinphi1, cosphi1, lon, lat, xcor,
69 : ycor, and nlatlon from GDij2ll
70 : Removed initialization code for unused variables
71 : in GDij2ll
72 : Added declarations for xMtr0, yMtr0, xMtr1, and
73 : yMtr1 in GDij2ll
74 : Added special-case code for BCEA
75 : Changed "for each point" loop in GDij2ll to
76 : return PGSd_GCT_IN_ERROR (1.0e51) for
77 : longitude and latitude values if inv_trans
78 : returned an error instead of return an error
79 : to the caller
80 : Removed declaration for unused variable ii in
81 : GDgetpixvalues
82 : Removed declaration for unused variable
83 : numTileDims in GDtileinfo
84 : Added error message and error return at the
85 : end of GDll2mm_cea
86 : Added return statement to GDll2mm_cea
87 : ******************************************************************************/
88 : #include "cpl_string.h"
89 : #include "stdio.h"
90 : #include "mfhdf.h"
91 : #include "hcomp.h"
92 : #include <math.h>
93 : #include "HdfEosDef.h"
94 :
95 : #include "hdf4compat.h"
96 :
97 : extern void for_init(int32, int32, float64 *, int32, const char *, const char *, int32 *,
98 : int32 (*for_trans[])(double, double, double*, double*));
99 : extern void inv_init(int32, int32, float64 *, int32, const char *, const char *, int32 *,
100 : int32 (*inv_trans[])(double, double, double*, double*));
101 :
102 : #define GDIDOFFSET 4194304
103 : #define SQUARE(x) ((x) * (x)) /* x**2 */
104 :
105 : static int32 GDXSDcomb[512*5];
106 : static char GDXSDname[HDFE_NAMBUFSIZE];
107 : static char GDXSDdims[HDFE_DIMBUFSIZE];
108 :
109 :
110 : #define NGRID 200
111 : /* Grid Structure External Arrays */
112 : struct gridStructure
113 : {
114 : int32 active;
115 : int32 IDTable;
116 : int32 VIDTable[2];
117 : int32 fid;
118 : int32 nSDS;
119 : int32 *sdsID;
120 : int32 compcode;
121 : intn compparm[5];
122 : int32 tilecode;
123 : int32 tilerank;
124 : int32 tiledims[8];
125 : };
126 : static struct gridStructure GDXGrid[NGRID];
127 :
128 :
129 :
130 : #define NGRIDREGN 256
131 : struct gridRegion
132 : {
133 : int32 fid;
134 : int32 gridID;
135 : int32 xStart;
136 : int32 xCount;
137 : int32 yStart;
138 : int32 yCount;
139 : int32 somStart;
140 : int32 somCount;
141 : float64 upleftpt[2];
142 : float64 lowrightpt[2];
143 : int32 StartVertical[8];
144 : int32 StopVertical[8];
145 : char *DimNamePtr[8];
146 : };
147 : static struct gridRegion *GDXRegion[NGRIDREGN];
148 :
149 : /* define a macro for the string size of the utility strings and some dimension
150 : list strings. The value of 80 in the previous version of this code
151 : may not be enough in some cases. The length now is 512 which seems to
152 : be more than enough to hold larger strings. */
153 :
154 : #define UTLSTR_MAX_SIZE 512
155 :
156 : /* Static projection table */
157 : static const struct {
158 : int32 projcode;
159 : const char *projname;
160 : } Projections[] = {
161 : {GCTP_GEO, "GCTP_GEO"},
162 : {GCTP_UTM, "GCTP_UTM"},
163 : {GCTP_SPCS, "GCTP_SPCS"},
164 : {GCTP_ALBERS, "GCTP_ALBERS"},
165 : {GCTP_LAMCC, "GCTP_LAMCC"},
166 : {GCTP_MERCAT, "GCTP_MERCAT"},
167 : {GCTP_PS, "GCTP_PS"},
168 : {GCTP_POLYC, "GCTP_POLYC"},
169 : {GCTP_EQUIDC, "GCTP_EQUIDC"},
170 : {GCTP_TM, "GCTP_TM"},
171 : {GCTP_STEREO, "GCTP_STEREO"},
172 : {GCTP_LAMAZ, "GCTP_LAMAZ"},
173 : {GCTP_AZMEQD, "GCTP_AZMEQD"},
174 : {GCTP_GNOMON, "GCTP_GNOMON"},
175 : {GCTP_ORTHO, "GCTP_ORTHO"},
176 : {GCTP_GVNSP, "GCTP_GVNSP"},
177 : {GCTP_SNSOID, "GCTP_SNSOID"},
178 : {GCTP_EQRECT, "GCTP_EQRECT"},
179 : {GCTP_MILLER, "GCTP_MILLER"},
180 : {GCTP_VGRINT, "GCTP_VGRINT"},
181 : {GCTP_HOM, "GCTP_HOM"},
182 : {GCTP_ROBIN, "GCTP_ROBIN"},
183 : {GCTP_SOM, "GCTP_SOM"},
184 : {GCTP_ALASKA, "GCTP_ALASKA"},
185 : {GCTP_GOOD, "GCTP_GOOD"},
186 : {GCTP_MOLL, "GCTP_MOLL"},
187 : {GCTP_IMOLL, "GCTP_IMOLL"},
188 : {GCTP_HAMMER, "GCTP_HAMMER"},
189 : {GCTP_WAGIV, "GCTP_WAGIV"},
190 : {GCTP_WAGVII, "GCTP_WAGVII"},
191 : {GCTP_OBLEQA, "GCTP_OBLEQA"},
192 : {GCTP_ISINUS1, "GCTP_ISINUS1"},
193 : {GCTP_CEA, "GCTP_CEA"},
194 : {GCTP_BCEA, "GCTP_BCEA"},
195 : {GCTP_ISINUS, "GCTP_ISINUS"},
196 : {-1, NULL}
197 : };
198 :
199 : /* Compression Codes */
200 : static const char * const HDFcomp[] = {
201 : "HDFE_COMP_NONE",
202 : "HDFE_COMP_RLE",
203 : "HDFE_COMP_NBIT",
204 : "HDFE_COMP_SKPHUFF",
205 : "HDFE_COMP_DEFLATE"
206 : };
207 :
208 : /* Origin Codes */
209 : static const char * const originNames[] = {
210 : "HDFE_GD_UL",
211 : "HDFE_GD_UR",
212 : "HDFE_GD_LL",
213 : "HDFE_GD_LR"
214 : };
215 :
216 : /* Pixel Registration Codes */
217 : static const char * const pixregNames[] = {
218 : "HDFE_CENTER",
219 : "HDFE_CORNER"
220 : };
221 :
222 : /* Grid Function Prototypes (internal routines) */
223 : static intn GDchkgdid(int32, const char *, int32 *, int32 *, int32 *);
224 : static intn GDSDfldsrch(int32, int32, const char *, int32 *, int32 *,
225 : int32 *, int32 *, int32 [], int32 *);
226 : static intn GDwrrdfield(int32, const char *, const char *,
227 : int32 [], int32 [], int32 [], VOIDP datbuf);
228 : static intn GDwrrdattr(int32, const char *, int32, int32, const char *, VOIDP);
229 : static intn GDll2ij(int32, int32, float64 [], int32, int32, int32, float64[],
230 : float64[], int32, float64[], float64[], int32[], int32[],
231 : float64[], float64[]);
232 : static intn GDgetdefaults(int32, int32, float64[], int32,
233 : float64[], float64[]);
234 : static intn GDtangentpnts(int32, float64[], float64[], float64[], float64[],
235 : float64 [], int32 *);
236 : static intn GDwrrdtile(int32, const char *, const char *, int32 [], VOIDP);
237 : static intn GDll2mm_cea(int32,int32, int32, float64[], int32, int32,
238 : float64[], float64[], int32, float64[],float64[],
239 : float64[], float64[], float64 *, float64 *);
240 :
241 : static intn GDmm2ll_cea(int32, int32, int32, float64[], int32, int32,
242 : float64[], float64[], int32, float64[], float64[],
243 : float64[], float64[]);
244 :
245 : /*----------------------------------------------------------------------------|
246 : | BEGIN_PROLOG |
247 : | |
248 : | FUNCTION: GDopen |
249 : | |
250 : | DESCRIPTION: Opens or creates HDF file in order to create, read, or write |
251 : | a grid. |
252 : | |
253 : | |
254 : | Return Value Type Units Description |
255 : | ============ ====== ========= ===================================== |
256 : | fid int32 HDF-EOS file ID |
257 : | |
258 : | INPUTS: |
259 : | filename char Filename |
260 : | l_access intn HDF l_access code |
261 : | |
262 : | |
263 : | OUTPUTS: |
264 : | None |
265 : | |
266 : | NOTES: |
267 : | |
268 : | |
269 : | Date Programmer Description |
270 : | ====== ============ ================================================= |
271 : | Jun 96 Joel Gales Original Programmer |
272 : | |
273 : | END_PROLOG |
274 : -----------------------------------------------------------------------------*/
275 : int32
276 4 : GDopen(const char *filename, intn l_access)
277 :
278 : {
279 : int32 fid /* HDF-EOS file ID */ ;
280 :
281 : /* Call EHopen to perform file l_access */
282 : /* ---------------------------------- */
283 4 : fid = EHopen(filename, l_access);
284 :
285 4 : return (fid);
286 :
287 : }
288 :
289 :
290 :
291 : /*----------------------------------------------------------------------------|
292 : | BEGIN_PROLOG |
293 : | |
294 : | FUNCTION: GDcreate |
295 : | |
296 : | DESCRIPTION: Creates a grid within the file. |
297 : | |
298 : | |
299 : | Return Value Type Units Description |
300 : | ============ ====== ========= ===================================== |
301 : | gridID int32 Grid structure ID |
302 : | |
303 : | INPUTS: |
304 : | fid int32 File ID |
305 : | gridname char Grid structure name |
306 : | xdimsize int32 Number of columns in grid |
307 : | ydimsize int32 Number of rows in grid |
308 : | upleftpt float64 Location (m/deg) of upper left corner |
309 : | lowrightpt float64 Location (m/deg) of lower right corner |
310 : | |
311 : | |
312 : | OUTPUTS: |
313 : | None |
314 : | |
315 : | NOTES: |
316 : | |
317 : | |
318 : | Date Programmer Description |
319 : | ====== ============ ================================================= |
320 : | Jun 96 Joel Gales Original Programmer |
321 : | Aug 96 Joel Gales Make metadata ODL compliant |
322 : | Aug 96 Joel Gales Check grid name for ODL compliance |
323 : | |
324 : | END_PROLOG |
325 : -----------------------------------------------------------------------------*/
326 : int32
327 0 : GDcreate(int32 fid, const char *gridname, int32 xdimsize, int32 ydimsize,
328 : float64 upleftpt[], float64 lowrightpt[])
329 : {
330 : intn i; /* Loop index */
331 0 : intn ngridopen = 0; /* # of grid structures open */
332 0 : intn status = 0; /* routine return status variable */
333 :
334 : uint8 l_access; /* Read/Write file l_access code */
335 :
336 : int32 HDFfid; /* HDF file id */
337 : int32 vgRef; /* Vgroup reference number */
338 : int32 vgid[3]; /* Vgroup ID array */
339 0 : int32 gridID = -1;/* HDF-EOS grid ID */
340 :
341 : int32 sdInterfaceID; /* HDF SDS interface ID */
342 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
343 0 : int32 nGrid = 0; /* Grid counter */
344 :
345 : char name[80]; /* Vgroup name */
346 : char class[80]; /* Vgroup class */
347 : char errbuf[256];/* Buffer for error message */
348 : char utlbuf[1024]; /* Utility buffer */
349 : char header[128];/* Structural metadata header string */
350 : char footer[256];/* Structural metadata footer string */
351 : char refstr1[128]; /* Upper left ref string (metadata) */
352 : char refstr2[128]; /* Lower right ref string (metadata) */
353 :
354 :
355 : /*
356 : * Check HDF-EOS file ID, get back HDF file ID, SD interface ID and
357 : * l_access code
358 : */
359 0 : status = EHchkfid(fid, gridname, &HDFfid, &sdInterfaceID, &l_access);
360 :
361 :
362 : /* Check gridname for length */
363 : /* ------------------------- */
364 0 : if ((intn) strlen(gridname) > VGNAMELENMAX)
365 : {
366 0 : status = -1;
367 0 : HEpush(DFE_GENAPP, "GDcreate", __FILE__, __LINE__);
368 0 : HEreport("Gridname \"%s\" must be less than %d characters.\n",
369 : gridname, VGNAMELENMAX);
370 : }
371 :
372 :
373 :
374 0 : if (status == 0)
375 : {
376 : /* Determine number of grids currently opened */
377 : /* ------------------------------------------- */
378 0 : for (i = 0; i < NGRID; i++)
379 : {
380 0 : ngridopen += GDXGrid[i].active;
381 : }
382 :
383 :
384 : /* Setup file interface */
385 : /* -------------------- */
386 0 : if (ngridopen < NGRID)
387 : {
388 :
389 : /* Check that grid has not been previously opened */
390 : /* ----------------------------------------------- */
391 0 : vgRef = -1;
392 :
393 : while (1)
394 : {
395 0 : vgRef = Vgetid(HDFfid, vgRef);
396 :
397 : /* If no more Vgroups then exist while loop */
398 : /* ---------------------------------------- */
399 0 : if (vgRef == -1)
400 : {
401 0 : break;
402 : }
403 :
404 : /* Get name and class of Vgroup */
405 : /* ---------------------------- */
406 0 : vgid[0] = Vattach(HDFfid, vgRef, "r");
407 0 : Vgetname(vgid[0], name);
408 0 : Vgetclass(vgid[0], class);
409 0 : Vdetach(vgid[0]);
410 :
411 :
412 : /* If GRID then increment # grid counter */
413 : /* ------------------------------------- */
414 0 : if (strcmp(class, "GRID") == 0)
415 : {
416 0 : nGrid++;
417 : }
418 :
419 :
420 : /* If grid already exist, return error */
421 : /* ------------------------------------ */
422 0 : if (strcmp(name, gridname) == 0 &&
423 0 : strcmp(class, "GRID") == 0)
424 : {
425 0 : status = -1;
426 0 : HEpush(DFE_GENAPP, "GDcreate", __FILE__, __LINE__);
427 0 : HEreport("\"%s\" already exists.\n", gridname);
428 0 : break;
429 : }
430 : }
431 :
432 :
433 0 : if (status == 0)
434 : {
435 : /* Create Root Vgroup for Grid */
436 : /* ---------------------------- */
437 0 : vgid[0] = Vattach(HDFfid, -1, "w");
438 :
439 :
440 : /* Set Name and Class (GRID) */
441 : /* -------------------------- */
442 0 : Vsetname(vgid[0], gridname);
443 0 : Vsetclass(vgid[0], "GRID");
444 :
445 :
446 :
447 : /* Create Data Fields Vgroup */
448 : /* ------------------------- */
449 0 : vgid[1] = Vattach(HDFfid, -1, "w");
450 0 : Vsetname(vgid[1], "Data Fields");
451 0 : Vsetclass(vgid[1], "GRID Vgroup");
452 0 : Vinsert(vgid[0], vgid[1]);
453 :
454 :
455 :
456 : /* Create Attributes Vgroup */
457 : /* ------------------------ */
458 0 : vgid[2] = Vattach(HDFfid, -1, "w");
459 0 : Vsetname(vgid[2], "Grid Attributes");
460 0 : Vsetclass(vgid[2], "GRID Vgroup");
461 0 : Vinsert(vgid[0], vgid[2]);
462 :
463 :
464 :
465 : /* Establish Grid in Structural MetaData Block */
466 : /* -------------------------------------------- */
467 0 : snprintf(header, sizeof(header), "%s%d%s%s%s%s%d%s%s%d%s",
468 : "\tGROUP=GRID_", (int)(nGrid + 1),
469 : "\n\t\tGridName=\"", gridname, "\"\n",
470 : "\t\tXDim=", (int)xdimsize, "\n",
471 : "\t\tYDim=", (int)ydimsize, "\n");
472 :
473 :
474 0 : snprintf(footer, sizeof(footer),
475 : "%s%s%s%s%s%s%s%d%s",
476 : "\t\tGROUP=Dimension\n",
477 : "\t\tEND_GROUP=Dimension\n",
478 : "\t\tGROUP=DataField\n",
479 : "\t\tEND_GROUP=DataField\n",
480 : "\t\tGROUP=MergedFields\n",
481 : "\t\tEND_GROUP=MergedFields\n",
482 : "\tEND_GROUP=GRID_", (int)(nGrid + 1), "\n");
483 :
484 :
485 :
486 : /* Build Ref point Col-Row strings */
487 : /* ------------------------------- */
488 0 : if (upleftpt == NULL ||
489 0 : (upleftpt[0] == 0 && upleftpt[1] == 0 &&
490 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0))
491 : {
492 0 : strcpy(refstr1, "DEFAULT");
493 0 : strcpy(refstr2, "DEFAULT");
494 : }
495 : else
496 : {
497 0 : CPLsnprintf(refstr1, sizeof(refstr1), "%s%f%s%f%s",
498 0 : "(", upleftpt[0], ",", upleftpt[1], ")");
499 :
500 0 : CPLsnprintf(refstr2, sizeof(refstr2), "%s%f%s%f%s",
501 0 : "(", lowrightpt[0], ",", lowrightpt[1], ")");
502 : }
503 :
504 0 : snprintf(utlbuf, sizeof(utlbuf),
505 : "%s%s%s%s%s%s%s%s",
506 : header,
507 : "\t\tUpperLeftPointMtrs=", refstr1, "\n",
508 : "\t\tLowerRightMtrs=", refstr2, "\n",
509 : footer);
510 :
511 0 : status = EHinsertmeta(sdInterfaceID, "", "g", 1002L,
512 : utlbuf, NULL);
513 :
514 : }
515 : }
516 : else
517 : {
518 : /* Too many files opened */
519 : /* --------------------- */
520 0 : status = -1;
521 0 : strcpy(errbuf,
522 : "No more than %d grids may be open simultaneously");
523 0 : strcat(errbuf, " (%s)");
524 0 : HEpush(DFE_DENIED, "GDcreate", __FILE__, __LINE__);
525 0 : HEreport(errbuf, NGRID, gridname);
526 : }
527 :
528 :
529 : /* Assign gridID # & Load grid and GDXGrid.fid table entries */
530 : /* --------------------------------------------------------- */
531 0 : if (status == 0)
532 : {
533 :
534 0 : for (i = 0; i < NGRID; i++)
535 : {
536 0 : if (GDXGrid[i].active == 0)
537 : {
538 0 : gridID = i + idOffset;
539 0 : GDXGrid[i].active = 1;
540 0 : GDXGrid[i].IDTable = vgid[0];
541 0 : GDXGrid[i].VIDTable[0] = vgid[1];
542 0 : GDXGrid[i].VIDTable[1] = vgid[2];
543 0 : GDXGrid[i].fid = fid;
544 0 : status = 0;
545 0 : break;
546 : }
547 : }
548 :
549 : }
550 : }
551 0 : return (gridID);
552 : }
553 :
554 :
555 :
556 : /*----------------------------------------------------------------------------|
557 : | BEGIN_PROLOG |
558 : | |
559 : | FUNCTION: GDattach |
560 : | |
561 : | DESCRIPTION: Attaches to an existing grid within the file. |
562 : | |
563 : | |
564 : | Return Value Type Units Description |
565 : | ============ ====== ========= ===================================== |
566 : | gridID int32 grid structure ID |
567 : | |
568 : | INPUTS: |
569 : | fid int32 HDF-EOS file id |
570 : | gridname char grid structure name |
571 : | |
572 : | |
573 : | OUTPUTS: |
574 : | None |
575 : | |
576 : | NOTES: |
577 : | |
578 : | |
579 : | Date Programmer Description |
580 : | ====== ============ ================================================= |
581 : | Jun 96 Joel Gales Original Programmer |
582 : | Sep 99 Abe Taaheri Modified test for memory allocation check when no |
583 : | SDSs are in the grid, NCR24147 |
584 : | |
585 : | END_PROLOG |
586 : -----------------------------------------------------------------------------*/
587 : int32
588 0 : GDattach(int32 fid, const char *gridname)
589 :
590 : {
591 : intn i; /* Loop index */
592 : intn j; /* Loop index */
593 0 : intn ngridopen = 0; /* # of grid structures open */
594 : intn status; /* routine return status variable */
595 :
596 : uint8 acs; /* Read/Write file l_access code */
597 :
598 : int32 HDFfid; /* HDF file id */
599 : int32 vgRef; /* Vgroup reference number */
600 : int32 vgid[3]; /* Vgroup ID array */
601 0 : int32 gridID = -1;/* HDF-EOS grid ID */
602 : int32 *tags; /* Pnt to Vgroup object tags array */
603 : int32 *refs; /* Pnt to Vgroup object refs array */
604 : int32 dum; /* dummy variable */
605 : int32 sdInterfaceID; /* HDF SDS interface ID */
606 : int32 nObjects; /* # of objects in Vgroup */
607 : int32 nSDS; /* SDS counter */
608 : int32 l_index; /* SDS l_index */
609 : int32 sdid; /* SDS object ID */
610 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
611 :
612 : char name[80]; /* Vgroup name */
613 : char class[80]; /* Vgroup class */
614 : char errbuf[256];/* Buffer for error message */
615 : char acsCode[1]; /* Read/Write l_access char: "r/w" */
616 :
617 :
618 : /* Check HDF-EOS file ID, get back HDF file ID and l_access code */
619 : /* ----------------------------------------------------------- */
620 0 : status = EHchkfid(fid, gridname, &HDFfid, &dum, &acs);
621 :
622 :
623 0 : if (status == 0)
624 : {
625 : /* Convert numeric l_access code to character */
626 : /* ---------------------------------------- */
627 :
628 0 : acsCode[0] = (acs == 1) ? 'w' : 'r';
629 :
630 : /* Determine number of grids currently opened */
631 : /* ------------------------------------------- */
632 0 : for (i = 0; i < NGRID; i++)
633 : {
634 0 : ngridopen += GDXGrid[i].active;
635 : }
636 :
637 :
638 : /* If room for more ... */
639 : /* -------------------- */
640 0 : if (ngridopen < NGRID)
641 : {
642 :
643 : /* Search Vgroups for Grid */
644 : /* ------------------------ */
645 0 : vgRef = -1;
646 :
647 : while (1)
648 : {
649 0 : vgRef = Vgetid(HDFfid, vgRef);
650 :
651 : /* If no more Vgroups then exist while loop */
652 : /* ---------------------------------------- */
653 0 : if (vgRef == -1)
654 : {
655 0 : break;
656 : }
657 :
658 : /* Get name and class of Vgroup */
659 : /* ---------------------------- */
660 0 : vgid[0] = Vattach(HDFfid, vgRef, "r");
661 0 : Vgetname(vgid[0], name);
662 0 : Vgetclass(vgid[0], class);
663 :
664 :
665 : /*
666 : * If Vgroup with gridname and class GRID found, load tables
667 : */
668 :
669 0 : if (strcmp(name, gridname) == 0 &&
670 0 : strcmp(class, "GRID") == 0)
671 : {
672 : /* Attach to "Data Fields" and "Grid Attributes" Vgroups */
673 : /* ----------------------------------------------------- */
674 0 : tags = (int32 *) malloc(sizeof(int32) * 2);
675 0 : if(tags == NULL)
676 : {
677 0 : HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
678 0 : return(-1);
679 : }
680 0 : refs = (int32 *) malloc(sizeof(int32) * 2);
681 0 : if(refs == NULL)
682 : {
683 0 : HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
684 0 : free(tags);
685 0 : return(-1);
686 : }
687 0 : Vgettagrefs(vgid[0], tags, refs, 2);
688 0 : vgid[1] = Vattach(HDFfid, refs[0], acsCode);
689 0 : vgid[2] = Vattach(HDFfid, refs[1], acsCode);
690 0 : free(tags);
691 0 : free(refs);
692 :
693 :
694 : /* Setup External Arrays */
695 : /* --------------------- */
696 0 : for (i = 0; i < NGRID; i++)
697 : {
698 : /* Find empty entry in array */
699 : /* ------------------------- */
700 0 : if (GDXGrid[i].active == 0)
701 : {
702 : /*
703 : * Set gridID, Set grid entry active, Store root
704 : * Vgroup ID, Store sub Vgroup IDs, Store HDF-EOS
705 : * file ID
706 : */
707 0 : gridID = i + idOffset;
708 0 : GDXGrid[i].active = 1;
709 0 : GDXGrid[i].IDTable = vgid[0];
710 0 : GDXGrid[i].VIDTable[0] = vgid[1];
711 0 : GDXGrid[i].VIDTable[1] = vgid[2];
712 0 : GDXGrid[i].fid = fid;
713 0 : break;
714 : }
715 : }
716 :
717 : /* Get SDS interface ID */
718 : /* -------------------- */
719 0 : status = GDchkgdid(gridID, "GDattach", &dum,
720 : &sdInterfaceID, &dum);
721 :
722 :
723 : /* Get # of entries within Data Vgroup & search for SDS */
724 : /* ---------------------------------------------------- */
725 0 : nObjects = Vntagrefs(vgid[1]);
726 :
727 0 : if (nObjects > 0)
728 : {
729 : /* Get tag and ref # for Data Vgroup objects */
730 : /* ----------------------------------------- */
731 0 : tags = (int32 *) malloc(sizeof(int32) * nObjects);
732 0 : if(tags == NULL)
733 : {
734 0 : HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
735 0 : return(-1);
736 : }
737 0 : refs = (int32 *) malloc(sizeof(int32) * nObjects);
738 0 : if(refs == NULL)
739 : {
740 0 : HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
741 0 : free(tags);
742 0 : return(-1);
743 : }
744 0 : Vgettagrefs(vgid[1], tags, refs, nObjects);
745 :
746 : /* Count number of SDS & allocate SDS ID array */
747 : /* ------------------------------------------- */
748 0 : nSDS = 0;
749 0 : for (j = 0; j < nObjects; j++)
750 : {
751 0 : if (tags[j] == DFTAG_NDG)
752 : {
753 0 : nSDS++;
754 : }
755 : }
756 0 : GDXGrid[i].sdsID = (int32 *) calloc(nSDS, 4);
757 0 : if(GDXGrid[i].sdsID == NULL && nSDS != 0)
758 : {
759 0 : HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
760 0 : free(tags);
761 0 : free(refs);
762 0 : return(-1);
763 : }
764 0 : nSDS = 0;
765 :
766 :
767 :
768 : /* Fill SDS ID array */
769 : /* ----------------- */
770 0 : for (j = 0; j < nObjects; j++)
771 : {
772 : /* If object is SDS then get id */
773 : /* ---------------------------- */
774 0 : if (tags[j] == DFTAG_NDG)
775 : {
776 0 : l_index = SDreftoindex(sdInterfaceID, refs[j]);
777 0 : sdid = SDselect(sdInterfaceID, l_index);
778 0 : GDXGrid[i].sdsID[nSDS] = sdid;
779 0 : nSDS++;
780 0 : GDXGrid[i].nSDS++;
781 : }
782 : }
783 0 : free(tags);
784 0 : free(refs);
785 : }
786 0 : break;
787 : }
788 :
789 : /* Detach Vgroup if not desired Grid */
790 : /* --------------------------------- */
791 0 : Vdetach(vgid[0]);
792 : }
793 :
794 : /* If Grid not found then set up error message */
795 : /* ------------------------------------------- */
796 0 : if (gridID == -1)
797 : {
798 0 : HEpush(DFE_RANGE, "GDattach", __FILE__, __LINE__);
799 0 : HEreport("Grid: \"%s\" does not exist within HDF file.\n",
800 : gridname);
801 : }
802 : }
803 : else
804 : {
805 : /* Too many files opened */
806 : /* --------------------- */
807 0 : gridID = -1;
808 0 : strcpy(errbuf,
809 : "No more than %d grids may be open simultaneously");
810 0 : strcat(errbuf, " (%s)");
811 0 : HEpush(DFE_DENIED, "GDattach", __FILE__, __LINE__);
812 0 : HEreport(errbuf, NGRID, gridname);
813 : }
814 :
815 : }
816 0 : return (gridID);
817 : }
818 :
819 :
820 : /*----------------------------------------------------------------------------|
821 : | BEGIN_PROLOG |
822 : | |
823 : | FUNCTION: GDchkgdid |
824 : | |
825 : | DESCRIPTION: |
826 : | |
827 : | |
828 : | Return Value Type Units Description |
829 : | ============ ====== ========= ===================================== |
830 : | status intn return status (0) SUCCEED, (-1) FAIL |
831 : | |
832 : | INPUTS: |
833 : | gridID int32 grid structure ID |
834 : | routname char Name of routine calling GDchkgdid |
835 : | |
836 : | OUTPUTS: |
837 : | fid int32 File ID |
838 : | sdInterfaceID int32 SDS interface ID |
839 : | gdVgrpID int32 grid Vgroup ID |
840 : | |
841 : | |
842 : | OUTPUTS: |
843 : | None |
844 : | |
845 : | NOTES: |
846 : | |
847 : | |
848 : | Date Programmer Description |
849 : | ====== ============ ================================================= |
850 : | Jun 96 Joel Gales Original Programmer |
851 : | |
852 : | END_PROLOG |
853 : -----------------------------------------------------------------------------*/
854 : static intn
855 0 : GDchkgdid(int32 gridID, const char *routname,
856 : int32 * fid, int32 * sdInterfaceID, int32 * gdVgrpID)
857 : {
858 0 : intn status = 0; /* routine return status variable */
859 : uint8 l_access; /* Read/Write l_access code */
860 : int32 gID; /* Grid ID - offset */
861 :
862 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
863 :
864 : static const char message1[] =
865 : "Invalid grid id: %d in routine \"%s\". ID must be >= %d and < %d.\n";
866 : static const char message2[] =
867 : "Grid id %d in routine \"%s\" not active.\n";
868 :
869 :
870 :
871 : /* Check for valid grid id */
872 :
873 0 : if (gridID < idOffset || gridID >= NGRID + idOffset)
874 : {
875 0 : status = -1;
876 0 : HEpush(DFE_RANGE, "GDchkgdid", __FILE__, __LINE__);
877 0 : HEreport(message1, gridID, routname, idOffset, NGRID + idOffset);
878 : }
879 : else
880 : {
881 :
882 : /* Compute "reduced" ID */
883 : /* -------------------- */
884 0 : gID = gridID % idOffset;
885 :
886 :
887 : /* Check for active grid ID */
888 : /* ------------------------ */
889 0 : if (GDXGrid[gID].active == 0)
890 : {
891 0 : status = -1;
892 0 : HEpush(DFE_GENAPP, "GDchkgdid", __FILE__, __LINE__);
893 0 : HEreport(message2, gridID, routname);
894 : }
895 : else
896 : {
897 :
898 : /* Get file & SDS ids and Grid key */
899 : /* -------------------------------- */
900 0 : status = EHchkfid(GDXGrid[gID].fid, " ",
901 : fid, sdInterfaceID, &l_access);
902 0 : *gdVgrpID = GDXGrid[gID].IDTable;
903 : }
904 : }
905 0 : return (status);
906 :
907 : }
908 :
909 :
910 : /*----------------------------------------------------------------------------|
911 : | BEGIN_PROLOG |
912 : | |
913 : | FUNCTION: GDdefdim |
914 : | |
915 : | DESCRIPTION: Defines a new dimension within the grid. |
916 : | |
917 : | |
918 : | Return Value Type Units Description |
919 : | ============ ====== ========= ===================================== |
920 : | status intn return status (0) SUCCEED, (-1) FAIL |
921 : | |
922 : | INPUTS: |
923 : | gridID int32 grid structure ID |
924 : | dimname char Dimension name to define |
925 : | dim int32 Dimension value |
926 : | |
927 : | |
928 : | OUTPUTS: |
929 : | None |
930 : | |
931 : | NOTES: |
932 : | |
933 : | |
934 : | Date Programmer Description |
935 : | ====== ============ ================================================= |
936 : | Jun 96 Joel Gales Original Programmer |
937 : | |
938 : | END_PROLOG |
939 : -----------------------------------------------------------------------------*/
940 : intn
941 0 : GDdefdim(int32 gridID, const char *dimname, int32 dim)
942 :
943 : {
944 : intn status; /* routine return status variable */
945 :
946 : int32 fid; /* HDF-EOS file id */
947 : int32 sdInterfaceID; /* HDF SDS interface ID */
948 : int32 gdVgrpID; /* Grid root Vgroup ID */
949 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
950 :
951 : char gridname[80] /* Grid name */ ;
952 :
953 :
954 : /* Check for valid grid id */
955 0 : status = GDchkgdid(gridID, "GDdefinedim",
956 : &fid, &sdInterfaceID, &gdVgrpID);
957 :
958 :
959 : /* Make sure dimension >= 0 */
960 : /* ------------------------ */
961 0 : if (dim < 0)
962 : {
963 0 : status = -1;
964 0 : HEpush(DFE_GENAPP, "GDdefdim", __FILE__, __LINE__);
965 0 : HEreport("Dimension value for \"%s\" less than zero: %d.\n",
966 : dimname, dim);
967 : }
968 :
969 :
970 : /* Write Dimension to Structural MetaData */
971 : /* -------------------------------------- */
972 0 : if (status == 0)
973 : {
974 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
975 : /* The cast to char* is somehow nasty since EHinsertmeta can modify */
976 : /* dimname, but not in this case since we call with metacode = 0 */
977 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 0L,
978 : (char*) dimname, &dim);
979 : }
980 0 : return (status);
981 :
982 : }
983 :
984 : /*----------------------------------------------------------------------------|
985 : | BEGIN_PROLOG |
986 : | |
987 : | FUNCTION: GDdefproj |
988 : | |
989 : | DESCRIPTION: Defines projection of grid. |
990 : | |
991 : | |
992 : | Return Value Type Units Description |
993 : | ============ ====== ========= ===================================== |
994 : | status intn return status (0) SUCCEED, (-1) FAIL |
995 : | |
996 : | INPUTS: |
997 : | gridID int32 Grid structure ID |
998 : | projcode int32 GCTP projection code |
999 : | zonecode int32 UTM zone code |
1000 : | spherecode int32 GCTP spheriod code |
1001 : | projparm float64 Projection parameters |
1002 : | |
1003 : | OUTPUTS: |
1004 : | None |
1005 : | |
1006 : | NOTES: |
1007 : | |
1008 : | |
1009 : | Date Programmer Description |
1010 : | ====== ============ ================================================= |
1011 : | Jun 96 Joel Gales Original Programmer |
1012 : | Jun 00 Abe Taaheri Added support for EASE grid |
1013 : | |
1014 : | END_PROLOG |
1015 : -----------------------------------------------------------------------------*/
1016 : intn
1017 0 : GDdefproj(int32 gridID, int32 projcode, int32 zonecode, int32 spherecode,
1018 : float64 projparm[])
1019 : {
1020 : intn i; /* Loop index */
1021 : intn projx; /* Projection table l_index */
1022 0 : intn status = 0; /* routine return status variable */
1023 :
1024 : int32 fid; /* HDF-EOS file ID */
1025 : int32 sdInterfaceID; /* HDF SDS interface ID */
1026 : int32 gdVgrpID; /* Grid root Vgroup ID */
1027 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1028 : int32 slen; /* String length */
1029 : char utlbuf[1024]; /* Utility Buffer */
1030 : char projparmbuf[512]; /* Projection parameter metadata
1031 : * string */
1032 : char gridname[80]; /* Grid Name */
1033 :
1034 :
1035 : /* Check for valid grid id */
1036 : /* ----------------------- */
1037 0 : status = GDchkgdid(gridID, "GDdefproj", &fid, &sdInterfaceID, &gdVgrpID);
1038 :
1039 0 : if (status == 0)
1040 : {
1041 : /*
1042 : * If projection not GEO, UTM, or State Code build projection
1043 : * parameter string
1044 : */
1045 0 : if (projcode != GCTP_GEO &&
1046 0 : projcode != GCTP_UTM &&
1047 : projcode != GCTP_SPCS)
1048 : {
1049 :
1050 : /* Begin projection parameter list with "(" */
1051 0 : strcpy(projparmbuf, "(");
1052 :
1053 0 : for (i = 0; i < 13; i++)
1054 : {
1055 : /* If projparm[i] = 0 ... */
1056 0 : if (projparm[i] == 0.0)
1057 : {
1058 0 : strcpy(utlbuf, "0,");
1059 : }
1060 : else
1061 : {
1062 : /* if projparm[i] is integer ... */
1063 0 : if ((int32) projparm[i] == projparm[i])
1064 : {
1065 0 : snprintf(utlbuf, sizeof(utlbuf), "%d%s",
1066 0 : (int) projparm[i], ",");
1067 : }
1068 : /* else projparm[i] is non-zero floating point ... */
1069 : else
1070 : {
1071 0 : CPLsnprintf(utlbuf, sizeof(utlbuf), "%f%s", projparm[i], ",");
1072 : }
1073 : }
1074 0 : strcat(projparmbuf, utlbuf);
1075 : }
1076 0 : slen = (int)strlen(projparmbuf);
1077 :
1078 : /* Add trailing ")" */
1079 0 : projparmbuf[slen - 1] = ')';
1080 : }
1081 :
1082 0 : for (projx = 0; Projections[projx].projcode != -1; projx++)
1083 : {
1084 0 : if (projcode == Projections[projx].projcode)
1085 : {
1086 0 : break;
1087 : }
1088 : }
1089 :
1090 :
1091 : /* Build metadata string */
1092 : /* --------------------- */
1093 0 : if (projcode == GCTP_GEO)
1094 : {
1095 0 : snprintf(utlbuf, sizeof(utlbuf),
1096 : "%s%s%s",
1097 : "\t\tProjection=", Projections[projx].projname, "\n");
1098 : }
1099 0 : else if (projcode == GCTP_UTM || projcode == GCTP_SPCS)
1100 : {
1101 0 : snprintf(utlbuf, sizeof(utlbuf),
1102 : "%s%s%s%s%d%s%s%d%s",
1103 : "\t\tProjection=", Projections[projx].projname, "\n",
1104 : "\t\tZoneCode=", (int)zonecode, "\n",
1105 : "\t\tSphereCode=", (int)spherecode, "\n");
1106 : }
1107 : else
1108 : {
1109 0 : snprintf(utlbuf, sizeof(utlbuf),
1110 : "%s%s%s%s%s%s%s%d%s",
1111 : "\t\tProjection=", Projections[projx].projname, "\n",
1112 : "\t\tProjParams=", projparmbuf, "\n",
1113 : "\t\tSphereCode=", (int)spherecode, "\n");
1114 : }
1115 :
1116 :
1117 : /* Insert in structural metadata */
1118 : /* ----------------------------- */
1119 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1120 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 101L,
1121 : utlbuf, NULL);
1122 : }
1123 :
1124 0 : return (status);
1125 : }
1126 :
1127 :
1128 :
1129 : /*----------------------------------------------------------------------------|
1130 : | BEGIN_PROLOG |
1131 : | |
1132 : | FUNCTION: GDblkSOMoffset |
1133 : | |
1134 : | DESCRIPTION: Writes Block SOM offset values |
1135 : | |
1136 : | |
1137 : | Return Value Type Units Description |
1138 : | ============ ====== ========= ===================================== |
1139 : | status intn return status (0) SUCCEED, (-1) FAIL |
1140 : | |
1141 : | INPUTS: |
1142 : | gridID int32 Grid structure ID |
1143 : | offset float32 Offset values |
1144 : | count int32 Number of offset values |
1145 : | code char w/r code (w/r) |
1146 : | |
1147 : | OUTPUTS: |
1148 : | None |
1149 : | |
1150 : | NOTES: |
1151 : | |
1152 : | |
1153 : | Date Programmer Description |
1154 : | ====== ============ ================================================= |
1155 : | Sep 96 Joel Gales Original Programmer |
1156 : | Mar 99 David Wynne Changed data type of offset array from int32 to |
1157 : | float32, NCR 21197 |
1158 : | |
1159 : | END_PROLOG |
1160 : -----------------------------------------------------------------------------*/
1161 : intn
1162 0 : GDblkSOMoffset(int32 gridID, float32 offset[], int32 count, const char *code)
1163 : {
1164 0 : intn status = 0; /* routine return status variable */
1165 :
1166 : int32 fid; /* HDF-EOS file ID */
1167 : int32 sdInterfaceID; /* HDF SDS interface ID */
1168 : int32 gdVgrpID; /* Grid root Vgroup ID */
1169 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1170 : int32 projcode; /* GCTP projection code */
1171 :
1172 : float64 projparm[13]; /* Projection parameters */
1173 :
1174 : char utlbuf[128];/* Utility Buffer */
1175 : char gridname[80]; /* Grid Name */
1176 :
1177 : /* Check for valid grid id */
1178 0 : status = GDchkgdid(gridID, "GDblkSOMoffset",
1179 : &fid, &sdInterfaceID, &gdVgrpID);
1180 :
1181 0 : if (status == 0)
1182 : {
1183 : /* Get projection parameters */
1184 0 : status = GDprojinfo(gridID, &projcode, NULL, NULL, projparm);
1185 :
1186 : /* If SOM projection with projparm[11] non-zero ... */
1187 0 : if (projcode == GCTP_SOM && projparm[11] != 0)
1188 : {
1189 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1190 0 : snprintf(utlbuf, sizeof(utlbuf),"%s%s", "_BLKSOM:", gridname);
1191 :
1192 : /* Write offset values as attribute */
1193 0 : if (strcmp(code, "w") == 0)
1194 : {
1195 0 : status = GDwriteattr(gridID, utlbuf, DFNT_FLOAT32,
1196 : count, offset);
1197 : }
1198 : /* Read offset values from attribute */
1199 0 : else if (strcmp(code, "r") == 0)
1200 : {
1201 0 : status = GDreadattr(gridID, utlbuf, offset);
1202 : }
1203 : }
1204 : }
1205 0 : return (status);
1206 : }
1207 :
1208 :
1209 : /*----------------------------------------------------------------------------|
1210 : | BEGIN_PROLOG |
1211 : | |
1212 : | FUNCTION: GDdefcomp |
1213 : | |
1214 : | DESCRIPTION: Defines compression type and parameters |
1215 : | |
1216 : | |
1217 : | Return Value Type Units Description |
1218 : | ============ ====== ========= ===================================== |
1219 : | status intn return status (0) SUCCEED, (-1) FAIL |
1220 : | |
1221 : | INPUTS: |
1222 : | gridID int32 grid structure ID |
1223 : | compcode int32 compression code |
1224 : | compparm intn compression parameters |
1225 : | |
1226 : | OUTPUTS: |
1227 : | None |
1228 : | |
1229 : | NOTES: |
1230 : | |
1231 : | |
1232 : | Date Programmer Description |
1233 : | ====== ============ ================================================= |
1234 : | Sep 96 Joel Gales Original Programmer |
1235 : | |
1236 : | END_PROLOG |
1237 : -----------------------------------------------------------------------------*/
1238 : intn
1239 0 : GDdefcomp(int32 gridID, int32 compcode, intn compparm[])
1240 : {
1241 0 : intn status = 0; /* routine return status variable */
1242 :
1243 : int32 fid; /* HDF-EOS file id */
1244 : int32 sdInterfaceID; /* HDF SDS interface ID */
1245 : int32 gdVgrpID; /* Grid root Vgroup ID */
1246 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1247 : int32 gID; /* gridID - offset */
1248 :
1249 : /* Check for valid grid id */
1250 0 : status = GDchkgdid(gridID, "GDdefcomp", &fid, &sdInterfaceID, &gdVgrpID);
1251 :
1252 0 : if (status == 0)
1253 : {
1254 0 : gID = gridID % idOffset;
1255 :
1256 : /* Set compression code in compression external array */
1257 0 : GDXGrid[gID].compcode = compcode;
1258 :
1259 0 : switch (compcode)
1260 : {
1261 : /* Set NBIT compression parameters in compression external array */
1262 0 : case HDFE_COMP_NBIT:
1263 :
1264 0 : GDXGrid[gID].compparm[0] = compparm[0];
1265 0 : GDXGrid[gID].compparm[1] = compparm[1];
1266 0 : GDXGrid[gID].compparm[2] = compparm[2];
1267 0 : GDXGrid[gID].compparm[3] = compparm[3];
1268 :
1269 0 : break;
1270 :
1271 : /* Set GZIP compression parameter in compression external array */
1272 0 : case HDFE_COMP_DEFLATE:
1273 :
1274 0 : GDXGrid[gID].compparm[0] = compparm[0];
1275 :
1276 0 : break;
1277 :
1278 : }
1279 0 : }
1280 :
1281 0 : return (status);
1282 : }
1283 :
1284 :
1285 :
1286 :
1287 : /*----------------------------------------------------------------------------|
1288 : | BEGIN_PROLOG |
1289 : | |
1290 : | FUNCTION: GDdeftile |
1291 : | |
1292 : | DESCRIPTION: Defines tiling parameters |
1293 : | |
1294 : | |
1295 : | Return Value Type Units Description |
1296 : | ============ ====== ========= ===================================== |
1297 : | status intn return status (0) SUCCEED, (-1) FAIL |
1298 : | |
1299 : | INPUTS: |
1300 : | gridID int32 grid structure ID |
1301 : | tilecode int32 tile code |
1302 : | tilerank int32 number of tiling dimensions |
1303 : | tiledims int32 tiling dimensions |
1304 : | |
1305 : | OUTPUTS: |
1306 : | None |
1307 : | |
1308 : | NOTES: |
1309 : | |
1310 : | |
1311 : | Date Programmer Description |
1312 : | ====== ============ ================================================= |
1313 : | Jan 97 Joel Gales Original Programmer |
1314 : | |
1315 : | END_PROLOG |
1316 : -----------------------------------------------------------------------------*/
1317 : intn
1318 0 : GDdeftile(int32 gridID, int32 tilecode, int32 tilerank, int32 tiledims[])
1319 : {
1320 : intn i; /* Loop index */
1321 0 : intn status = 0; /* routine return status variable */
1322 :
1323 : int32 fid; /* HDF-EOS file id */
1324 : int32 sdInterfaceID; /* HDF SDS interface ID */
1325 : int32 gdVgrpID; /* Grid root Vgroup ID */
1326 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1327 : int32 gID; /* gridID - offset */
1328 :
1329 : /* Check for valid grid id */
1330 : /* ----------------------- */
1331 0 : status = GDchkgdid(gridID, "GDdeftile", &fid, &sdInterfaceID, &gdVgrpID);
1332 :
1333 :
1334 0 : if (status == 0)
1335 : {
1336 0 : gID = gridID % idOffset;
1337 :
1338 0 : for (i = 0; i < 8; i++)
1339 : {
1340 0 : GDXGrid[gID].tiledims[i] = 0;
1341 : }
1342 :
1343 0 : GDXGrid[gID].tilecode = tilecode;
1344 :
1345 0 : switch (tilecode)
1346 : {
1347 0 : case HDFE_NOTILE:
1348 :
1349 0 : GDXGrid[gID].tilerank = 0;
1350 :
1351 0 : break;
1352 :
1353 :
1354 0 : case HDFE_TILE:
1355 :
1356 0 : GDXGrid[gID].tilerank = tilerank;
1357 :
1358 0 : for (i = 0; i < tilerank; i++)
1359 : {
1360 0 : GDXGrid[gID].tiledims[i] = tiledims[i];
1361 :
1362 0 : if (GDXGrid[gID].tiledims[i] == 0)
1363 : {
1364 0 : GDXGrid[gID].tiledims[i] = 1;
1365 : }
1366 : }
1367 :
1368 0 : break;
1369 :
1370 : }
1371 0 : }
1372 :
1373 0 : return (status);
1374 : }
1375 :
1376 :
1377 :
1378 :
1379 : /*----------------------------------------------------------------------------|
1380 : | BEGIN_PROLOG |
1381 : | |
1382 : | FUNCTION: GDdeforigin |
1383 : | |
1384 : | DESCRIPTION: Defines the origin of the grid data. |
1385 : | |
1386 : | |
1387 : | Return Value Type Units Description |
1388 : | ============ ====== ========= ===================================== |
1389 : | status intn return status (0) SUCCEED, (-1) FAIL |
1390 : | |
1391 : | INPUTS: |
1392 : | gridID int32 grid structure ID |
1393 : | origincode int32 origin code |
1394 : | HDFE_GD_UL (0) |
1395 : | HDFE_GD_UR (1) |
1396 : | HDFE_GD_LL (2) |
1397 : | HDFE_GD_LR (3) |
1398 : | |
1399 : | |
1400 : | OUTPUTS: |
1401 : | None |
1402 : | |
1403 : | NOTES: |
1404 : | |
1405 : | |
1406 : | Date Programmer Description |
1407 : | ====== ============ ================================================= |
1408 : | Jun 96 Joel Gales Original Programmer |
1409 : | |
1410 : | END_PROLOG |
1411 : -----------------------------------------------------------------------------*/
1412 : intn
1413 0 : GDdeforigin(int32 gridID, int32 origincode)
1414 : {
1415 0 : intn status = 0; /* routine return status variable */
1416 :
1417 : int32 fid; /* HDF-EOS file ID */
1418 : int32 gdVgrpID; /* Grid root Vgroup ID */
1419 : int32 sdInterfaceID; /* HDF SDS interface ID */
1420 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1421 :
1422 : char utlbuf[64]; /* Utility buffer */
1423 : char gridname[80]; /* Grid name */
1424 :
1425 :
1426 : /* Check for valid grid id */
1427 0 : status = GDchkgdid(gridID, "GDdeforigin",
1428 : &fid, &sdInterfaceID, &gdVgrpID);
1429 :
1430 0 : if (status == 0)
1431 : {
1432 : /* If proper origin code then write to structural metadata */
1433 : /* ------------------------------------------------------- */
1434 0 : if (origincode >= 0 && origincode < (int32)sizeof(originNames))
1435 : {
1436 0 : snprintf(utlbuf, sizeof(utlbuf),"%s%s%s",
1437 : "\t\tGridOrigin=", originNames[origincode], "\n");
1438 :
1439 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1440 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 101L,
1441 : utlbuf, NULL);
1442 : }
1443 : else
1444 : {
1445 0 : status = -1;
1446 0 : HEpush(DFE_GENAPP, "GDdeforigin", __FILE__, __LINE__);
1447 0 : HEreport("Improper Grid Origin code: %d\n", origincode);
1448 : }
1449 : }
1450 :
1451 0 : return (status);
1452 : }
1453 :
1454 : /*----------------------------------------------------------------------------|
1455 : | BEGIN_PROLOG |
1456 : | |
1457 : | FUNCTION: GDdefpixreg |
1458 : | |
1459 : | DESCRIPTION: Defines pixel registration within grid cell. |
1460 : | |
1461 : | |
1462 : | Return Value Type Units Description |
1463 : | ============ ====== ========= ===================================== |
1464 : | status intn return status (0) SUCCEED, (-1) FAIL |
1465 : | |
1466 : | INPUTS: |
1467 : | gridID int32 grid structure ID |
1468 : | pixregcode int32 Pixel registration code |
1469 : | HDFE_CENTER (0) |
1470 : | HDFE_CORNER (1) |
1471 : | |
1472 : | |
1473 : | OUTPUTS: |
1474 : | None |
1475 : | |
1476 : | NOTES: |
1477 : | |
1478 : | |
1479 : | Date Programmer Description |
1480 : | ====== ============ ================================================= |
1481 : | Jun 96 Joel Gales Original Programmer |
1482 : | |
1483 : | END_PROLOG |
1484 : -----------------------------------------------------------------------------*/
1485 : intn
1486 0 : GDdefpixreg(int32 gridID, int32 pixregcode)
1487 : {
1488 0 : intn status = 0; /* routine return status variable */
1489 :
1490 : int32 fid; /* HDF-EOS file ID */
1491 : int32 gdVgrpID; /* Grid root Vgroup ID */
1492 : int32 sdInterfaceID; /* HDF SDS interface ID */
1493 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1494 :
1495 : char utlbuf[64]; /* Utility buffer */
1496 : char gridname[80]; /* Grid name */
1497 :
1498 : /* Check for valid grid id */
1499 0 : status = GDchkgdid(gridID, "GDdefpixreg",
1500 : &fid, &sdInterfaceID, &gdVgrpID);
1501 :
1502 0 : if (status == 0)
1503 : {
1504 : /* If proper pix reg code then write to structural metadata */
1505 : /* -------------------------------------------------------- */
1506 0 : if (pixregcode >= 0 && pixregcode < (int32)sizeof(pixregNames))
1507 : {
1508 0 : snprintf(utlbuf, sizeof(utlbuf),"%s%s%s",
1509 : "\t\tPixelRegistration=", pixregNames[pixregcode], "\n");
1510 :
1511 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1512 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 101L,
1513 : utlbuf, NULL);
1514 : }
1515 : else
1516 : {
1517 0 : status = -1;
1518 0 : HEpush(DFE_GENAPP, "GDdefpixreg", __FILE__, __LINE__);
1519 0 : HEreport("Improper Pixel Registration code: %d\n", pixregcode);
1520 : }
1521 : }
1522 :
1523 0 : return (status);
1524 :
1525 : }
1526 :
1527 :
1528 :
1529 :
1530 :
1531 : /*----------------------------------------------------------------------------|
1532 : | BEGIN_PROLOG |
1533 : | |
1534 : | FUNCTION: GDdiminfo |
1535 : | |
1536 : | DESCRIPTION: Retrieve size of specified dimension. |
1537 : | |
1538 : | |
1539 : | Return Value Type Units Description |
1540 : | ============ ====== ========= ===================================== |
1541 : | size int32 Size of dimension |
1542 : | |
1543 : | INPUTS: |
1544 : | gridID int32 grid structure id |
1545 : | dimname char Dimension name |
1546 : | |
1547 : | |
1548 : | OUTPUTS: |
1549 : | None |
1550 : | |
1551 : | NOTES: |
1552 : | |
1553 : | |
1554 : | Date Programmer Description |
1555 : | ====== ============ ================================================= |
1556 : | Jun 96 Joel Gales Original Programmer |
1557 : | Aug 96 Joel Gales Make metadata ODL compliant |
1558 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
1559 : | |
1560 : | END_PROLOG |
1561 : -----------------------------------------------------------------------------*/
1562 : int32
1563 0 : GDdiminfo(int32 gridID, const char *dimname)
1564 :
1565 : {
1566 : intn status; /* routine return status variable */
1567 :
1568 : int32 fid; /* HDF-EOS file ID */
1569 : int32 sdInterfaceID; /* HDF SDS interface ID */
1570 : int32 gdVgrpID; /* Grid root Vgroup ID */
1571 : int32 size; /* Dimension size */
1572 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1573 :
1574 :
1575 : char *metabuf; /* Pointer to structural metadata (SM) */
1576 : char *metaptrs[2];/* Pointers to begin and end of SM section */
1577 : char gridname[80]; /* Grid Name */
1578 : char *utlstr; /* Utility string */
1579 :
1580 : /* Allocate space for utility string */
1581 : /* --------------------------------- */
1582 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
1583 0 : if(utlstr == NULL)
1584 : {
1585 0 : HEpush(DFE_NOSPACE,"GDdiminfo", __FILE__, __LINE__);
1586 0 : return(-1);
1587 : }
1588 : /* Initialize return value */
1589 : /* ----------------------- */
1590 0 : size = -1;
1591 :
1592 :
1593 : /* Check Grid ID */
1594 : /* ------------- */
1595 0 : status = GDchkgdid(gridID, "GDdiminfo", &fid, &sdInterfaceID, &gdVgrpID);
1596 :
1597 :
1598 0 : if (status == 0)
1599 : {
1600 : /* Get grid name */
1601 : /* ------------- */
1602 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1603 :
1604 :
1605 : /* Get pointers to "Dimension" section within SM */
1606 : /* --------------------------------------------- */
1607 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
1608 : "Dimension", metaptrs);
1609 :
1610 0 : if(metabuf == NULL)
1611 : {
1612 0 : free(utlstr);
1613 0 : return(-1);
1614 : }
1615 :
1616 : /* Search for dimension name (surrounded by quotes) */
1617 : /* ------------------------------------------------ */
1618 0 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", dimname, "\"\n");
1619 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
1620 :
1621 : /*
1622 : * If dimension found within grid structure then get dimension value
1623 : */
1624 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
1625 : {
1626 : /* Set endptr at end of dimension definition entry */
1627 : /* ----------------------------------------------- */
1628 0 : metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
1629 :
1630 0 : status = EHgetmetavalue(metaptrs, "Size", utlstr);
1631 :
1632 0 : if (status == 0)
1633 : {
1634 0 : size = atoi(utlstr);
1635 : }
1636 : else
1637 : {
1638 0 : HEpush(DFE_GENAPP, "GDdiminfo", __FILE__, __LINE__);
1639 0 : HEreport("\"Size\" string not found in metadata.\n");
1640 : }
1641 : }
1642 : else
1643 : {
1644 0 : HEpush(DFE_GENAPP, "GDdiminfo", __FILE__, __LINE__);
1645 0 : HEreport("Dimension \"%s\" not found.\n", dimname);
1646 : }
1647 :
1648 0 : free(metabuf);
1649 : }
1650 0 : free(utlstr);
1651 0 : return (size);
1652 : }
1653 :
1654 :
1655 :
1656 :
1657 :
1658 : /*----------------------------------------------------------------------------|
1659 : | BEGIN_PROLOG |
1660 : | |
1661 : | FUNCTION: GDgridinfo |
1662 : | |
1663 : | DESCRIPTION: Returns xdim, ydim and location of upper left and lower |
1664 : | right corners, in meters. |
1665 : | |
1666 : | |
1667 : | Return Value Type Units Description |
1668 : | ============ ====== ========= ===================================== |
1669 : | status intn return status (0) SUCCEED, (-1) FAIL |
1670 : | |
1671 : | INPUTS: |
1672 : | fid int32 File ID |
1673 : | gridname char Grid structure name |
1674 : | |
1675 : | OUTPUTS: |
1676 : | xdimsize int32 Number of columns in grid |
1677 : | ydimsize int32 Number of rows in grid |
1678 : | upleftpt float64 Location (m/deg) of upper left corner |
1679 : | lowrightpt float64 Location (m/deg) of lower right corner |
1680 : | |
1681 : | NOTES: |
1682 : | |
1683 : | |
1684 : | Date Programmer Description |
1685 : | ====== ============ ================================================= |
1686 : | Jun 96 Joel Gales Original Programmer |
1687 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
1688 : | |
1689 : | END_PROLOG |
1690 : -----------------------------------------------------------------------------*/
1691 : intn
1692 0 : GDgridinfo(int32 gridID, int32 * xdimsize, int32 * ydimsize,
1693 : float64 upleftpt[], float64 lowrightpt[])
1694 :
1695 : {
1696 0 : intn status = 0; /* routine return status variable */
1697 0 : intn statmeta = 0; /* EHgetmetavalue return status */
1698 :
1699 : int32 fid; /* HDF-EOS file ID */
1700 : int32 sdInterfaceID; /* HDF SDS interface ID */
1701 : int32 gdVgrpID; /* Grid root Vgroup ID */
1702 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1703 :
1704 :
1705 : char *metabuf; /* Pointer to structural metadata (SM) */
1706 : char *metaptrs[2];/* Pointers to begin and end of SM section */
1707 : char gridname[80]; /* Grid Name */
1708 : char *utlstr; /* Utility string */
1709 :
1710 : /* Allocate space for utility string */
1711 : /* --------------------------------- */
1712 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
1713 0 : if(utlstr == NULL)
1714 : {
1715 0 : HEpush(DFE_NOSPACE,"GDgridinfo", __FILE__, __LINE__);
1716 0 : return(-1);
1717 : }
1718 : /* Check Grid ID */
1719 : /* ------------- */
1720 0 : status = GDchkgdid(gridID, "GDgridinfo", &fid, &sdInterfaceID, &gdVgrpID);
1721 :
1722 0 : if (status == 0)
1723 : {
1724 : /* Get grid name */
1725 : /* ------------- */
1726 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1727 :
1728 :
1729 : /* Get pointers to grid structure section within SM */
1730 : /* ------------------------------------------------ */
1731 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
1732 : NULL, metaptrs);
1733 :
1734 0 : if(metabuf == NULL)
1735 : {
1736 0 : free(utlstr);
1737 0 : return(-1);
1738 : }
1739 :
1740 :
1741 : /* Get xdimsize if requested */
1742 : /* ------------------------- */
1743 0 : if (xdimsize != NULL)
1744 : {
1745 0 : statmeta = EHgetmetavalue(metaptrs, "XDim", utlstr);
1746 0 : if (statmeta == 0)
1747 : {
1748 0 : *xdimsize = atoi(utlstr);
1749 : }
1750 : else
1751 : {
1752 0 : status = -1;
1753 0 : HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
1754 0 : HEreport("\"XDim\" string not found in metadata.\n");
1755 : }
1756 : }
1757 :
1758 :
1759 : /* Get ydimsize if requested */
1760 : /* ------------------------- */
1761 0 : if (ydimsize != NULL)
1762 : {
1763 0 : statmeta = EHgetmetavalue(metaptrs, "YDim", utlstr);
1764 0 : if (statmeta == 0)
1765 : {
1766 0 : *ydimsize = atoi(utlstr);
1767 : }
1768 : else
1769 : {
1770 0 : status = -1;
1771 0 : HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
1772 0 : HEreport("\"YDim\" string not found in metadata.\n");
1773 : }
1774 : }
1775 :
1776 :
1777 : /* Get upleftpt if requested */
1778 : /* ------------------------- */
1779 0 : if (upleftpt != NULL)
1780 : {
1781 0 : statmeta = EHgetmetavalue(metaptrs, "UpperLeftPointMtrs", utlstr);
1782 0 : if (statmeta == 0)
1783 : {
1784 : /* If value is "DEFAULT" then return zeros */
1785 : /* --------------------------------------- */
1786 0 : if (strcmp(utlstr, "DEFAULT") == 0)
1787 : {
1788 0 : upleftpt[0] = 0;
1789 0 : upleftpt[1] = 0;
1790 : }
1791 : else
1792 : {
1793 0 : sscanf(utlstr, "(%lf,%lf)",
1794 : &upleftpt[0], &upleftpt[1]);
1795 : }
1796 : }
1797 : else
1798 : {
1799 0 : status = -1;
1800 0 : HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
1801 0 : HEreport(
1802 : "\"UpperLeftPointMtrs\" string not found in metadata.\n");
1803 : }
1804 :
1805 : }
1806 :
1807 : /* Get lowrightpt if requested */
1808 : /* --------------------------- */
1809 0 : if (lowrightpt != NULL)
1810 : {
1811 0 : statmeta = EHgetmetavalue(metaptrs, "LowerRightMtrs", utlstr);
1812 0 : if (statmeta == 0)
1813 : {
1814 : /* If value is "DEFAULT" then return zeros */
1815 0 : if (strcmp(utlstr, "DEFAULT") == 0)
1816 : {
1817 0 : lowrightpt[0] = 0;
1818 0 : lowrightpt[1] = 0;
1819 : }
1820 : else
1821 : {
1822 0 : sscanf(utlstr, "(%lf,%lf)",
1823 : &lowrightpt[0], &lowrightpt[1]);
1824 : }
1825 : }
1826 : else
1827 : {
1828 0 : status = -1;
1829 0 : HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
1830 0 : HEreport(
1831 : "\"LowerRightMtrs\" string not found in metadata.\n");
1832 : }
1833 : }
1834 :
1835 0 : free(metabuf);
1836 : }
1837 0 : free(utlstr);
1838 0 : return (status);
1839 : }
1840 :
1841 :
1842 :
1843 :
1844 :
1845 :
1846 :
1847 : /*----------------------------------------------------------------------------|
1848 : | BEGIN_PROLOG |
1849 : | |
1850 : | FUNCTION: GDprojinfo |
1851 : | |
1852 : | DESCRIPTION: Returns GCTP projection code, zone code, spheroid code |
1853 : | and projection parameters. |
1854 : | |
1855 : | |
1856 : | Return Value Type Units Description |
1857 : | ============ ====== ========= ===================================== |
1858 : | status intn return status (0) SUCCEED, (-1) FAIL |
1859 : | |
1860 : | INPUTS: |
1861 : | gridID int32 Grid structure ID |
1862 : | |
1863 : | OUTPUTS: |
1864 : | projcode int32 GCTP projection code |
1865 : | zonecode int32 UTM zone code |
1866 : | spherecode int32 GCTP spheriod code |
1867 : | projparm float64 Projection parameters |
1868 : | |
1869 : | NOTES: |
1870 : | |
1871 : | |
1872 : | Date Programmer Description |
1873 : | ====== ============ ================================================= |
1874 : | Jun 96 Joel Gales Original Programmer |
1875 : | Oct 96 Joel Gales Add check for no projection code |
1876 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
1877 : | Jun 00 Abe Taaheri Added support for EASE grid |
1878 : | |
1879 : | END_PROLOG |
1880 : -----------------------------------------------------------------------------*/
1881 : intn
1882 0 : GDprojinfo(int32 gridID, int32 * projcode, int32 * zonecode,
1883 : int32 * spherecode, float64 projparm[])
1884 :
1885 : {
1886 : intn i; /* Loop index */
1887 : intn projx; /* Loop index */
1888 0 : intn status = 0; /* routine return status variable */
1889 0 : intn statmeta = 0; /* EHgetmetavalue return status */
1890 :
1891 : int32 fid; /* HDF-EOS file ID */
1892 : int32 sdInterfaceID; /* HDF SDS interface ID */
1893 : int32 gdVgrpID; /* Grid root Vgroup ID */
1894 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
1895 :
1896 :
1897 : char *metabuf; /* Pointer to structural metadata (SM) */
1898 : char *metaptrs[2];/* Pointers to begin and end of SM section */
1899 : char gridname[80]; /* Grid Name */
1900 : char *utlstr; /* Utility string */
1901 : char fmt[96]; /* Format String */
1902 :
1903 : /* Allocate space for utility string */
1904 : /* --------------------------------- */
1905 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
1906 0 : if(utlstr == NULL)
1907 : {
1908 0 : HEpush(DFE_NOSPACE,"GDprojinfo", __FILE__, __LINE__);
1909 0 : return(-1);
1910 : }
1911 :
1912 : /* Check Grid ID */
1913 : /* ------------- */
1914 0 : status = GDchkgdid(gridID, "GDprojinfo", &fid, &sdInterfaceID, &gdVgrpID);
1915 :
1916 0 : if (status == 0)
1917 : {
1918 : /* Get grid name */
1919 : /* ------------- */
1920 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
1921 :
1922 :
1923 : /* Get pointers to grid structure section within SM */
1924 : /* ------------------------------------------------ */
1925 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
1926 : NULL, metaptrs);
1927 :
1928 0 : if(metabuf == NULL)
1929 : {
1930 0 : free(utlstr);
1931 0 : return(-1);
1932 : }
1933 :
1934 :
1935 : /* Get projcode if requested */
1936 : /* ------------------------- */
1937 0 : if (projcode != NULL)
1938 : {
1939 0 : *projcode = -1;
1940 :
1941 0 : statmeta = EHgetmetavalue(metaptrs, "Projection", utlstr);
1942 0 : if (statmeta == 0)
1943 : {
1944 : /* Loop through projection codes until found */
1945 : /* ----------------------------------------- */
1946 0 : for (projx = 0; Projections[projx].projcode != -1; projx++)
1947 0 : if (strcmp(utlstr, Projections[projx].projname) == 0)
1948 0 : break;
1949 0 : if (Projections[projx].projname != NULL)
1950 0 : *projcode = Projections[projx].projcode;
1951 : }
1952 : else
1953 : {
1954 0 : status = -1;
1955 0 : HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
1956 0 : HEreport("Projection Code not defined for \"%s\".\n",
1957 : gridname);
1958 :
1959 0 : if (projparm != NULL)
1960 : {
1961 0 : for (i = 0; i < 13; i++)
1962 : {
1963 0 : projparm[i] = -1;
1964 : }
1965 : }
1966 : }
1967 : }
1968 :
1969 :
1970 : /* Get zonecode if requested */
1971 : /* ------------------------- */
1972 0 : if (zonecode != NULL)
1973 : {
1974 0 : *zonecode = -1;
1975 :
1976 :
1977 : /* Zone code only relevant for UTM and State Code projections */
1978 : /* ---------------------------------------------------------- */
1979 0 : if (*projcode == GCTP_UTM || *projcode == GCTP_SPCS)
1980 : {
1981 0 : statmeta = EHgetmetavalue(metaptrs, "ZoneCode", utlstr);
1982 0 : if (statmeta == 0)
1983 : {
1984 0 : *zonecode = atoi(utlstr);
1985 : }
1986 : else
1987 : {
1988 0 : status = -1;
1989 0 : HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
1990 0 : HEreport("Zone Code not defined for \"%s\".\n",
1991 : gridname);
1992 : }
1993 : }
1994 : }
1995 :
1996 :
1997 : /* Get projection parameters if requested */
1998 : /* -------------------------------------- */
1999 0 : if (projparm != NULL)
2000 : {
2001 :
2002 : /*
2003 : * Note: No projection parameters for GEO, UTM, and State Code
2004 : * projections
2005 : */
2006 0 : if (*projcode == GCTP_GEO || *projcode == GCTP_UTM ||
2007 0 : *projcode == GCTP_SPCS)
2008 : {
2009 0 : for (i = 0; i < 13; i++)
2010 : {
2011 0 : projparm[i] = 0.0;
2012 : }
2013 :
2014 : }
2015 : else
2016 : {
2017 0 : statmeta = EHgetmetavalue(metaptrs, "ProjParams", utlstr);
2018 :
2019 0 : if (statmeta == 0)
2020 : {
2021 :
2022 : /* Build format string to read projection parameters */
2023 : /* ------------------------------------------------- */
2024 0 : strcpy(fmt, "%lf,");
2025 0 : for (i = 1; i <= 11; i++)
2026 0 : strcat(fmt, "%lf,");
2027 0 : strcat(fmt, "%lf");
2028 :
2029 :
2030 : /* Read parameters from numeric list */
2031 : /* --------------------------------- */
2032 0 : sscanf(&utlstr[1], fmt,
2033 : &projparm[0], &projparm[1],
2034 : &projparm[2], &projparm[3],
2035 : &projparm[4], &projparm[5],
2036 : &projparm[6], &projparm[7],
2037 : &projparm[8], &projparm[9],
2038 : &projparm[10], &projparm[11],
2039 : &projparm[12]);
2040 : }
2041 : else
2042 : {
2043 0 : status = -1;
2044 0 : HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
2045 0 : HEreport("Projection parameters not defined for \"%s\".\n",
2046 : gridname);
2047 :
2048 : }
2049 : }
2050 : }
2051 :
2052 :
2053 : /* Get spherecode if requested */
2054 : /* --------------------------- */
2055 0 : if (spherecode != NULL)
2056 : {
2057 0 : *spherecode = 0;
2058 :
2059 : /* Note: Spherecode not defined for GEO projection */
2060 : /* ----------------------------------------------- */
2061 0 : if ((*projcode != GCTP_GEO))
2062 : {
2063 0 : EHgetmetavalue(metaptrs, "SphereCode", utlstr);
2064 0 : if (statmeta == 0)
2065 : {
2066 0 : *spherecode = atoi(utlstr);
2067 : }
2068 : }
2069 : }
2070 0 : free(metabuf);
2071 :
2072 : }
2073 0 : free(utlstr);
2074 0 : return (status);
2075 : }
2076 :
2077 :
2078 :
2079 : /*----------------------------------------------------------------------------|
2080 : | BEGIN_PROLOG |
2081 : | |
2082 : | FUNCTION: GDorigininfo |
2083 : | |
2084 : | DESCRIPTION: Returns origin code |
2085 : | |
2086 : | |
2087 : | Return Value Type Units Description |
2088 : | ============ ====== ========= ===================================== |
2089 : | status intn return status (0) SUCCEED, (-1) FAIL |
2090 : | |
2091 : | INPUTS: |
2092 : | gridID int32 Grid structure ID |
2093 : | |
2094 : | |
2095 : | OUTPUTS: |
2096 : | origincode int32 grid origin code |
2097 : | |
2098 : | NOTES: |
2099 : | |
2100 : | |
2101 : | Date Programmer Description |
2102 : | ====== ============ ================================================= |
2103 : | Jun 96 Joel Gales Original Programmer |
2104 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
2105 : | |
2106 : | END_PROLOG |
2107 : -----------------------------------------------------------------------------*/
2108 : intn
2109 0 : GDorigininfo(int32 gridID, int32 * origincode)
2110 : {
2111 : intn i; /* Loop index */
2112 0 : intn status = 0; /* routine return status variable */
2113 0 : intn statmeta = 0; /* EHgetmetavalue return status */
2114 :
2115 : int32 fid; /* HDF-EOS file ID */
2116 : int32 sdInterfaceID; /* HDF SDS interface ID */
2117 : int32 gdVgrpID; /* Grid root Vgroup ID */
2118 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
2119 :
2120 :
2121 : char *metabuf; /* Pointer to structural metadata (SM) */
2122 : char *metaptrs[2];/* Pointers to begin and end of SM section */
2123 : char gridname[80]; /* Grid Name */
2124 : char *utlstr; /* Utility string */
2125 :
2126 : /* Allocate space for utility string */
2127 : /* --------------------------------- */
2128 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
2129 0 : if(utlstr == NULL)
2130 : {
2131 0 : HEpush(DFE_NOSPACE,"GDorigininfo", __FILE__, __LINE__);
2132 0 : return(-1);
2133 : }
2134 : /* Check Grid ID */
2135 : /* ------------- */
2136 0 : status = GDchkgdid(gridID, "GDorigininfo",
2137 : &fid, &sdInterfaceID, &gdVgrpID);
2138 :
2139 :
2140 : /* Initialize pixreg code to -1 (in case of error) */
2141 : /* ----------------------------------------------- */
2142 0 : *origincode = -1;
2143 :
2144 0 : if (status == 0)
2145 : {
2146 : /* Set default origin code */
2147 : /* ----------------------- */
2148 0 : *origincode = 0;
2149 :
2150 :
2151 : /* Get grid name */
2152 : /* ------------- */
2153 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
2154 :
2155 :
2156 : /* Get pointers to grid structure section within SM */
2157 : /* ------------------------------------------------ */
2158 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
2159 : NULL, metaptrs);
2160 :
2161 0 : if(metabuf == NULL)
2162 : {
2163 0 : free(utlstr);
2164 0 : return(-1);
2165 : }
2166 :
2167 :
2168 0 : statmeta = EHgetmetavalue(metaptrs, "GridOrigin", utlstr);
2169 :
2170 0 : if (statmeta == 0)
2171 : {
2172 : /*
2173 : * If "GridOrigin" string found in metadata then convert to
2174 : * numeric origin code (fixed added: Jan 97)
2175 : */
2176 0 : for (i = 0; i < (intn)sizeof(originNames); i++)
2177 : {
2178 0 : if (strcmp(utlstr, originNames[i]) == 0)
2179 : {
2180 0 : *origincode = i;
2181 0 : break;
2182 : }
2183 : }
2184 : }
2185 :
2186 0 : free(metabuf);
2187 : }
2188 0 : free(utlstr);
2189 0 : return (status);
2190 : }
2191 :
2192 :
2193 :
2194 :
2195 :
2196 :
2197 : /*----------------------------------------------------------------------------|
2198 : | BEGIN_PROLOG |
2199 : | |
2200 : | FUNCTION: GDpixreginfo |
2201 : | |
2202 : | DESCRIPTION: |
2203 : | |
2204 : | |
2205 : | Return Value Type Units Description |
2206 : | ============ ====== ========= ===================================== |
2207 : | status intn return status (0) SUCCEED, (-1) FAIL |
2208 : | |
2209 : | INPUTS: |
2210 : | gridID int32 Grid structure ID |
2211 : | |
2212 : | |
2213 : | OUTPUTS: |
2214 : | pixregcode int32 Pixel registration code |
2215 : | |
2216 : | |
2217 : | OUTPUTS: |
2218 : | None |
2219 : | |
2220 : | NOTES: |
2221 : | |
2222 : | |
2223 : | Date Programmer Description |
2224 : | ====== ============ ================================================= |
2225 : | Jun 96 Joel Gales Original Programmer |
2226 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
2227 : | |
2228 : | END_PROLOG |
2229 : -----------------------------------------------------------------------------*/
2230 : intn
2231 0 : GDpixreginfo(int32 gridID, int32 * pixregcode)
2232 : {
2233 : intn i; /* Loop index */
2234 0 : intn status = 0; /* routine return status variable */
2235 0 : intn statmeta = 0; /* EHgetmetavalue return status */
2236 :
2237 : int32 fid; /* HDF-EOS file ID */
2238 : int32 sdInterfaceID; /* HDF SDS interface ID */
2239 : int32 gdVgrpID; /* Grid root Vgroup ID */
2240 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
2241 :
2242 :
2243 : char *metabuf; /* Pointer to structural metadata (SM) */
2244 : char *metaptrs[2];/* Pointers to begin and end of SM section */
2245 : char gridname[80]; /* Grid Name */
2246 : char *utlstr; /* Utility string */
2247 :
2248 : /* Allocate space for utility string */
2249 : /* --------------------------------- */
2250 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
2251 0 : if(utlstr == NULL)
2252 : {
2253 0 : HEpush(DFE_NOSPACE,"GDpixreginfo", __FILE__, __LINE__);
2254 0 : return(-1);
2255 : }
2256 : /* Check Grid ID */
2257 0 : status = GDchkgdid(gridID, "GDpixreginfo",
2258 : &fid, &sdInterfaceID, &gdVgrpID);
2259 :
2260 : /* Initialize pixreg code to -1 (in case of error) */
2261 0 : *pixregcode = -1;
2262 :
2263 0 : if (status == 0)
2264 : {
2265 : /* Set default pixreg code */
2266 0 : *pixregcode = 0;
2267 :
2268 : /* Get grid name */
2269 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
2270 :
2271 : /* Get pointers to grid structure section within SM */
2272 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
2273 : NULL, metaptrs);
2274 :
2275 0 : if(metabuf == NULL)
2276 : {
2277 0 : free(utlstr);
2278 0 : return(-1);
2279 : }
2280 :
2281 :
2282 0 : statmeta = EHgetmetavalue(metaptrs, "PixelRegistration", utlstr);
2283 :
2284 0 : if (statmeta == 0)
2285 : {
2286 : /*
2287 : * If "PixelRegistration" string found in metadata then convert
2288 : * to numeric origin code (fixed added: Jan 97)
2289 : */
2290 :
2291 0 : for (i = 0; i < (intn)sizeof(pixregNames); i++)
2292 : {
2293 0 : if (strcmp(utlstr, pixregNames[i]) == 0)
2294 : {
2295 0 : *pixregcode = i;
2296 0 : break;
2297 : }
2298 : }
2299 : }
2300 0 : free(metabuf);
2301 : }
2302 0 : free(utlstr);
2303 0 : return (status);
2304 : }
2305 :
2306 :
2307 :
2308 : /*----------------------------------------------------------------------------|
2309 : | BEGIN_PROLOG |
2310 : | |
2311 : | FUNCTION: GDcompinfo |
2312 : | |
2313 : | DESCRIPTION: |
2314 : | |
2315 : | |
2316 : | Return Value Type Units Description |
2317 : | ============ ====== ========= ===================================== |
2318 : | status intn |
2319 : | |
2320 : | INPUTS: |
2321 : | gridID int32 |
2322 : | compcode int32 |
2323 : | compparm intn |
2324 : | |
2325 : | |
2326 : | OUTPUTS: |
2327 : | None |
2328 : | |
2329 : | NOTES: |
2330 : | |
2331 : | |
2332 : | Date Programmer Description |
2333 : | ====== ============ ================================================= |
2334 : | Oct 96 Joel Gales Original Programmer |
2335 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
2336 : | |
2337 : | END_PROLOG |
2338 : -----------------------------------------------------------------------------*/
2339 : intn
2340 0 : GDcompinfo(int32 gridID, const char *fieldname, int32 * compcode, intn compparm[])
2341 : {
2342 : intn i; /* Loop index */
2343 0 : intn status = 0; /* routine return status variable */
2344 0 : intn statmeta = 0; /* EHgetmetavalue return status */
2345 :
2346 : int32 fid; /* HDF-EOS file ID */
2347 : int32 sdInterfaceID; /* HDF SDS interface ID */
2348 : int32 gdVgrpID; /* Grid root Vgroup ID */
2349 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
2350 :
2351 :
2352 : char *metabuf; /* Pointer to structural metadata (SM) */
2353 : char *metaptrs[2];/* Pointers to begin and end of SM section */
2354 : char gridname[80]; /* Grid Name */
2355 : char *utlstr;/* Utility string */
2356 :
2357 : /* Allocate space for utility string */
2358 : /* --------------------------------- */
2359 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
2360 0 : if(utlstr == NULL)
2361 : {
2362 0 : HEpush(DFE_NOSPACE,"GDcompinfo", __FILE__, __LINE__);
2363 0 : return(-1);
2364 : }
2365 : /* Check Grid ID */
2366 0 : status = GDchkgdid(gridID, "GDcompinfo", &fid, &sdInterfaceID, &gdVgrpID);
2367 :
2368 :
2369 0 : if (status == 0)
2370 : {
2371 : /* Get grid name */
2372 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
2373 :
2374 : /* Get pointers to "DataField" section within SM */
2375 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
2376 : "DataField", metaptrs);
2377 0 : if(metabuf == NULL)
2378 : {
2379 0 : free(utlstr);
2380 0 : return(-1);
2381 : }
2382 :
2383 :
2384 : /* Search for field */
2385 0 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
2386 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
2387 :
2388 :
2389 : /* If field found and user wants compression code ... */
2390 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
2391 : {
2392 0 : if (compcode != NULL)
2393 : {
2394 : /* Set endptr at end of field's definition entry */
2395 0 : metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
2396 :
2397 : /* Get compression type */
2398 0 : statmeta = EHgetmetavalue(metaptrs, "CompressionType", utlstr);
2399 :
2400 : /*
2401 : * Default is no compression if "CompressionType" string not
2402 : * in metadata
2403 : */
2404 0 : *compcode = HDFE_COMP_NONE;
2405 :
2406 : /* If compression code is found ... */
2407 0 : if (statmeta == 0)
2408 : {
2409 : /* Loop through compression types until match */
2410 0 : for (i = 0; i < (intn)sizeof(HDFcomp); i++)
2411 : {
2412 0 : if (strcmp(utlstr, HDFcomp[i]) == 0)
2413 : {
2414 0 : *compcode = i;
2415 0 : break;
2416 : }
2417 : }
2418 : }
2419 : }
2420 :
2421 : /* If user wants compression parameters ... */
2422 0 : if (compparm != NULL && compcode != NULL)
2423 : {
2424 : /* Initialize to zero */
2425 0 : for (i = 0; i < 4; i++)
2426 : {
2427 0 : compparm[i] = 0;
2428 : }
2429 :
2430 : /*
2431 : * Get compression parameters if NBIT or DEFLATE compression
2432 : */
2433 0 : if (*compcode == HDFE_COMP_NBIT)
2434 : {
2435 : statmeta =
2436 0 : EHgetmetavalue(metaptrs, "CompressionParams", utlstr);
2437 0 : if (statmeta == 0)
2438 : {
2439 0 : sscanf(utlstr, "(%d,%d,%d,%d)",
2440 : &compparm[0], &compparm[1],
2441 : &compparm[2], &compparm[3]);
2442 : }
2443 : else
2444 : {
2445 0 : status = -1;
2446 0 : HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
2447 0 : HEreport(
2448 : "\"CompressionParams\" string not found in metadata.\n");
2449 : }
2450 : }
2451 0 : else if (*compcode == HDFE_COMP_DEFLATE)
2452 : {
2453 : statmeta =
2454 0 : EHgetmetavalue(metaptrs, "DeflateLevel", utlstr);
2455 0 : if (statmeta == 0)
2456 : {
2457 0 : sscanf(utlstr, "%d", &compparm[0]);
2458 : }
2459 : else
2460 : {
2461 0 : status = -1;
2462 0 : HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
2463 0 : HEreport(
2464 : "\"DeflateLevel\" string not found in metadata.\n");
2465 : }
2466 : }
2467 : }
2468 : }
2469 : else
2470 : {
2471 0 : HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
2472 0 : HEreport("Fieldname \"%s\" not found.\n", fieldname);
2473 : }
2474 :
2475 0 : free(metabuf);
2476 :
2477 : }
2478 0 : free(utlstr);
2479 0 : return (status);
2480 : }
2481 :
2482 :
2483 :
2484 :
2485 :
2486 :
2487 : /*----------------------------------------------------------------------------|
2488 : | BEGIN_PROLOG |
2489 : | |
2490 : | FUNCTION: GDfieldinfo |
2491 : | |
2492 : | DESCRIPTION: Retrieve information about a specific geolocation or data |
2493 : | field in the grid. |
2494 : | |
2495 : | |
2496 : | Return Value Type Units Description |
2497 : | ============ ====== ========= ===================================== |
2498 : | status intn return status (0) SUCCEED, (-1) FAIL |
2499 : | |
2500 : | INPUTS: |
2501 : | gridID int32 grid structure id |
2502 : | fieldname char name of field |
2503 : | |
2504 : | |
2505 : | OUTPUTS: |
2506 : | rank int32 rank of field (# of dims) |
2507 : | dims int32 field dimensions |
2508 : | numbertype int32 field number type |
2509 : | dimlist char field dimension list |
2510 : | |
2511 : | |
2512 : | OUTPUTS: |
2513 : | None |
2514 : | |
2515 : | NOTES: |
2516 : | |
2517 : | |
2518 : | Date Programmer Description |
2519 : | ====== ============ ================================================= |
2520 : | Jun 96 Joel Gales Original Programmer |
2521 : | Aug 96 Joel Gales Make metadata ODL compliant |
2522 : | Jan 97 Joel Gales Check for metadata error status from EHgetmetavalue |
2523 : | Feb 99 Abe Taaheri Changed memcpy to memmove to avoid overlapping |
2524 : | problem when copying strings |
2525 : | |
2526 : | END_PROLOG |
2527 : -----------------------------------------------------------------------------*/
2528 : intn
2529 0 : GDfieldinfo(int32 gridID, const char *fieldname, int32 * rank, int32 dims[],
2530 : int32 * numbertype, char *dimlist)
2531 :
2532 : {
2533 : intn i; /* Loop index */
2534 : intn status; /* routine return status variable */
2535 0 : intn statmeta = 0; /* EHgetmetavalue return status */
2536 :
2537 : int32 fid; /* HDF-EOS file ID */
2538 : int32 sdInterfaceID; /* HDF SDS interface ID */
2539 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
2540 0 : int32 ndims = 0; /* Number of dimensions */
2541 : int32 slen[8]; /* Length of each entry in parsed string */
2542 : int32 dum; /* Dummy variable */
2543 : int32 xdim; /* X dim size */
2544 : int32 ydim; /* Y dim size */
2545 : int32 sdid; /* SDS id */
2546 :
2547 : char *metabuf; /* Pointer to structural metadata (SM) */
2548 : char *metaptrs[2]; /* Pointers to begin and end of SM section */
2549 : char gridname[80]; /* Grid Name */
2550 : char *utlstr; /* Utility string */
2551 : char *ptr[8]; /* String pointers for parsed string */
2552 : char dimstr[64]; /* Individual dimension entry string */
2553 :
2554 :
2555 : /* Allocate space for utility string */
2556 : /* --------------------------------- */
2557 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
2558 0 : if(utlstr == NULL)
2559 : {
2560 0 : HEpush(DFE_NOSPACE,"GDfieldinfo", __FILE__, __LINE__);
2561 0 : return(-1);
2562 : }
2563 0 : *rank = -1;
2564 0 : *numbertype = -1;
2565 :
2566 0 : status = GDchkgdid(gridID, "GDfieldinfo", &fid, &sdInterfaceID, &dum);
2567 :
2568 0 : if (status == 0)
2569 : {
2570 :
2571 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
2572 :
2573 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
2574 : "DataField", metaptrs);
2575 0 : if(metabuf == NULL)
2576 : {
2577 0 : free(utlstr);
2578 0 : return(-1);
2579 : }
2580 :
2581 :
2582 : /* Search for field */
2583 0 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
2584 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
2585 :
2586 : /* If field found ... */
2587 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
2588 : {
2589 :
2590 : /* Set endptr at end of dimension definition entry */
2591 0 : metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
2592 :
2593 : /* Get DataType string */
2594 0 : statmeta = EHgetmetavalue(metaptrs, "DataType", utlstr);
2595 :
2596 : /* Convert to numbertype code */
2597 0 : if (statmeta == 0)
2598 0 : *numbertype = EHnumstr(utlstr);
2599 : else
2600 : {
2601 0 : status = -1;
2602 0 : HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
2603 0 : HEreport("\"DataType\" string not found in metadata.\n");
2604 : }
2605 :
2606 : /*
2607 : * Get DimList string and trim off leading and trailing parens
2608 : * "()"
2609 : */
2610 0 : statmeta = EHgetmetavalue(metaptrs, "DimList", utlstr);
2611 :
2612 0 : if (statmeta == 0)
2613 : {
2614 0 : memmove(utlstr, utlstr + 1, strlen(utlstr) - 2);
2615 0 : utlstr[strlen(utlstr) - 2] = 0;
2616 :
2617 : /* Parse trimmed DimList string and get rank */
2618 0 : ndims = EHparsestr(utlstr, ',', ptr, slen);
2619 0 : *rank = ndims;
2620 : }
2621 : else
2622 : {
2623 0 : status = -1;
2624 0 : HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
2625 0 : HEreport("\"DimList\" string not found in metadata.\n");
2626 : }
2627 :
2628 :
2629 0 : if (status == 0)
2630 : {
2631 0 : status = GDgridinfo(gridID, &xdim, &ydim, NULL, NULL);
2632 :
2633 0 : for (i = 0; i < ndims; i++)
2634 : {
2635 0 : memcpy(dimstr, ptr[i] + 1, slen[i] - 2);
2636 0 : dimstr[slen[i] - 2] = 0;
2637 :
2638 0 : if (strcmp(dimstr, "XDim") == 0)
2639 : {
2640 0 : dims[i] = xdim;
2641 : }
2642 0 : else if (strcmp(dimstr, "YDim") == 0)
2643 : {
2644 0 : dims[i] = ydim;
2645 : }
2646 : else
2647 : {
2648 0 : dims[i] = GDdiminfo(gridID, dimstr);
2649 : }
2650 :
2651 :
2652 0 : if (dimlist != NULL)
2653 : {
2654 0 : if (i == 0)
2655 : {
2656 0 : dimlist[0] = 0;
2657 : }
2658 :
2659 0 : if (i > 0)
2660 : {
2661 0 : strcat(dimlist, ",");
2662 : }
2663 0 : strcat(dimlist, dimstr);
2664 : }
2665 : }
2666 :
2667 :
2668 0 : if (dims[0] == 0)
2669 : {
2670 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
2671 : &sdid, &dum, &dum, &dum, dims,
2672 : &dum);
2673 : }
2674 : }
2675 : }
2676 :
2677 0 : free(metabuf);
2678 : }
2679 :
2680 0 : if (*rank == -1)
2681 : {
2682 0 : status = -1;
2683 :
2684 0 : HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
2685 0 : HEreport("Fieldname \"%s\" not found.\n", fieldname);
2686 : }
2687 0 : free(utlstr);
2688 0 : return (status);
2689 : }
2690 :
2691 :
2692 :
2693 :
2694 :
2695 :
2696 : /*----------------------------------------------------------------------------|
2697 : | BEGIN_PROLOG |
2698 : | |
2699 : | FUNCTION: GDdeffield |
2700 : | |
2701 : | DESCRIPTION: Defines a new data field within the grid. |
2702 : | |
2703 : | |
2704 : | Return Value Type Units Description |
2705 : | ============ ====== ========= ===================================== |
2706 : | status intn return status (0) SUCCEED, (-1) FAIL |
2707 : | |
2708 : | INPUTS: |
2709 : | gridID int32 grid structure ID |
2710 : | fieldname char fieldname |
2711 : | dimlist char Dimension list (comma-separated list) |
2712 : | numbertype int32 field type |
2713 : | merge int32 merge code |
2714 : | |
2715 : | |
2716 : | OUTPUTS: |
2717 : | None |
2718 : | |
2719 : | NOTES: |
2720 : | |
2721 : | |
2722 : | Date Programmer Description |
2723 : | ====== ============ ================================================= |
2724 : | Jun 96 Joel Gales Original Programmer |
2725 : | Aug 96 Joel Gales Check name for ODL compliance |
2726 : | Sep 96 Joel Gales Make string array "dimbuf" dynamic |
2727 : | Sep 96 Joel Gales Add support for Block SOM (MISR) |
2728 : | Jan 97 Joel Gales Add support for tiling |
2729 : | Feb 99 Abe Taaheri Changed strcpy to memmove to avoid overlapping |
2730 : | problem when copying strings |
2731 : | |
2732 : | END_PROLOG |
2733 : -----------------------------------------------------------------------------*/
2734 : intn
2735 0 : GDdeffield(int32 gridID, const char *fieldname, const char *dimlist,
2736 : int32 numbertype, int32 merge)
2737 :
2738 : {
2739 : intn i; /* Loop index */
2740 : intn status; /* routine return status variable */
2741 : intn found; /* utility found flag */
2742 0 : intn foundNT = 0;/* found number type flag */
2743 0 : intn foundAllDim = 1; /* found all dimensions flag */
2744 0 : intn first = 1; /* first entry flag */
2745 :
2746 : int32 fid; /* HDF-EOS file ID */
2747 : int32 vgid; /* Geo/Data field Vgroup ID */
2748 : int32 sdInterfaceID; /* HDF SDS interface ID */
2749 : int32 sdid; /* SDS object ID */
2750 : int32 dimid; /* SDS dimension ID */
2751 : int32 gdVgrpID; /* Grid root Vgroup ID */
2752 : int32 dims[8]; /* Dimension size array */
2753 : int32 dimsize; /* Dimension size */
2754 0 : int32 rank = 0; /* Field rank */
2755 : int32 slen[32]; /* String length array */
2756 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
2757 : int32 compcode; /* Compression code */
2758 : int32 tilecode; /* Tiling code */
2759 : int32 chunkFlag; /* Chunking (Tiling) flag */
2760 : int32 gID; /* GridID - offset */
2761 : int32 xdim; /* Grid X dimension */
2762 : int32 ydim; /* Grid Y dimension */
2763 : int32 projcode; /* Projection Code */
2764 :
2765 : float64 projparm[13]; /* Projection Parameters */
2766 :
2767 : char *dimbuf; /* Dimension buffer */
2768 : char *dimlist0; /* Auxiliary dimension list */
2769 : char *comma; /* Pointer to comma */
2770 : char *dimcheck; /* Dimension check buffer */
2771 : char utlbuf[512];/* Utility buffer */
2772 : char utlbuf2[256]; /* Utility buffer 1 */
2773 : char *ptr[32]; /* String pointer array */
2774 : char gridname[80]; /* Grid name */
2775 : char parmbuf[128]; /* Parameter string buffer */
2776 : char errbuf1[128]; /* Error buffer 1 */
2777 : char errbuf2[128]; /* Error buffer 2 */
2778 : static const char errmsg1[] = "Dimension: %d (size: %d) not divisible by ";
2779 : /* Tiling error message part 1 */
2780 : static const char errmsg2[] = "tile dimension (size: %d).\n";
2781 : /* Tiling error message part 2 */
2782 : char errmsg[128];/* Tiling error message */
2783 :
2784 : /* Valid number types */
2785 : static const uint16 good_number[10] = {
2786 : 3, 4, 5, 6, 20, 21, 22, 23, 24, 25
2787 : };
2788 :
2789 : comp_info c_info; /* Compression parameter structure */
2790 :
2791 : HDF_CHUNK_DEF chunkDef; /* Tiling structure */
2792 :
2793 0 : memset(&c_info, 0, sizeof(c_info));
2794 0 : memset(&chunkDef, 0, sizeof(chunkDef));
2795 :
2796 :
2797 : /* Setup error message strings */
2798 : /* --------------------------- */
2799 0 : strcpy(errbuf1, "GDXSDname array too small.\nPlease increase ");
2800 0 : strcat(errbuf1, "size of HDFE_NAMBUFSIZE in \"HdfEosDef.h\".\n");
2801 0 : strcpy(errbuf2, "GDXSDdims array too small.\nPlease increase ");
2802 0 : strcat(errbuf2, "size of HDFE_DIMBUFSIZE in \"HdfEosDef.h\".\n");
2803 :
2804 :
2805 : /* Build tiling dimension error message */
2806 : /* ------------------------------------ */
2807 0 : strcpy(errmsg, errmsg1);
2808 0 : strcat(errmsg, errmsg2);
2809 :
2810 : /*
2811 : * Check for proper grid ID and return HDF-EOS file ID, SDinterface ID,
2812 : * and grid root Vgroup ID
2813 : */
2814 0 : status = GDchkgdid(gridID, "GDdefinefield",
2815 : &fid, &sdInterfaceID, &gdVgrpID);
2816 :
2817 :
2818 0 : if (status == 0)
2819 : {
2820 : /* Remove offset from grid ID & get gridname */
2821 0 : gID = gridID % idOffset;
2822 0 : Vgetname(GDXGrid[gID].IDTable, gridname);
2823 :
2824 :
2825 : /* Allocate space for dimension buffer and auxiliary dimension list */
2826 : /* ---------------------------------------------------------------- */
2827 0 : dimbuf = (char *) calloc(strlen(dimlist) + 64, 1);
2828 0 : if(dimbuf == NULL)
2829 : {
2830 0 : HEpush(DFE_NOSPACE,"GDdeffield", __FILE__, __LINE__);
2831 0 : return(-1);
2832 : }
2833 0 : dimlist0 = (char *) calloc(strlen(dimlist) + 64, 1);
2834 0 : if(dimlist0 == NULL)
2835 : {
2836 0 : HEpush(DFE_NOSPACE,"GDdeffield", __FILE__, __LINE__);
2837 0 : free(dimbuf);
2838 0 : return(-1);
2839 : }
2840 :
2841 :
2842 : /* Get Grid and Projection info */
2843 : /* ---------------------------- */
2844 0 : status = GDgridinfo(gridID, &xdim, &ydim, NULL, NULL);
2845 0 : status = GDprojinfo(gridID, &projcode, NULL, NULL, projparm);
2846 :
2847 :
2848 : /* Setup Block Dimension if "Blocked" SOM projection */
2849 : /* ------------------------------------------------- */
2850 0 : if (projcode == GCTP_SOM && (int32) projparm[11] != 0)
2851 : {
2852 0 : dimsize = GDdiminfo(gridID, "SOMBlockDim");
2853 :
2854 : /* If "SOMBlockDim" not yet defined then do it */
2855 0 : if (dimsize == -1)
2856 : {
2857 0 : GDdefdim(gridID, "SOMBlockDim", (int32) projparm[11]);
2858 : }
2859 :
2860 : /* If not 1D field then prepend to dimension list */
2861 0 : if (strchr(dimlist, ',') != NULL)
2862 : {
2863 0 : strcpy(dimbuf, "SOMBlockDim,");
2864 0 : strcat(dimbuf, dimlist);
2865 : }
2866 : else
2867 : {
2868 0 : strcpy(dimbuf, dimlist);
2869 : }
2870 : }
2871 : else
2872 : {
2873 : /* If not "Blocked" SOM then just copy dim list to dim buffer */
2874 0 : strcpy(dimbuf, dimlist);
2875 : }
2876 :
2877 : /*
2878 : * Copy dimension buffer to auxiliary dimlist and append a comma to
2879 : * end of dimension list.
2880 : */
2881 0 : strcpy(dimlist0, dimbuf);
2882 0 : strcat(dimbuf, ",");
2883 :
2884 :
2885 : /* Find comma */
2886 : /* ---------- */
2887 0 : comma = strchr(dimbuf, ',');
2888 :
2889 :
2890 : /*
2891 : * Loop through entries in dimension list to make sure they are
2892 : * defined in grid
2893 : */
2894 0 : while (comma != NULL)
2895 : {
2896 : /* Copy dimension list entry to dimcheck */
2897 : /* ------------------------------------- */
2898 0 : dimcheck = (char *) calloc(comma - dimbuf + 1, 1);
2899 0 : if(dimcheck == NULL)
2900 : {
2901 0 : HEpush(DFE_NOSPACE,"GDdeffield", __FILE__, __LINE__);
2902 0 : free(dimbuf);
2903 0 : free(dimlist0);
2904 0 : return(-1);
2905 : }
2906 0 : memcpy(dimcheck, dimbuf, comma - dimbuf);
2907 :
2908 :
2909 : /* Get Dimension Size */
2910 : /* ------------------ */
2911 0 : if (strcmp(dimcheck, "XDim") == 0)
2912 : {
2913 : /* If "XDim" then use xdim value for grid definition */
2914 : /* ------------------------------------------------- */
2915 0 : dimsize = xdim;
2916 0 : found = 1;
2917 0 : dims[rank] = dimsize;
2918 0 : rank++;
2919 : }
2920 0 : else if (strcmp(dimcheck, "YDim") == 0)
2921 : {
2922 : /* If "YDim" then use ydim value for grid definition */
2923 : /* ------------------------------------------------- */
2924 0 : dimsize = ydim;
2925 0 : found = 1;
2926 0 : dims[rank] = dimsize;
2927 0 : rank++;
2928 : }
2929 : else
2930 : {
2931 : /* "Regular" Dimension */
2932 : /* ------------------- */
2933 0 : dimsize = GDdiminfo(gridID, dimcheck);
2934 0 : if (dimsize != -1)
2935 : {
2936 0 : found = 1;
2937 0 : dims[rank] = dimsize;
2938 0 : rank++;
2939 : }
2940 : else
2941 : {
2942 0 : found = 0;
2943 : }
2944 : }
2945 :
2946 :
2947 : /*
2948 : * If dimension list entry not found - set error return status,
2949 : * append name to utility buffer for error report
2950 : */
2951 0 : if (found == 0)
2952 : {
2953 0 : status = -1;
2954 0 : foundAllDim = 0;
2955 0 : if (first == 1)
2956 : {
2957 0 : strcpy(utlbuf, dimcheck);
2958 : }
2959 : else
2960 : {
2961 0 : strcat(utlbuf, ",");
2962 0 : strcat(utlbuf, dimcheck);
2963 : }
2964 0 : first = 0;
2965 : }
2966 :
2967 : /*
2968 : * Go to next dimension entry, find next comma, & free up
2969 : * dimcheck buffer
2970 : */
2971 0 : memmove(dimbuf, comma + 1, strlen(comma)-1);
2972 0 : dimbuf[strlen(comma)-1]= 0;
2973 0 : comma = strchr(dimbuf, ',');
2974 0 : free(dimcheck);
2975 : }
2976 0 : free(dimbuf);
2977 :
2978 : /* Check fieldname length */
2979 : /* ---------------------- */
2980 0 : if (status == 0)
2981 : {
2982 : /* if ((intn) strlen(fieldname) > MAX_NC_NAME - 7)
2983 : ** this was changed because HDF4.1r3 made a change in the
2984 : ** hlimits.h file. We have notified NCSA and asked to have
2985 : ** it made the same as in previous versions of HDF
2986 : ** see ncr 26314. DaW Apr 2000
2987 : */
2988 0 : if((intn) strlen(fieldname) > (256 - 7))
2989 : {
2990 0 : status = -1;
2991 0 : HEpush(DFE_GENAPP, "GDdefinefield", __FILE__, __LINE__);
2992 0 : HEreport("Fieldname \"%s\" too long.\n", fieldname);
2993 : }
2994 : }
2995 :
2996 : /* Check for valid numbertype */
2997 : /* -------------------------- */
2998 0 : if (status == 0)
2999 : {
3000 0 : for (i = 0; i < 10; i++)
3001 : {
3002 0 : if (numbertype == good_number[i])
3003 : {
3004 0 : foundNT = 1;
3005 0 : break;
3006 : }
3007 : }
3008 :
3009 0 : if (foundNT == 0)
3010 : {
3011 0 : HEpush(DFE_BADNUMTYPE, "GDdeffield", __FILE__, __LINE__);
3012 0 : HEreport("Invalid number type: %d (%s).\n",
3013 : numbertype, fieldname);
3014 0 : status = -1;
3015 : }
3016 : }
3017 :
3018 :
3019 : /* Define Field */
3020 : /* ------------ */
3021 0 : if (status == 0)
3022 : {
3023 : /* Get Field Vgroup id, compression code, & tiling code */
3024 : /* -------------------------------------------------- */
3025 0 : vgid = GDXGrid[gID].VIDTable[0];
3026 0 : compcode = GDXGrid[gID].compcode;
3027 0 : tilecode = GDXGrid[gID].tilecode;
3028 :
3029 :
3030 : /* SDS Interface (Multi-dim fields) */
3031 : /* -------------------------------- */
3032 :
3033 :
3034 : /*
3035 : * If rank is less than or equal to 3 (and greater than 1) and
3036 : * AUTOMERGE is set and the first dimension is not appendable and
3037 : * the compression code is set to none then ...
3038 : */
3039 0 : if (rank >= 2 && rank <= 3 && merge == HDFE_AUTOMERGE &&
3040 0 : dims[0] != 0 && compcode == HDFE_COMP_NONE &&
3041 : tilecode == HDFE_NOTILE)
3042 : {
3043 :
3044 : /* Find first empty slot in external combination array */
3045 : /* --------------------------------------------------- */
3046 0 : i = 0;
3047 0 : while (GDXSDcomb[5 * i] != 0)
3048 : {
3049 0 : i++;
3050 : }
3051 :
3052 : /*
3053 : * Store dimensions, grid root Vgroup ID, and number type in
3054 : * external combination array "GDXSDcomb"
3055 : */
3056 0 : if (rank == 2)
3057 : {
3058 : /* If 2-dim field then set lowest dimension to 1 */
3059 : /* --------------------------------------------- */
3060 0 : GDXSDcomb[5 * i] = 1;
3061 0 : GDXSDcomb[5 * i + 1] = dims[0];
3062 0 : GDXSDcomb[5 * i + 2] = dims[1];
3063 : }
3064 : else
3065 : {
3066 0 : GDXSDcomb[5 * i] = dims[0];
3067 0 : GDXSDcomb[5 * i + 1] = dims[1];
3068 0 : GDXSDcomb[5 * i + 2] = dims[2];
3069 : }
3070 :
3071 0 : GDXSDcomb[5 * i + 3] = gdVgrpID;
3072 0 : GDXSDcomb[5 * i + 4] = numbertype;
3073 :
3074 :
3075 : /* Concatenate fieldname with combined name string */
3076 : /* ----------------------------------------------- */
3077 0 : if ((intn) strlen(GDXSDname) +
3078 0 : (intn) strlen(fieldname) + 2 < HDFE_NAMBUFSIZE)
3079 : {
3080 0 : strcat(GDXSDname, fieldname);
3081 0 : strcat(GDXSDname, ",");
3082 : }
3083 : else
3084 : {
3085 : /* GDXSDname array too small! */
3086 : /* -------------------------- */
3087 0 : HEpush(DFE_GENAPP, "GDdefinefield",
3088 : __FILE__, __LINE__);
3089 0 : HEreport(errbuf1);
3090 0 : status = -1;
3091 0 : free(dimlist0);
3092 0 : return (status);
3093 : }
3094 :
3095 :
3096 : /*
3097 : * If 2-dim field then set lowest dimension (in 3-dim array)
3098 : * to "ONE"
3099 : */
3100 0 : if (rank == 2)
3101 : {
3102 0 : if ((intn) strlen(GDXSDdims) + 5 < HDFE_DIMBUFSIZE)
3103 : {
3104 0 : strcat(GDXSDdims, "ONE,");
3105 : }
3106 : else
3107 : {
3108 : /* GDXSDdims array too small! */
3109 : /* -------------------------- */
3110 0 : HEpush(DFE_GENAPP, "GDdefinefield",
3111 : __FILE__, __LINE__);
3112 0 : HEreport(errbuf2);
3113 0 : status = -1;
3114 0 : free(dimlist0);
3115 0 : return (status);
3116 : }
3117 : }
3118 :
3119 :
3120 : /*
3121 : * Concatanate field dimlist to merged dimlist and separate
3122 : * fields with semi-colon.
3123 : */
3124 0 : if ((intn) strlen(GDXSDdims) +
3125 0 : (intn) strlen(dimlist0) + 2 < HDFE_DIMBUFSIZE)
3126 : {
3127 0 : strcat(GDXSDdims, dimlist0);
3128 0 : strcat(GDXSDdims, ";");
3129 : }
3130 : else
3131 : {
3132 : /* GDXSDdims array too small! */
3133 : /* -------------------------- */
3134 0 : HEpush(DFE_GENAPP, "GDdefinefield",
3135 : __FILE__, __LINE__);
3136 0 : HEreport(errbuf2);
3137 0 : status = -1;
3138 0 : free(dimlist0);
3139 0 : return (status);
3140 : }
3141 :
3142 : } /* End Multi-Dim Merge Section */
3143 : else
3144 : {
3145 :
3146 : /* Multi-Dim No Merge Section */
3147 : /* ========================== */
3148 :
3149 :
3150 : /* Check that field dims are divisible by tile dims */
3151 : /* ------------------------------------------------ */
3152 0 : if (tilecode == HDFE_TILE)
3153 : {
3154 0 : for (i = 0; i < GDXGrid[gID].tilerank; i++)
3155 : {
3156 0 : if ((dims[i] % GDXGrid[gID].tiledims[i]) != 0)
3157 : {
3158 0 : HEpush(DFE_GENAPP, "GDdeffield",
3159 : __FILE__, __LINE__);
3160 0 : HEreport(errmsg,
3161 : i, dims[i], GDXGrid[gID].tiledims[0]);
3162 0 : status = -1;
3163 : }
3164 : }
3165 :
3166 0 : if (status == -1)
3167 : {
3168 0 : free(dimlist0);
3169 0 : return (status);
3170 : }
3171 : }
3172 :
3173 :
3174 : /* Create SDS dataset */
3175 : /* ------------------ */
3176 0 : sdid = SDcreate(sdInterfaceID, fieldname,
3177 : numbertype, rank, dims);
3178 :
3179 :
3180 : /* Store Dimension Names in SDS */
3181 : /* ---------------------------- */
3182 0 : rank = EHparsestr(dimlist0, ',', ptr, slen);
3183 0 : for (i = 0; i < rank; i++)
3184 : {
3185 : /* Dimension name = Swathname:Dimname */
3186 : /* ---------------------------------- */
3187 0 : memcpy(utlbuf, ptr[i], slen[i]);
3188 0 : utlbuf[slen[i]] = 0;
3189 0 : strcat(utlbuf, ":");
3190 0 : strcat(utlbuf, gridname);
3191 :
3192 0 : dimid = SDgetdimid(sdid, i);
3193 0 : SDsetdimname(dimid, utlbuf);
3194 : }
3195 :
3196 :
3197 : /* Setup Compression */
3198 : /* ----------------- */
3199 0 : if (compcode == HDFE_COMP_NBIT)
3200 : {
3201 0 : c_info.nbit.nt = numbertype;
3202 0 : c_info.nbit.sign_ext = GDXGrid[gID].compparm[0];
3203 0 : c_info.nbit.fill_one = GDXGrid[gID].compparm[1];
3204 0 : c_info.nbit.start_bit = GDXGrid[gID].compparm[2];
3205 0 : c_info.nbit.bit_len = GDXGrid[gID].compparm[3];
3206 : }
3207 0 : else if (compcode == HDFE_COMP_SKPHUFF)
3208 : {
3209 0 : c_info.skphuff.skp_size = (intn) DFKNTsize(numbertype);
3210 : }
3211 0 : else if (compcode == HDFE_COMP_DEFLATE)
3212 : {
3213 0 : c_info.deflate.level = GDXGrid[gID].compparm[0];
3214 : }
3215 :
3216 :
3217 : /* If field is compressed w/o tiling then call SDsetcompress */
3218 : /* --------------------------------------------------------- */
3219 0 : if (compcode != HDFE_COMP_NONE && tilecode == HDFE_NOTILE)
3220 : {
3221 0 : /* status = */ SDsetcompress(sdid, (comp_coder_t) compcode, &c_info);
3222 : }
3223 :
3224 :
3225 : /* Setup Tiling */
3226 : /* ------------ */
3227 0 : if (tilecode == HDFE_TILE)
3228 : {
3229 : /* Tiling without Compression */
3230 : /* -------------------------- */
3231 0 : if (compcode == HDFE_COMP_NONE)
3232 : {
3233 :
3234 : /* Setup chunk lengths */
3235 : /* ------------------- */
3236 0 : for (i = 0; i < GDXGrid[gID].tilerank; i++)
3237 : {
3238 0 : chunkDef.chunk_lengths[i] =
3239 0 : GDXGrid[gID].tiledims[i];
3240 : }
3241 :
3242 0 : chunkFlag = HDF_CHUNK;
3243 : }
3244 :
3245 : /* Tiling with Compression */
3246 : /* ----------------------- */
3247 : else
3248 : {
3249 : /* Setup chunk lengths */
3250 : /* ------------------- */
3251 0 : for (i = 0; i < GDXGrid[gID].tilerank; i++)
3252 : {
3253 0 : chunkDef.comp.chunk_lengths[i] =
3254 0 : GDXGrid[gID].tiledims[i];
3255 : }
3256 :
3257 :
3258 : /* Setup chunk flag & chunk compression type */
3259 : /* ----------------------------------------- */
3260 0 : chunkFlag = HDF_CHUNK | HDF_COMP;
3261 0 : chunkDef.comp.comp_type = compcode;
3262 :
3263 :
3264 : /* Setup chunk compression parameters */
3265 : /* ---------------------------------- */
3266 0 : if (compcode == HDFE_COMP_SKPHUFF)
3267 : {
3268 0 : chunkDef.comp.cinfo.skphuff.skp_size =
3269 0 : c_info.skphuff.skp_size;
3270 : }
3271 0 : else if (compcode == HDFE_COMP_DEFLATE)
3272 : {
3273 0 : chunkDef.comp.cinfo.deflate.level =
3274 0 : c_info.deflate.level;
3275 : }
3276 : }
3277 :
3278 : /* Call SDsetchunk routine */
3279 : /* ----------------------- */
3280 0 : /* status = */ SDsetchunk(sdid, chunkDef, chunkFlag);
3281 : }
3282 :
3283 :
3284 : /* Attach to Vgroup */
3285 : /* ---------------- */
3286 0 : Vaddtagref(vgid, DFTAG_NDG, SDidtoref(sdid));
3287 :
3288 :
3289 : /* Store SDS dataset IDs */
3290 : /* --------------------- */
3291 :
3292 : /* Allocate space for the SDS ID array */
3293 : /* ----------------------------------- */
3294 0 : if (GDXGrid[gID].nSDS > 0)
3295 : {
3296 : /* Array already exists therefore reallocate */
3297 : /* ----------------------------------------- */
3298 0 : GDXGrid[gID].sdsID = (int32 *)
3299 0 : realloc((void *) GDXGrid[gID].sdsID,
3300 0 : (GDXGrid[gID].nSDS + 1) * 4);
3301 0 : if(GDXGrid[gID].sdsID == NULL)
3302 : {
3303 0 : HEpush(DFE_NOSPACE,"GDdeffield", __FILE__, __LINE__);
3304 0 : free(dimlist0);
3305 0 : return(-1);
3306 : }
3307 : }
3308 : else
3309 : {
3310 : /* Array does not exist */
3311 : /* -------------------- */
3312 0 : GDXGrid[gID].sdsID = (int32 *) calloc(1, 4);
3313 0 : if(GDXGrid[gID].sdsID == NULL)
3314 : {
3315 0 : HEpush(DFE_NOSPACE,"GDdeffield", __FILE__, __LINE__);
3316 0 : free(dimlist0);
3317 0 : return(-1);
3318 : }
3319 : }
3320 :
3321 : /* Store SDS ID in array & increment count */
3322 : /* --------------------------------------- */
3323 0 : GDXGrid[gID].sdsID[GDXGrid[gID].nSDS] = sdid;
3324 0 : GDXGrid[gID].nSDS++;
3325 :
3326 : }
3327 :
3328 :
3329 : /* Setup metadata string */
3330 : /* --------------------- */
3331 0 : snprintf(utlbuf, sizeof(utlbuf), "%s%s%s", fieldname, ":", dimlist0);
3332 :
3333 :
3334 : /* Setup compression metadata */
3335 : /* -------------------------- */
3336 0 : if (compcode != HDFE_COMP_NONE)
3337 : {
3338 0 : snprintf(utlbuf2, sizeof(utlbuf2),
3339 : "%s%s",
3340 : ":\n\t\t\t\tCompressionType=", HDFcomp[compcode]);
3341 :
3342 0 : switch (compcode)
3343 : {
3344 0 : case HDFE_COMP_NBIT:
3345 :
3346 0 : snprintf(parmbuf, sizeof(parmbuf),
3347 : "%s%d,%d,%d,%d%s",
3348 : "\n\t\t\t\tCompressionParams=(",
3349 : GDXGrid[gID].compparm[0],
3350 : GDXGrid[gID].compparm[1],
3351 : GDXGrid[gID].compparm[2],
3352 : GDXGrid[gID].compparm[3], ")");
3353 0 : strcat(utlbuf2, parmbuf);
3354 0 : break;
3355 :
3356 :
3357 0 : case HDFE_COMP_DEFLATE:
3358 :
3359 0 : snprintf(parmbuf, sizeof(parmbuf),
3360 : "%s%d",
3361 : "\n\t\t\t\tDeflateLevel=",
3362 : GDXGrid[gID].compparm[0]);
3363 0 : strcat(utlbuf2, parmbuf);
3364 0 : break;
3365 : }
3366 0 : strcat(utlbuf, utlbuf2);
3367 : }
3368 :
3369 :
3370 :
3371 :
3372 : /* Setup tiling metadata */
3373 : /* --------------------- */
3374 0 : if (tilecode == HDFE_TILE)
3375 : {
3376 0 : if (compcode == HDFE_COMP_NONE)
3377 : {
3378 0 : snprintf(utlbuf2, sizeof(utlbuf2), "%s%d",
3379 : ":\n\t\t\t\tTilingDimensions=(",
3380 0 : (int)GDXGrid[gID].tiledims[0]);
3381 : }
3382 : else
3383 : {
3384 0 : snprintf(utlbuf2, sizeof(utlbuf2), "%s%d",
3385 : "\n\t\t\t\tTilingDimensions=(",
3386 0 : (int)GDXGrid[gID].tiledims[0]);
3387 : }
3388 :
3389 0 : for (i = 1; i < GDXGrid[gID].tilerank; i++)
3390 : {
3391 0 : snprintf(parmbuf, sizeof(parmbuf), ",%d", (int)GDXGrid[gID].tiledims[i]);
3392 0 : strcat(utlbuf2, parmbuf);
3393 : }
3394 0 : strcat(utlbuf2, ")");
3395 0 : strcat(utlbuf, utlbuf2);
3396 : }
3397 :
3398 :
3399 : /* Insert field metadata within File Structural Metadata */
3400 : /* ----------------------------------------------------- */
3401 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 4L,
3402 : utlbuf, &numbertype);
3403 :
3404 : }
3405 0 : free(dimlist0);
3406 :
3407 : }
3408 :
3409 : /* If all dimensions not found then report error */
3410 : /* --------------------------------------------- */
3411 0 : if (foundAllDim == 0)
3412 : {
3413 0 : HEpush(DFE_GENAPP, "GDdeffield", __FILE__, __LINE__);
3414 0 : HEreport("Dimension(s): \"%s\" not found (%s).\n",
3415 : utlbuf, fieldname);
3416 0 : status = -1;
3417 : }
3418 :
3419 0 : return (status);
3420 : }
3421 :
3422 :
3423 :
3424 :
3425 : /*----------------------------------------------------------------------------|
3426 : | BEGIN_PROLOG |
3427 : | |
3428 : | FUNCTION: GDwritefieldmeta |
3429 : | |
3430 : | DESCRIPTION: Writes field meta data for an existing grid field not |
3431 : | defined within the grid API routine "GDdeffield". |
3432 : | |
3433 : | Return Value Type Units Description |
3434 : | ============ ====== ========= ===================================== |
3435 : | status intn return status (0) SUCCEED, (-1) FAIL |
3436 : | |
3437 : | INPUTS: |
3438 : | gridID int32 grid structure ID |
3439 : | fieldname char fieldname |
3440 : | dimlist char Dimension list (comma-separated list) |
3441 : | numbertype int32 field type |
3442 : | |
3443 : | |
3444 : | OUTPUTS: |
3445 : | None |
3446 : | |
3447 : | NOTES: |
3448 : | |
3449 : | |
3450 : | Date Programmer Description |
3451 : | ====== ============ ================================================= |
3452 : | Jun 96 Joel Gales Original Programmer |
3453 : | |
3454 : | END_PROLOG |
3455 : -----------------------------------------------------------------------------*/
3456 : intn
3457 0 : GDwritefieldmeta(int32 gridID, const char *fieldname, const char *dimlist,
3458 : int32 numbertype)
3459 : {
3460 0 : intn status = 0; /* routine return status variable */
3461 :
3462 : int32 sdInterfaceID; /* HDF SDS interface ID */
3463 : int32 dum; /* dummy variable */
3464 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
3465 :
3466 : char utlbuf[256];/* Utility buffer */
3467 : char gridname[80]; /* Grid name */
3468 :
3469 :
3470 0 : status = GDchkgdid(gridID, "GDwritefieldmeta", &dum, &sdInterfaceID,
3471 : &dum);
3472 :
3473 0 : if (status == 0)
3474 : {
3475 0 : snprintf(utlbuf, sizeof(utlbuf), "%s%s%s", fieldname, ":", dimlist);
3476 :
3477 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
3478 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g", 4L,
3479 : utlbuf, &numbertype);
3480 : }
3481 0 : return (status);
3482 : }
3483 :
3484 :
3485 :
3486 :
3487 : /*----------------------------------------------------------------------------|
3488 : | BEGIN_PROLOG |
3489 : | |
3490 : | FUNCTION: GDSDfldsrch |
3491 : | |
3492 : | DESCRIPTION: Retrieves information from SDS fields |
3493 : | |
3494 : | |
3495 : | Return Value Type Units Description |
3496 : | ============ ====== ========= ===================================== |
3497 : | status intn return status (0) SUCCEED, (-1) FAIL |
3498 : | |
3499 : | INPUTS: |
3500 : | gridID int32 grid structure ID |
3501 : | sdInterfaceID int32 SD interface ID |
3502 : | fieldname char field name |
3503 : | |
3504 : | |
3505 : | OUTPUTS: |
3506 : | sdid int32 SD element ID |
3507 : | rankSDS int32 Rank of SDS |
3508 : | rankFld int32 True rank of field (merging) |
3509 : | offset int32 Offset of field within merged field |
3510 : | dims int32 Dimensions of field |
3511 : | solo int32 Solo field flag |
3512 : | |
3513 : | NOTES: |
3514 : | |
3515 : | |
3516 : | Date Programmer Description |
3517 : | ====== ============ ================================================= |
3518 : | Jun 96 Joel Gales Original Programmer |
3519 : | Aug 96 Joel Gales Make metadata ODL compliant |
3520 : | |
3521 : | END_PROLOG |
3522 : -----------------------------------------------------------------------------*/
3523 : static intn
3524 0 : GDSDfldsrch(int32 gridID, int32 sdInterfaceID, const char *fieldname,
3525 : int32 * sdid, int32 * rankSDS, int32 * rankFld, int32 * offset,
3526 : int32 dims[], int32 * solo)
3527 : {
3528 : intn i; /* Loop index */
3529 0 : intn status = -1;/* routine return status variable */
3530 :
3531 : int32 gID; /* GridID - offset */
3532 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
3533 : int32 dum; /* Dummy variable */
3534 : int32 dums[128]; /* Dummy array */
3535 : int32 attrIndex; /* Attribute l_index */
3536 :
3537 : char name[2048]; /* Merged-Field Names */
3538 : char gridname[80]; /* Grid Name */
3539 : char *utlstr;/* Utility string */
3540 : char *metabuf; /* Pointer to structural metadata (SM) */
3541 : char *metaptrs[2];/* Pointers to begin and end of SM section */
3542 : #ifdef broken_logic
3543 : char *oldmetaptr; /* Pointer within SM section */
3544 : char *metaptr; /* Pointer within SM section */
3545 : #endif
3546 :
3547 : /* Allocate space for utility string */
3548 : /* --------------------------------- */
3549 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
3550 0 : if(utlstr == NULL)
3551 : {
3552 0 : HEpush(DFE_NOSPACE,"GDSDfldsrch", __FILE__, __LINE__);
3553 0 : return(-1);
3554 : }
3555 : /* Set solo flag to 0 (no) */
3556 : /* ----------------------- */
3557 0 : *solo = 0;
3558 :
3559 :
3560 : /* Compute "reduced" grid ID */
3561 : /* ------------------------- */
3562 0 : gID = gridID % idOffset;
3563 :
3564 :
3565 : /* Loop through all SDSs in grid */
3566 : /* ----------------------------- */
3567 0 : for (i = 0; i < GDXGrid[gID].nSDS; i++)
3568 : {
3569 : /* If active SDS ... */
3570 : /* ----------------- */
3571 0 : if (GDXGrid[gID].sdsID[i] != 0)
3572 : {
3573 : /* Get SDS ID, name, rankSDS, and dimensions */
3574 : /* ----------------------------------------- */
3575 0 : *sdid = GDXGrid[gID].sdsID[i];
3576 0 : SDgetinfo(*sdid, name, rankSDS, dims, &dum, &dum);
3577 0 : *rankFld = *rankSDS;
3578 :
3579 :
3580 : /* If merged field ... */
3581 : /* ------------------- */
3582 0 : if (strstr(name, "MRGFLD_") == &name[0])
3583 : {
3584 : /* Get grid name */
3585 : /* ------------- */
3586 0 : Vgetname(GDXGrid[gID].IDTable, gridname);
3587 :
3588 :
3589 : /* Get pointers to "MergedFields" section within SM */
3590 : /* ------------------------------------------------ */
3591 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
3592 : "MergedFields", metaptrs);
3593 0 : if(metabuf == NULL)
3594 : {
3595 0 : free(utlstr);
3596 0 : return(-1);
3597 : }
3598 :
3599 : #ifdef broken_logic
3600 : /* Initialize metaptr to beg. of section */
3601 : /* ------------------------------------- */
3602 : metaptr = metaptrs[0];
3603 :
3604 :
3605 : /* Store metaptr in order to recover */
3606 : /* --------------------------------- */
3607 : oldmetaptr = metaptr;
3608 :
3609 :
3610 : /* Search for Merged field name */
3611 : /* ---------------------------- */
3612 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "MergedFieldName=\"",
3613 : name, "\"\n");
3614 : metaptr = strstr(metaptr, utlstr);
3615 :
3616 :
3617 : /* If not found check for old metadata */
3618 : /* ----------------------------------- */
3619 : if (metaptr == NULL)
3620 : {
3621 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "OBJECT=\"", name, "\"\n");
3622 : metaptr = strstr(oldmetaptr, utlstr);
3623 : }
3624 : #endif
3625 :
3626 : /* Get field list and strip off leading and trailing quotes */
3627 : /* -------------------------------------------------------- */
3628 0 : EHgetmetavalue(metaptrs, "FieldList", name);
3629 0 : memmove(name, name + 1, strlen(name) - 2);
3630 0 : name[strlen(name) - 2] = 0;
3631 :
3632 :
3633 : /* Search for desired field within merged field list */
3634 : /* ------------------------------------------------- */
3635 0 : snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"");
3636 0 : dum = EHstrwithin(utlstr, name, ',');
3637 :
3638 0 : free(metabuf);
3639 : }
3640 : else
3641 : {
3642 : /* If solo (unmerged) check if SDS name matches fieldname */
3643 : /* ------------------------------------------------------ */
3644 0 : dum = EHstrwithin(fieldname, name, ',');
3645 0 : if (dum != -1)
3646 : {
3647 0 : *solo = 1;
3648 0 : *offset = 0;
3649 : }
3650 : }
3651 :
3652 :
3653 :
3654 : /* If field found ... */
3655 : /* ------------------ */
3656 0 : if (dum != -1)
3657 : {
3658 0 : status = 0;
3659 :
3660 : /* If merged field ... */
3661 : /* ------------------- */
3662 0 : if (*solo == 0)
3663 : {
3664 : /* Get "Field Offsets" SDS attribute l_index */
3665 : /* --------------------------------------- */
3666 0 : attrIndex = SDfindattr(*sdid, "Field Offsets");
3667 :
3668 : /*
3669 : * If attribute exists then get offset of desired field
3670 : * within merged field
3671 : */
3672 0 : if (attrIndex != -1)
3673 : {
3674 0 : SDreadattr(*sdid, attrIndex, (VOIDP) dums);
3675 0 : *offset = dums[dum];
3676 : }
3677 :
3678 :
3679 : /* Get "Field Dims" SDS attribute l_index */
3680 : /* ------------------------------------ */
3681 0 : attrIndex = SDfindattr(*sdid, "Field Dims");
3682 :
3683 : /*
3684 : * If attribute exists then get 0th dimension of desired
3685 : * field within merged field
3686 : */
3687 0 : if (attrIndex != -1)
3688 : {
3689 0 : SDreadattr(*sdid, attrIndex, (VOIDP) dums);
3690 0 : dims[0] = dums[dum];
3691 :
3692 : /* If this dimension = 1 then field is really 2 dim */
3693 : /* ------------------------------------------------ */
3694 0 : if (dums[dum] == 1)
3695 : {
3696 0 : *rankFld = 2;
3697 : }
3698 : }
3699 : }
3700 :
3701 :
3702 : /* Break out of SDS loop */
3703 : /* --------------------- */
3704 0 : break;
3705 : } /* End of found field section */
3706 : }
3707 : else
3708 : {
3709 : /* First non-active SDS signifies no more, break out of SDS loop */
3710 : /* ------------------------------------------------------------- */
3711 0 : break;
3712 : }
3713 : }
3714 0 : free(utlstr);
3715 0 : return (status);
3716 : }
3717 :
3718 :
3719 :
3720 :
3721 : /*----------------------------------------------------------------------------|
3722 : | BEGIN_PROLOG |
3723 : | |
3724 : | FUNCTION: GDwrrdfield |
3725 : | |
3726 : | DESCRIPTION: Writes/Reads fields |
3727 : | |
3728 : | |
3729 : | Return Value Type Units Description |
3730 : | ============ ====== ========= ===================================== |
3731 : | status intn return status (0) SUCCEED, (-1) FAIL |
3732 : | |
3733 : | INPUTS: |
3734 : | gridID int32 grid structure ID |
3735 : | fieldname char fieldname |
3736 : | code char Write/Read code (w/r) |
3737 : | start int32 start array |
3738 : | stride int32 stride array |
3739 : | edge int32 edge array |
3740 : | datbuf void data buffer for read |
3741 : | |
3742 : | |
3743 : | OUTPUTS: |
3744 : | datbuf void data buffer for write |
3745 : | |
3746 : | |
3747 : | NOTES: |
3748 : | |
3749 : | |
3750 : | Date Programmer Description |
3751 : | ====== ============ ================================================= |
3752 : | Jun 96 Joel Gales Original Programmer |
3753 : | Feb 97 Joel Gales Stride = 1 HDF compression workaround |
3754 : | |
3755 : | END_PROLOG |
3756 : -----------------------------------------------------------------------------*/
3757 : static intn
3758 0 : GDwrrdfield(int32 gridID, const char *fieldname, const char *code,
3759 : int32 start[], int32 stride[], int32 edge[], VOIDP datbuf)
3760 :
3761 : {
3762 : intn i; /* Loop index */
3763 0 : intn status = 0; /* routine return status variable */
3764 :
3765 : int32 fid; /* HDF-EOS file ID */
3766 : int32 sdInterfaceID; /* HDF SDS interface ID */
3767 : int32 sdid; /* SDS ID */
3768 : int32 dum; /* Dummy variable */
3769 : int32 rankSDS; /* Rank of SDS */
3770 : int32 rankFld; /* Rank of field */
3771 :
3772 : int32 offset[8]; /* I/O offset (start) */
3773 : int32 incr[8]; /* I/O increment (stride) */
3774 : int32 count[8]; /* I/O count (edge) */
3775 : int32 dims[8]; /* Field/SDS dimensions */
3776 : int32 mrgOffset; /* Merged field offset */
3777 : int32 strideOne; /* Strides = 1 flag */
3778 :
3779 :
3780 : /* Check for valid grid ID */
3781 : /* ----------------------- */
3782 0 : status = GDchkgdid(gridID, "GDwrrdfield", &fid, &sdInterfaceID, &dum);
3783 :
3784 :
3785 0 : if (status == 0)
3786 : {
3787 : /* Check that field exists */
3788 : /* ----------------------- */
3789 0 : status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
3790 :
3791 :
3792 0 : if (status != 0)
3793 : {
3794 0 : HEpush(DFE_GENAPP, "GDwrrdfield", __FILE__, __LINE__);
3795 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
3796 0 : status = -1;
3797 :
3798 : }
3799 :
3800 :
3801 0 : if (status == 0)
3802 : {
3803 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
3804 : &rankSDS, &rankFld, &mrgOffset, dims, &dum);
3805 :
3806 :
3807 : /* Set I/O offset Section */
3808 : /* ---------------------- */
3809 :
3810 : /*
3811 : * If start == NULL (default) set I/O offset of 0th field to
3812 : * offset within merged field (if any) and the rest to 0
3813 : */
3814 0 : if (start == NULL)
3815 : {
3816 0 : for (i = 0; i < rankSDS; i++)
3817 : {
3818 0 : offset[i] = 0;
3819 : }
3820 0 : offset[0] = mrgOffset;
3821 : }
3822 : else
3823 : {
3824 : /*
3825 : * ... otherwise set I/O offset to user values, adjusting the
3826 : * 0th field with the merged field offset (if any)
3827 : */
3828 0 : if (rankFld == rankSDS)
3829 : {
3830 0 : for (i = 0; i < rankSDS; i++)
3831 : {
3832 0 : offset[i] = start[i];
3833 : }
3834 0 : offset[0] += mrgOffset;
3835 : }
3836 : else
3837 : {
3838 : /*
3839 : * If field really 2-dim merged in 3-dim field then set
3840 : * 0th field offset to merge offset and then next two to
3841 : * the user values
3842 : */
3843 0 : for (i = 0; i < rankFld; i++)
3844 : {
3845 0 : offset[i + 1] = start[i];
3846 : }
3847 0 : offset[0] = mrgOffset;
3848 : }
3849 : }
3850 :
3851 :
3852 :
3853 : /* Set I/O stride Section */
3854 : /* ---------------------- */
3855 :
3856 : /*
3857 : * If stride == NULL (default) set I/O stride to 1
3858 : */
3859 0 : if (stride == NULL)
3860 : {
3861 0 : for (i = 0; i < rankSDS; i++)
3862 : {
3863 0 : incr[i] = 1;
3864 : }
3865 : }
3866 : else
3867 : {
3868 : /*
3869 : * ... otherwise set I/O stride to user values
3870 : */
3871 0 : if (rankFld == rankSDS)
3872 : {
3873 0 : for (i = 0; i < rankSDS; i++)
3874 : {
3875 0 : incr[i] = stride[i];
3876 : }
3877 : }
3878 : else
3879 : {
3880 : /*
3881 : * If field really 2-dim merged in 3-dim field then set
3882 : * 0th field stride to 1 and then next two to the user
3883 : * values.
3884 : */
3885 0 : for (i = 0; i < rankFld; i++)
3886 : {
3887 0 : incr[i + 1] = stride[i];
3888 : }
3889 0 : incr[0] = 1;
3890 : }
3891 : }
3892 :
3893 :
3894 :
3895 : /* Set I/O count Section */
3896 : /* --------------------- */
3897 :
3898 : /*
3899 : * If edge == NULL (default) set I/O count to number of remaining
3900 : * entries (dims - start) / increment. Note that 0th field
3901 : * offset corrected for merged field offset (if any).
3902 : */
3903 0 : if (edge == NULL)
3904 : {
3905 0 : for (i = 1; i < rankSDS; i++)
3906 : {
3907 0 : count[i] = (dims[i] - offset[i]) / incr[i];
3908 : }
3909 0 : count[0] = (dims[0] - (offset[0] - mrgOffset)) / incr[0];
3910 : }
3911 : else
3912 : {
3913 : /*
3914 : * ... otherwise set I/O count to user values
3915 : */
3916 0 : if (rankFld == rankSDS)
3917 : {
3918 0 : for (i = 0; i < rankSDS; i++)
3919 : {
3920 0 : count[i] = edge[i];
3921 : }
3922 : }
3923 : else
3924 : {
3925 : /*
3926 : * If field really 2-dim merged in 3-dim field then set
3927 : * 0th field count to 1 and then next two to the user
3928 : * values.
3929 : */
3930 0 : for (i = 0; i < rankFld; i++)
3931 : {
3932 0 : count[i + 1] = edge[i];
3933 : }
3934 0 : count[0] = 1;
3935 : }
3936 : }
3937 :
3938 :
3939 : /* Perform I/O with relevant HDF I/O routine */
3940 : /* ----------------------------------------- */
3941 0 : if (strcmp(code, "w") == 0)
3942 : {
3943 : /* Set strideOne to true (1) */
3944 : /* ------------------------- */
3945 0 : strideOne = 1;
3946 :
3947 :
3948 : /* If incr[i] != 1 set strideOne to false (0) */
3949 : /* ------------------------------------------ */
3950 0 : for (i = 0; i < rankSDS; i++)
3951 : {
3952 0 : if (incr[i] != 1)
3953 : {
3954 0 : strideOne = 0;
3955 0 : break;
3956 : }
3957 : }
3958 :
3959 :
3960 : /*
3961 : * If strideOne is true use NULL parameter for stride. This
3962 : * is a work-around to HDF compression problem
3963 : */
3964 0 : if (strideOne == 1)
3965 : {
3966 0 : status = SDwritedata(sdid, offset, NULL, count,
3967 : (VOIDP) datbuf);
3968 : }
3969 : else
3970 : {
3971 0 : status = SDwritedata(sdid, offset, incr, count,
3972 : (VOIDP) datbuf);
3973 : }
3974 : }
3975 : else
3976 : {
3977 0 : status = SDreaddata(sdid, offset, incr, count,
3978 : (VOIDP) datbuf);
3979 : }
3980 : }
3981 : }
3982 :
3983 0 : return (status);
3984 : }
3985 :
3986 :
3987 : /*----------------------------------------------------------------------------|
3988 : | BEGIN_PROLOG |
3989 : | |
3990 : | FUNCTION: GDwritefield |
3991 : | |
3992 : | DESCRIPTION: Writes data to a grid field. |
3993 : | |
3994 : | |
3995 : | Return Value Type Units Description |
3996 : | ============ ====== ========= ===================================== |
3997 : | status intn return status (0) SUCCEED, (-1) FAIL |
3998 : | |
3999 : | INPUTS: |
4000 : | gridID int32 grid structure ID |
4001 : | fieldname char fieldname |
4002 : | start int32 start array |
4003 : | stride int32 stride array |
4004 : | edge int32 edge array |
4005 : | |
4006 : | |
4007 : | OUTPUTS: |
4008 : | data void data buffer for write |
4009 : | |
4010 : | NOTES: |
4011 : | |
4012 : | |
4013 : | Date Programmer Description |
4014 : | ====== ============ ================================================= |
4015 : | Jun 96 Joel Gales Original Programmer |
4016 : | |
4017 : | END_PROLOG |
4018 : -----------------------------------------------------------------------------*/
4019 : intn
4020 0 : GDwritefield(int32 gridID, const char *fieldname,
4021 : int32 start[], int32 stride[], int32 edge[], VOIDP data)
4022 :
4023 : {
4024 0 : intn status = 0; /* routine return status variable */
4025 :
4026 0 : status = GDwrrdfield(gridID, fieldname, "w", start, stride, edge,
4027 : data);
4028 0 : return (status);
4029 : }
4030 :
4031 :
4032 :
4033 :
4034 :
4035 : /*----------------------------------------------------------------------------|
4036 : | BEGIN_PROLOG |
4037 : | |
4038 : | FUNCTION: GDreadfield |
4039 : | |
4040 : | DESCRIPTION: Reads data from a grid field. |
4041 : | |
4042 : | |
4043 : | Return Value Type Units Description |
4044 : | ============ ====== ========= ===================================== |
4045 : | status intn return status (0) SUCCEED, (-1) FAIL |
4046 : | |
4047 : | INPUTS: |
4048 : | gridID int32 grid structure ID |
4049 : | fieldname char fieldname |
4050 : | start int32 start array |
4051 : | stride int32 stride array |
4052 : | edge int32 edge array |
4053 : | buffer void data buffer for read |
4054 : | |
4055 : | |
4056 : | OUTPUTS: |
4057 : | None |
4058 : | |
4059 : | NOTES: |
4060 : | |
4061 : | |
4062 : | Date Programmer Description |
4063 : | ====== ============ ================================================= |
4064 : | Jun 96 Joel Gales Original Programmer |
4065 : | |
4066 : | END_PROLOG |
4067 : -----------------------------------------------------------------------------*/
4068 : intn
4069 0 : GDreadfield(int32 gridID, const char *fieldname,
4070 : int32 start[], int32 stride[], int32 edge[], VOIDP buffer)
4071 :
4072 : {
4073 0 : intn status = 0; /* routine return status variable */
4074 :
4075 0 : status = GDwrrdfield(gridID, fieldname, "r", start, stride, edge,
4076 : buffer);
4077 0 : return (status);
4078 : }
4079 :
4080 :
4081 :
4082 :
4083 : /*----------------------------------------------------------------------------|
4084 : | BEGIN_PROLOG |
4085 : | |
4086 : | FUNCTION: GDwrrdattr |
4087 : | |
4088 : | DESCRIPTION: |
4089 : | |
4090 : | |
4091 : | Return Value Type Units Description |
4092 : | ============ ====== ========= ===================================== |
4093 : | status intn return status (0) SUCCEED, (-1) FAIL |
4094 : | |
4095 : | INPUTS: |
4096 : | gridID int32 grid structure ID |
4097 : | attrname char attribute name |
4098 : | numbertype int32 attribute HDF numbertype |
4099 : | count int32 Number of attribute elements |
4100 : | wrcode char Read/Write Code "w/r" |
4101 : | datbuf void I/O buffer |
4102 : | |
4103 : | OUTPUTS: |
4104 : | datbuf |
4105 : | |
4106 : | NOTES: |
4107 : | |
4108 : | |
4109 : | Date Programmer Description |
4110 : | ====== ============ ================================================= |
4111 : | Jun 96 Joel Gales Original Programmer |
4112 : | Oct 96 Joel Gales Get Attribute Vgroup ID from external array |
4113 : | |
4114 : | END_PROLOG |
4115 : -----------------------------------------------------------------------------*/
4116 : static intn
4117 0 : GDwrrdattr(int32 gridID, const char *attrname, int32 numbertype, int32 count,
4118 : const char *wrcode, VOIDP datbuf)
4119 :
4120 : {
4121 : intn status; /* routine return status variable */
4122 :
4123 : int32 fid; /* HDF-EOS file ID */
4124 : int32 attrVgrpID; /* Grid attribute ID */
4125 : int32 dum; /* dummy variable */
4126 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4127 :
4128 :
4129 : /* Check Grid id */
4130 0 : status = GDchkgdid(gridID, "GDwrrdattr", &fid, &dum, &dum);
4131 :
4132 0 : if (status == 0)
4133 : {
4134 : /* Perform Attribute I/O */
4135 : /* --------------------- */
4136 0 : attrVgrpID = GDXGrid[gridID % idOffset].VIDTable[1];
4137 0 : status = EHattr(fid, attrVgrpID, attrname, numbertype, count,
4138 : wrcode, datbuf);
4139 : }
4140 0 : return (status);
4141 : }
4142 :
4143 :
4144 :
4145 : /*----------------------------------------------------------------------------|
4146 : | BEGIN_PROLOG |
4147 : | |
4148 : | FUNCTION: GDwriteattr |
4149 : | |
4150 : | DESCRIPTION: Writes/updates attribute in a grid. |
4151 : | |
4152 : | |
4153 : | Return Value Type Units Description |
4154 : | ============ ====== ========= ===================================== |
4155 : | status intn return status (0) SUCCEED, (-1) FAIL |
4156 : | |
4157 : | INPUTS: |
4158 : | gridID int32 grid structure ID |
4159 : | attrname char attribute name |
4160 : | numbertype int32 attribute HDF numbertype |
4161 : | count int32 Number of attribute elements |
4162 : | datbuf void I/O buffer |
4163 : | |
4164 : | OUTPUTS: |
4165 : | None |
4166 : | |
4167 : | NOTES: |
4168 : | |
4169 : | |
4170 : | Date Programmer Description |
4171 : | ====== ============ ================================================= |
4172 : | Jun 96 Joel Gales Original Programmer |
4173 : | |
4174 : | END_PROLOG |
4175 : -----------------------------------------------------------------------------*/
4176 : intn
4177 0 : GDwriteattr(int32 gridID, const char *attrname, int32 numbertype, int32 count,
4178 : VOIDP datbuf)
4179 : {
4180 0 : intn status = 0; /* routine return status variable */
4181 :
4182 : /* Call GDwrrdattr routine to write attribute */
4183 : /* ------------------------------------------ */
4184 0 : status = GDwrrdattr(gridID, attrname, numbertype, count, "w", datbuf);
4185 :
4186 0 : return (status);
4187 : }
4188 :
4189 :
4190 :
4191 : /*----------------------------------------------------------------------------|
4192 : | BEGIN_PROLOG |
4193 : | |
4194 : | FUNCTION: GDreadattr |
4195 : | |
4196 : | DESCRIPTION: Reads attribute from a grid. |
4197 : | |
4198 : | |
4199 : | Return Value Type Units Description |
4200 : | ============ ====== ========= ===================================== |
4201 : | status intn return status (0) SUCCEED, (-1) FAIL |
4202 : | |
4203 : | INPUTS: |
4204 : | gridID int32 grid structure ID |
4205 : | attrname char attribute name |
4206 : | |
4207 : | OUTPUTS: |
4208 : | datbuf void I/O buffer |
4209 : | |
4210 : | NOTES: |
4211 : | |
4212 : | |
4213 : | Date Programmer Description |
4214 : | ====== ============ ================================================= |
4215 : | Jun 96 Joel Gales Original Programmer |
4216 : | |
4217 : | END_PROLOG |
4218 : -----------------------------------------------------------------------------*/
4219 : intn
4220 0 : GDreadattr(int32 gridID, const char *attrname, VOIDP datbuf)
4221 : {
4222 0 : intn status = 0; /* routine return status variable */
4223 0 : int32 dum = 0; /* dummy variable */
4224 :
4225 : /* Call GDwrrdattr routine to read attribute */
4226 : /* ----------------------------------------- */
4227 0 : status = GDwrrdattr(gridID, attrname, dum, dum, "r", datbuf);
4228 :
4229 0 : return (status);
4230 : }
4231 :
4232 :
4233 :
4234 :
4235 :
4236 : /*----------------------------------------------------------------------------|
4237 : | BEGIN_PROLOG |
4238 : | |
4239 : | FUNCTION: GDattrinfo |
4240 : | |
4241 : | DESCRIPTION: |
4242 : | |
4243 : | |
4244 : | Return Value Type Units Description |
4245 : | ============ ====== ========= ===================================== |
4246 : | status intn return status (0) SUCCEED, (-1) FAIL |
4247 : | |
4248 : | INPUTS: |
4249 : | gridID int32 grid structure ID |
4250 : | attrname char attribute name |
4251 : | |
4252 : | OUTPUTS: |
4253 : | numbertype int32 attribute HDF numbertype |
4254 : | count int32 Number of attribute elements |
4255 : | |
4256 : | |
4257 : | OUTPUTS: |
4258 : | None |
4259 : | |
4260 : | NOTES: |
4261 : | |
4262 : | |
4263 : | Date Programmer Description |
4264 : | ====== ============ ================================================= |
4265 : | Jun 96 Joel Gales Original Programmer |
4266 : | Oct 96 Joel Gales Get Attribute Vgroup ID from external array |
4267 : | |
4268 : | END_PROLOG |
4269 : -----------------------------------------------------------------------------*/
4270 : intn
4271 0 : GDattrinfo(int32 gridID, const char *attrname, int32 * numbertype, int32 * count)
4272 : {
4273 0 : intn status = 0; /* routine return status variable */
4274 :
4275 : int32 fid; /* HDF-EOS file ID */
4276 : int32 attrVgrpID; /* Grid attribute ID */
4277 : int32 dum; /* dummy variable */
4278 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4279 :
4280 0 : status = GDchkgdid(gridID, "GDattrinfo", &fid, &dum, &dum);
4281 :
4282 0 : attrVgrpID = GDXGrid[gridID % idOffset].VIDTable[1];
4283 :
4284 0 : status = EHattrinfo(fid, attrVgrpID, attrname, numbertype,
4285 : count);
4286 :
4287 0 : return (status);
4288 : }
4289 :
4290 :
4291 :
4292 :
4293 :
4294 :
4295 : /*----------------------------------------------------------------------------|
4296 : | BEGIN_PROLOG |
4297 : | |
4298 : | FUNCTION: GDinqattrs |
4299 : | |
4300 : | DESCRIPTION: |
4301 : | |
4302 : | |
4303 : | Return Value Type Units Description |
4304 : | ============ ====== ========= ===================================== |
4305 : | nattr int32 Number of attributes in swath struct |
4306 : | |
4307 : | INPUTS: |
4308 : | grid ID int32 grid structure ID |
4309 : | |
4310 : | OUTPUTS: |
4311 : | attrnames char Attribute names in swath struct |
4312 : | (Comma-separated list) |
4313 : | strbufsize int32 Attributes name list string length |
4314 : | |
4315 : | OUTPUTS: |
4316 : | None |
4317 : | |
4318 : | NOTES: |
4319 : | |
4320 : | |
4321 : | Date Programmer Description |
4322 : | ====== ============ ================================================= |
4323 : | Jun 96 Joel Gales Original Programmer |
4324 : | Oct 96 Joel Gales Initialize nattr |
4325 : | Oct 96 Joel Gales Get Attribute Vgroup ID from external array |
4326 : | |
4327 : | END_PROLOG |
4328 : -----------------------------------------------------------------------------*/
4329 : int32
4330 0 : GDinqattrs(int32 gridID, char *attrnames, int32 * strbufsize)
4331 : {
4332 : intn status; /* routine return status variable */
4333 :
4334 : int32 fid; /* HDF-EOS file ID */
4335 : int32 attrVgrpID; /* Grid attribute ID */
4336 : int32 dum; /* dummy variable */
4337 0 : int32 nattr = 0; /* Number of attributes */
4338 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4339 :
4340 :
4341 : /* Check Grid id */
4342 0 : status = GDchkgdid(gridID, "GDinqattrs", &fid, &dum, &dum);
4343 :
4344 0 : if (status == 0)
4345 : {
4346 0 : attrVgrpID = GDXGrid[gridID % idOffset].VIDTable[1];
4347 0 : nattr = EHattrcat(fid, attrVgrpID, attrnames, strbufsize);
4348 : }
4349 :
4350 0 : return (nattr);
4351 : }
4352 :
4353 :
4354 :
4355 :
4356 :
4357 :
4358 : #define REMQUOTE(x) do { \
4359 : char* l_x = x; \
4360 : const size_t l_x_len = strlen(l_x); \
4361 : if (l_x_len >= 2 && l_x[0] == '"' && l_x[l_x_len - 1] == '"') {\
4362 : memmove(l_x, l_x + 1, l_x_len - 2); \
4363 : l_x[l_x_len - 2] = 0; \
4364 : } \
4365 : } while(0)
4366 :
4367 :
4368 : /*----------------------------------------------------------------------------|
4369 : | BEGIN_PROLOG |
4370 : | |
4371 : | FUNCTION: GDinqdims |
4372 : | |
4373 : | DESCRIPTION: Retrieve information about all dimensions defined in a grid. |
4374 : | |
4375 : | |
4376 : | Return Value Type Units Description |
4377 : | ============ ====== ========= ===================================== |
4378 : | nDim int32 Number of defined dimensions |
4379 : | |
4380 : | INPUTS: |
4381 : | gridID int32 grid structure ID |
4382 : | |
4383 : | OUTPUTS: |
4384 : | dimnames char Dimension names (comma-separated) |
4385 : | dims int32 Dimension values |
4386 : | |
4387 : | |
4388 : | OUTPUTS: |
4389 : | None |
4390 : | |
4391 : | NOTES: |
4392 : | |
4393 : | |
4394 : | Date Programmer Description |
4395 : | ====== ============ ================================================= |
4396 : | Jun 96 Joel Gales Original Programmer |
4397 : | Aug 96 Joel Gales Make metadata ODL compliant |
4398 : | Feb 97 Joel Gales Set nDim to -1 if status = -1 |
4399 : | |
4400 : | END_PROLOG |
4401 : -----------------------------------------------------------------------------*/
4402 : int32
4403 0 : GDinqdims(int32 gridID, char *dimnames, int32 dims[])
4404 : {
4405 : intn status; /* routine return status variable */
4406 :
4407 : int32 fid; /* HDF-EOS file ID */
4408 : int32 sdInterfaceID; /* HDF SDS interface ID */
4409 : int32 gdVgrpID; /* Grid root Vgroup ID */
4410 : int32 size; /* Dimension size */
4411 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4412 0 : int32 nDim = 0; /* Number of dimensions */
4413 :
4414 : char *metabuf; /* Pointer to structural metadata (SM) */
4415 : char *metaptrs[2];/* Pointers to begin and end of SM section */
4416 : char gridname[80]; /* Grid Name */
4417 : char *utlstr;/* Utility string */
4418 :
4419 : /* Allocate space for utility string */
4420 : /* --------------------------------- */
4421 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
4422 0 : if(utlstr == NULL)
4423 : {
4424 0 : HEpush(DFE_NOSPACE,"GDinqdims", __FILE__, __LINE__);
4425 0 : return(-1);
4426 : }
4427 : /* Check for valid grid id */
4428 : /* ----------------------- */
4429 0 : status = GDchkgdid(gridID, "GDinqdims", &fid, &sdInterfaceID, &gdVgrpID);
4430 :
4431 0 : if (status == 0)
4432 : {
4433 : /* If dimension names or sizes are requested */
4434 : /* ----------------------------------------- */
4435 0 : if (dimnames != NULL || dims != NULL)
4436 : {
4437 : /* Get grid name */
4438 : /* ------------- */
4439 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
4440 :
4441 :
4442 : /* Get pointers to "Dimension" section within SM */
4443 : /* --------------------------------------------- */
4444 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
4445 : "Dimension", metaptrs);
4446 0 : if(metabuf == NULL)
4447 : {
4448 0 : free(utlstr);
4449 0 : return(-1);
4450 : }
4451 :
4452 :
4453 : /* If dimension names are requested then "clear" name buffer */
4454 : /* --------------------------------------------------------- */
4455 0 : if (dimnames != NULL)
4456 : {
4457 0 : dimnames[0] = 0;
4458 : }
4459 :
4460 0 : while (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
4461 : {
4462 0 : strcpy(utlstr, "\t\tOBJECT=");
4463 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
4464 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
4465 : {
4466 : /* Get Dimension Name */
4467 : /* ------------------ */
4468 0 : if (dimnames != NULL)
4469 : {
4470 : /* Check 1st for old meta data then new */
4471 : /* ------------------------------------ */
4472 0 : EHgetmetavalue(metaptrs, "OBJECT", utlstr);
4473 0 : if (utlstr[0] != '"')
4474 : {
4475 0 : metaptrs[0] =
4476 0 : strstr(metaptrs[0], "\t\t\t\tDimensionName=");
4477 0 : EHgetmetavalue(metaptrs, "DimensionName", utlstr);
4478 : }
4479 :
4480 : /* Strip off double quotes */
4481 : /* ----------------------- */
4482 0 : memmove(utlstr, utlstr + 1, strlen(utlstr) - 2);
4483 0 : utlstr[strlen(utlstr) - 2] = 0;
4484 :
4485 0 : if (nDim > 0)
4486 : {
4487 0 : strcat(dimnames, ",");
4488 : }
4489 0 : strcat(dimnames, utlstr);
4490 : }
4491 :
4492 : /* Get Dimension Size */
4493 : /* ------------------ */
4494 0 : if (dims != NULL)
4495 : {
4496 0 : EHgetmetavalue(metaptrs, "Size", utlstr);
4497 0 : size = atoi(utlstr);
4498 0 : dims[nDim] = size;
4499 : }
4500 0 : nDim++;
4501 : }
4502 : }
4503 0 : free(metabuf);
4504 :
4505 : }
4506 : }
4507 :
4508 :
4509 : /* Set nDim to -1 if error status exists */
4510 : /* ------------------------------------- */
4511 0 : if (status == -1)
4512 : {
4513 0 : nDim = -1;
4514 : }
4515 0 : free(utlstr);
4516 0 : return (nDim);
4517 : }
4518 :
4519 :
4520 :
4521 :
4522 :
4523 :
4524 : /*----------------------------------------------------------------------------|
4525 : | BEGIN_PROLOG |
4526 : | |
4527 : | FUNCTION: GDinqfields |
4528 : | |
4529 : | DESCRIPTION: Retrieve information about all data fields defined in a grid. |
4530 : | |
4531 : | |
4532 : | Return Value Type Units Description |
4533 : | ============ ====== ========= ===================================== |
4534 : | nFld int32 Number of fields in swath |
4535 : | |
4536 : | INPUTS: |
4537 : | gridID int32 grid structure ID |
4538 : | |
4539 : | |
4540 : | OUTPUTS: |
4541 : | fieldlist char Field names (comma-separated) |
4542 : | rank int32 Array of ranks |
4543 : | numbertype int32 Array of HDF number types |
4544 : | |
4545 : | NOTES: |
4546 : | |
4547 : | |
4548 : | Date Programmer Description |
4549 : | ====== ============ ================================================= |
4550 : | Jun 96 Joel Gales Original Programmer |
4551 : | Aug 96 Joel Gales Make metadata ODL compliant |
4552 : | Feb 97 Joel Gales Set nFld to -1 if status = -1 |
4553 : | |
4554 : | END_PROLOG |
4555 : -----------------------------------------------------------------------------*/
4556 : int32
4557 0 : GDinqfields(int32 gridID, char *fieldlist, int32 rank[],
4558 : int32 numbertype[])
4559 : {
4560 : intn status; /* routine return status variable */
4561 :
4562 : int32 fid; /* HDF-EOS file ID */
4563 : int32 sdInterfaceID; /* HDF SDS interface ID */
4564 : int32 gdVgrpID; /* Grid root Vgroup ID */
4565 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4566 0 : int32 nFld = 0; /* Number of mappings */
4567 : int32 slen[8]; /* String length array */
4568 :
4569 : char *metabuf; /* Pointer to structural metadata (SM) */
4570 : char *metaptrs[2];/* Pointers to begin and end of SM section */
4571 : char gridname[80]; /* Grid Name */
4572 : char *utlstr;/* Utility string */
4573 : char *ptr[8]; /* String pointer array */
4574 :
4575 : /* Allocate space for utility string */
4576 : /* --------------------------------- */
4577 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
4578 0 : if(utlstr == NULL)
4579 : {
4580 0 : HEpush(DFE_NOSPACE,"GDinqfields", __FILE__, __LINE__);
4581 0 : return(-1);
4582 : }
4583 : /* Check for valid grid id */
4584 : /* ----------------------- */
4585 0 : status = GDchkgdid(gridID, "GDinqfields", &fid, &sdInterfaceID, &gdVgrpID);
4586 0 : if (status == 0)
4587 : {
4588 :
4589 : /* If field names, ranks, or number types desired ... */
4590 : /* --------------------------------------------------- */
4591 0 : if (fieldlist != NULL || rank != NULL || numbertype != NULL)
4592 : {
4593 : /* Get grid name */
4594 : /* ------------- */
4595 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
4596 :
4597 :
4598 : /* Get pointers to "DataField" section within SM */
4599 : /* --------------------------------------------- */
4600 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
4601 : "DataField", metaptrs);
4602 0 : if(metabuf == NULL)
4603 : {
4604 0 : free(utlstr);
4605 0 : return(-1);
4606 : }
4607 :
4608 :
4609 : /* If field names are desired then "clear" name buffer */
4610 : /* --------------------------------------------------- */
4611 0 : if (fieldlist != NULL)
4612 : {
4613 0 : fieldlist[0] = 0;
4614 : }
4615 :
4616 :
4617 : /* Begin loop through mapping entries in metadata */
4618 : /* ---------------------------------------------- */
4619 : while (1)
4620 : {
4621 : /* Search for OBJECT string */
4622 : /* ------------------------ */
4623 0 : metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
4624 :
4625 :
4626 : /* If found within "Data" Field metadata section .. */
4627 : /* ------------------------------------------------ */
4628 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
4629 : {
4630 : /* Get Fieldnames (if desired) */
4631 : /* --------------------------- */
4632 0 : if (fieldlist != NULL)
4633 : {
4634 : /* Check 1st for old meta data then new */
4635 : /* ------------------------------------ */
4636 0 : EHgetmetavalue(metaptrs, "OBJECT", utlstr);
4637 :
4638 : /*
4639 : * If OBJECT value begins with double quote then old
4640 : * metadata, field name is OBJECT value. Otherwise
4641 : * search for "DataFieldName" string
4642 : */
4643 :
4644 0 : if (utlstr[0] != '"')
4645 : {
4646 0 : strcpy(utlstr, "\t\t\t\t");
4647 0 : strcat(utlstr, "DataFieldName");
4648 0 : strcat(utlstr, "=");
4649 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
4650 0 : EHgetmetavalue(metaptrs, "DataFieldName", utlstr);
4651 : }
4652 :
4653 : /* Strip off double quotes */
4654 : /* ----------------------- */
4655 0 : REMQUOTE(utlstr);
4656 :
4657 :
4658 : /* Add to fieldlist */
4659 : /* ---------------- */
4660 0 : if (nFld > 0)
4661 : {
4662 0 : strcat(fieldlist, ",");
4663 : }
4664 0 : strcat(fieldlist, utlstr);
4665 :
4666 : }
4667 : /* Get Numbertype */
4668 0 : if (numbertype != NULL)
4669 : {
4670 0 : EHgetmetavalue(metaptrs, "DataType", utlstr);
4671 0 : numbertype[nFld] = EHnumstr(utlstr);
4672 : }
4673 : /*
4674 : * Get Rank (if desired) by counting # of dimensions in
4675 : * "DimList" string
4676 : */
4677 0 : if (rank != NULL)
4678 : {
4679 0 : EHgetmetavalue(metaptrs, "DimList", utlstr);
4680 0 : rank[nFld] = EHparsestr(utlstr, ',', ptr, slen);
4681 : }
4682 : /* Increment number of fields */
4683 0 : nFld++;
4684 : }
4685 : else
4686 : /* No more fields found */
4687 : {
4688 : break;
4689 : }
4690 : }
4691 0 : free(metabuf);
4692 : }
4693 : }
4694 :
4695 : /* Set nFld to -1 if error status exists */
4696 : /* ------------------------------------- */
4697 0 : if (status == -1)
4698 : {
4699 0 : nFld = -1;
4700 : }
4701 0 : free(utlstr);
4702 0 : return (nFld);
4703 : }
4704 :
4705 :
4706 :
4707 :
4708 :
4709 : /*----------------------------------------------------------------------------|
4710 : | BEGIN_PROLOG |
4711 : | |
4712 : | FUNCTION: GDnentries |
4713 : | |
4714 : | DESCRIPTION: Returns number of entries and descriptive string buffer |
4715 : | size for a specified entity. |
4716 : | |
4717 : | |
4718 : | Return Value Type Units Description |
4719 : | ============ ====== ========= ===================================== |
4720 : | nEntries int32 Number of entries |
4721 : | |
4722 : | INPUTS: |
4723 : | gridID int32 grid structure ID |
4724 : | entrycode int32 Entry code |
4725 : | HDFE_NENTDIM (0) |
4726 : | HDFE_NENTDFLD (4) |
4727 : | |
4728 : | |
4729 : | OUTPUTS: |
4730 : | strbufsize int32 Length of comma-separated list |
4731 : | (Does not include null-terminator |
4732 : | |
4733 : | NOTES: |
4734 : | |
4735 : | |
4736 : | Date Programmer Description |
4737 : | ====== ============ ================================================= |
4738 : | Jun 96 Joel Gales Original Programmer |
4739 : | Aug 96 Joel Gales Make metadata ODL compliant |
4740 : | Feb 97 Joel Gales Set nEntries to -1 if status = -1 |
4741 : | |
4742 : | END_PROLOG |
4743 : -----------------------------------------------------------------------------*/
4744 : int32
4745 0 : GDnentries(int32 gridID, int32 entrycode, int32 * strbufsize)
4746 :
4747 : {
4748 : intn status; /* routine return status variable */
4749 : intn i; /* Loop index */
4750 :
4751 : int32 fid; /* HDF-EOS file ID */
4752 : int32 sdInterfaceID; /* HDF SDS interface ID */
4753 : int32 gdVgrpID; /* Grid root Vgroup ID */
4754 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
4755 0 : int32 nEntries = 0; /* Number of entries */
4756 : int32 metaflag; /* Old (0), New (1) metadata flag) */
4757 0 : int32 nVal = 0; /* Number of strings to search for */
4758 :
4759 0 : char *metabuf = NULL; /* Pointer to structural metadata (SM) */
4760 : char *metaptrs[2];/* Pointers to begin and end of SM section */
4761 : char gridname[80]; /* Grid Name */
4762 : char *utlstr;/* Utility string */
4763 : char valName[2][32]; /* Strings to search for */
4764 :
4765 : /* Allocate space for utility string */
4766 : /* --------------------------------- */
4767 0 : utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
4768 0 : if(utlstr == NULL)
4769 : {
4770 0 : HEpush(DFE_NOSPACE,"GDnentries", __FILE__, __LINE__);
4771 0 : return(-1);
4772 : }
4773 0 : status = GDchkgdid(gridID, "GDnentries", &fid, &sdInterfaceID, &gdVgrpID);
4774 :
4775 0 : if (status == 0)
4776 : {
4777 : /* Get grid name */
4778 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
4779 :
4780 : /* Zero out string buffer size */
4781 0 : *strbufsize = 0;
4782 :
4783 :
4784 : /*
4785 : * Get pointer to relevant section within SM and Get names of
4786 : * metadata strings to inquire about
4787 : */
4788 0 : switch (entrycode)
4789 : {
4790 0 : case HDFE_NENTDIM:
4791 : {
4792 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
4793 : "Dimension", metaptrs);
4794 0 : if(metabuf == NULL)
4795 : {
4796 0 : free(utlstr);
4797 0 : return(-1);
4798 : }
4799 :
4800 0 : nVal = 1;
4801 0 : strcpy(&valName[0][0], "DimensionName");
4802 : }
4803 0 : break;
4804 :
4805 0 : case HDFE_NENTDFLD:
4806 : {
4807 0 : metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
4808 : "DataField", metaptrs);
4809 0 : if(metabuf == NULL)
4810 : {
4811 0 : free(utlstr);
4812 0 : return(-1);
4813 : }
4814 :
4815 0 : nVal = 1;
4816 0 : strcpy(&valName[0][0], "DataFieldName");
4817 : }
4818 0 : break;
4819 : }
4820 :
4821 :
4822 : /*
4823 : * Check for presence of 'GROUP="' string If found then old metadata,
4824 : * search on OBJECT string
4825 : */
4826 0 : metaflag = (strstr(metabuf, "GROUP=\"") == NULL) ? 1 : 0;
4827 0 : if (metaflag == 0)
4828 : {
4829 0 : nVal = 1;
4830 0 : strcpy(&valName[0][0], "\t\tOBJECT");
4831 : }
4832 :
4833 :
4834 : /* Begin loop through entries in metadata */
4835 : /* -------------------------------------- */
4836 : while (1)
4837 : {
4838 : /* Search for first string */
4839 0 : strcpy(utlstr, &valName[0][0]);
4840 0 : strcat(utlstr, "=");
4841 0 : metaptrs[0] = strstr(metaptrs[0], utlstr);
4842 :
4843 : /* If found within relevant metadata section ... */
4844 0 : if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
4845 : {
4846 0 : for (i = 0; i < nVal; i++)
4847 : {
4848 : /*
4849 : * Get all string values Don't count quotes
4850 : */
4851 0 : EHgetmetavalue(metaptrs, &valName[i][0], utlstr);
4852 0 : *strbufsize += (int32)strlen(utlstr) - 2;
4853 : }
4854 : /* Increment number of entries */
4855 0 : nEntries++;
4856 :
4857 : /* Go to end of OBJECT */
4858 0 : metaptrs[0] = strstr(metaptrs[0], "END_OBJECT");
4859 : }
4860 : else
4861 : /* No more entries found */
4862 : {
4863 : break;
4864 : }
4865 : }
4866 0 : free(metabuf);
4867 :
4868 :
4869 : /* Count comma separators & slashes (if mappings) */
4870 : /* ---------------------------------------------- */
4871 0 : if (nEntries > 0)
4872 : {
4873 0 : *strbufsize += nEntries - 1;
4874 0 : *strbufsize += (nVal - 1) * nEntries;
4875 : }
4876 : }
4877 :
4878 :
4879 : /* Set nEntries to -1 if error status exists */
4880 : /* ----------------------------------------- */
4881 0 : if (status == -1)
4882 : {
4883 0 : nEntries = -1;
4884 : }
4885 :
4886 0 : free(utlstr);
4887 0 : return (nEntries);
4888 : }
4889 :
4890 :
4891 :
4892 :
4893 :
4894 : /*----------------------------------------------------------------------------|
4895 : | BEGIN_PROLOG |
4896 : | |
4897 : | FUNCTION: GDinqgrid |
4898 : | |
4899 : | DESCRIPTION: Returns number and names of grid structures in file |
4900 : | |
4901 : | |
4902 : | Return Value Type Units Description |
4903 : | ============ ====== ========= ===================================== |
4904 : | nGrid int32 Number of grid structures in file |
4905 : | |
4906 : | INPUTS: |
4907 : | filename char HDF-EOS filename |
4908 : | |
4909 : | OUTPUTS: |
4910 : | gridlist char List of grid names (comma-separated) |
4911 : | strbufsize int32 Length of gridlist |
4912 : | |
4913 : | NOTES: |
4914 : | |
4915 : | |
4916 : | Date Programmer Description |
4917 : | ====== ============ ================================================= |
4918 : | Jun 96 Joel Gales Original Programmer |
4919 : | |
4920 : | END_PROLOG |
4921 : -----------------------------------------------------------------------------*/
4922 : int32
4923 4 : GDinqgrid(const char *filename, char *gridlist, int32 * strbufsize)
4924 : {
4925 : int32 nGrid; /* Number of grid structures in file */
4926 :
4927 : /* Call "EHinquire" routine */
4928 : /* ------------------------ */
4929 4 : nGrid = EHinquire(filename, "GRID", gridlist, strbufsize);
4930 :
4931 4 : return (nGrid);
4932 : }
4933 :
4934 :
4935 : /*----------------------------------------------------------------------------|
4936 : | BEGIN_PROLOG |
4937 : | |
4938 : | FUNCTION: GDsetfillvalue |
4939 : | |
4940 : | DESCRIPTION: Sets fill value for the specified field. |
4941 : | |
4942 : | |
4943 : | Return Value Type Units Description |
4944 : | ============ ====== ========= ===================================== |
4945 : | status intn return status (0) SUCCEED, (-1) FAIL |
4946 : | |
4947 : | INPUTS: |
4948 : | gridID int32 grid structure ID |
4949 : | fieldname char field name |
4950 : | fillval void fill value |
4951 : | |
4952 : | OUTPUTS: |
4953 : | None |
4954 : | |
4955 : | NOTES: |
4956 : | |
4957 : | |
4958 : | Date Programmer Description |
4959 : | ====== ============ ================================================= |
4960 : | Jun 96 Joel Gales Original Programmer |
4961 : | |
4962 : | END_PROLOG |
4963 : -----------------------------------------------------------------------------*/
4964 : intn
4965 0 : GDsetfillvalue(int32 gridID, const char *fieldname, VOIDP fillval)
4966 : {
4967 : intn status; /* routine return status variable */
4968 :
4969 : int32 fid; /* HDF-EOS file ID */
4970 : int32 sdInterfaceID; /* HDF SDS interface ID */
4971 : int32 gdVgrpID; /* Grid root Vgroup ID */
4972 : int32 sdid; /* SDS id */
4973 : int32 nt; /* Number type */
4974 : int32 dims[8]; /* Dimensions array */
4975 : int32 dum; /* Dummy variable */
4976 : int32 solo; /* "Solo" (non-merged) field flag */
4977 :
4978 : char name[80]; /* Fill value "attribute" name */
4979 :
4980 : /* Check for valid grid ID and get SDS interface ID */
4981 0 : status = GDchkgdid(gridID, "GDsetfillvalue",
4982 : &fid, &sdInterfaceID, &gdVgrpID);
4983 :
4984 0 : if (status == 0)
4985 : {
4986 : /* Get field info */
4987 0 : status = GDfieldinfo(gridID, fieldname, &dum, dims, &nt, NULL);
4988 :
4989 0 : if (status == 0)
4990 : {
4991 : /* Get SDS ID and solo flag */
4992 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
4993 : &sdid, &dum, &dum, &dum,
4994 : dims, &solo);
4995 :
4996 : /* If unmerged field then call HDF set field routine */
4997 0 : if (solo == 1)
4998 : {
4999 0 : /* status = */ SDsetfillvalue(sdid, fillval);
5000 : }
5001 :
5002 : /*
5003 : * Store fill value in attribute. Name is given by fieldname
5004 : * prepended with "_FV_"
5005 : */
5006 0 : strcpy(name, "_FV_");
5007 0 : strcat(name, fieldname);
5008 0 : status = GDwriteattr(gridID, name, nt, 1, fillval);
5009 :
5010 :
5011 : }
5012 : else
5013 : {
5014 0 : HEpush(DFE_GENAPP, "GDsetfillvalue", __FILE__, __LINE__);
5015 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
5016 : }
5017 : }
5018 0 : return (status);
5019 : }
5020 :
5021 :
5022 :
5023 :
5024 :
5025 :
5026 :
5027 : /*----------------------------------------------------------------------------|
5028 : | BEGIN_PROLOG |
5029 : | |
5030 : | FUNCTION: GDgetfillvalue |
5031 : | |
5032 : | DESCRIPTION: Retrieves fill value for a specified field. |
5033 : | |
5034 : | |
5035 : | Return Value Type Units Description |
5036 : | ============ ====== ========= ===================================== |
5037 : | status intn return status (0) SUCCEED, (-1) FAIL |
5038 : | |
5039 : | INPUTS: |
5040 : | gridID int32 grid structure ID |
5041 : | fieldname char field name |
5042 : | |
5043 : | OUTPUTS: |
5044 : | fillval void fill value |
5045 : | |
5046 : | NOTES: |
5047 : | |
5048 : | |
5049 : | Date Programmer Description |
5050 : | ====== ============ ================================================= |
5051 : | Jun 96 Joel Gales Original Programmer |
5052 : | |
5053 : | END_PROLOG |
5054 : -----------------------------------------------------------------------------*/
5055 : intn
5056 0 : GDgetfillvalue(int32 gridID, const char *fieldname, VOIDP fillval)
5057 : {
5058 : intn status; /* routine return status variable */
5059 :
5060 : int32 nt; /* Number type */
5061 : int32 dims[8]; /* Dimensions array */
5062 : int32 dum; /* Dummy variable */
5063 :
5064 : char name[80]; /* Fill value "attribute" name */
5065 :
5066 0 : status = GDchkgdid(gridID, "GDgetfillvalue", &dum, &dum, &dum);
5067 :
5068 : /* Check for valid grid ID */
5069 0 : if (status == 0)
5070 : {
5071 : /* Get field info */
5072 0 : status = GDfieldinfo(gridID, fieldname, &dum, dims, &nt, NULL);
5073 :
5074 0 : if (status == 0)
5075 : {
5076 : /* Read fill value attribute */
5077 0 : strcpy(name, "_FV_");
5078 0 : strcat(name, fieldname);
5079 0 : status = GDreadattr(gridID, name, fillval);
5080 : }
5081 : else
5082 : {
5083 0 : HEpush(DFE_GENAPP, "GDgetfillvalue", __FILE__, __LINE__);
5084 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
5085 : }
5086 :
5087 : }
5088 0 : return (status);
5089 : }
5090 :
5091 :
5092 :
5093 :
5094 :
5095 : /*----------------------------------------------------------------------------|
5096 : | BEGIN_PROLOG |
5097 : | |
5098 : | FUNCTION: GDdetach |
5099 : | |
5100 : | DESCRIPTION: Detaches from grid interface and performs file housekeeping. |
5101 : | |
5102 : | |
5103 : | Return Value Type Units Description |
5104 : | ============ ====== ========= ===================================== |
5105 : | status intn return status (0) SUCCEED, (-1) FAIL |
5106 : | |
5107 : | INPUTS: |
5108 : | gridID int32 grid structure ID |
5109 : | |
5110 : | |
5111 : | OUTPUTS: |
5112 : | None |
5113 : | |
5114 : | NOTES: |
5115 : | |
5116 : | |
5117 : | Date Programmer Description |
5118 : | ====== ============ ================================================= |
5119 : | Jun 96 Joel Gales Original Programmer |
5120 : | Sep 96 Joel Gales Setup dim names for SDsetdimname in dimbuf1 rather |
5121 : | that utlstr |
5122 : | Oct 96 Joel Gales Detach Grid Vgroups |
5123 : | Oct 96 Joel Gales "Detach" from SDS |
5124 : | Nov 96 Joel Gales Call GDchkgdid to check for proper grid ID |
5125 : | Dec 96 Joel Gales Add multiple vertical subsetting garbage collection |
5126 : | Oct 98 Abe Taaheri Added GDXRegion[k]->DimNamePtr[i] =0; after freeing |
5127 : | memory |
5128 : | Sep 99 Abe Taaheri Changed memcpy to memmove because of overlapping |
5129 : | source and destination for GDXSDcomb, nameptr, and |
5130 : | dimptr. memcpy may cause unexpected results. |
5131 : | |
5132 : | END_PROLOG |
5133 : -----------------------------------------------------------------------------*/
5134 : intn
5135 0 : GDdetach(int32 gridID)
5136 :
5137 : {
5138 : intn i; /* Loop index */
5139 : intn j; /* Loop index */
5140 : intn k; /* Loop index */
5141 0 : intn status = 0; /* routine return status variable */
5142 0 : intn statusFill = 0; /* return status from GDgetfillvalue */
5143 :
5144 : int32 *namelen; /* Pointer to name string length array */
5145 : int32 *dimlen; /* Pointer to dim string length array */
5146 : int32 slen1[3]; /* String length array 1 */
5147 : int32 slen2[3]; /* String length array 2 */
5148 : int32 nflds; /* Number of fields */
5149 : int32 match[5]; /* Merged field match array */
5150 : int32 cmbfldcnt; /* Number of fields combined */
5151 : int32 sdid; /* SDS ID */
5152 : int32 vgid; /* Vgroup ID */
5153 : int32 dims[3]; /* Dimension array */
5154 : int32 *offset; /* Pointer to merged field offset array */
5155 : int32 *indvdims; /* Pointer to merged field size array */
5156 : int32 sdInterfaceID; /* SDS interface ID */
5157 : int32 gID; /* Grid ID - offset */
5158 : int32 nflds0; /* Number of fields */
5159 : int32 *namelen0; /* Pointer to name string length array */
5160 : int32 rank; /* Rank of merged field */
5161 : int32 truerank; /* True rank of merged field */
5162 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
5163 : int32 dum; /* Dummy variable */
5164 :
5165 : char *nambuf; /* Pointer to name buffer */
5166 : char **nameptr; /* Pointer to name string pointer array */
5167 : char **dimptr; /* Pointer to dim string pointer array */
5168 : char **nameptr0; /* Pointer to name string pointer array */
5169 : char *ptr1[3]; /* String pointer array */
5170 : char *ptr2[3]; /* String pointer array */
5171 : char dimbuf1[128]; /* Dimension buffer 1 */
5172 : char dimbuf2[128]; /* Dimension buffer 2 */
5173 : char gridname[VGNAMELENMAX + 1]; /* Grid name */
5174 : char *utlbuf; /* Utility buffer */
5175 : char fillval[32];/* Fill value buffer */
5176 :
5177 :
5178 :
5179 0 : status = GDchkgdid(gridID, "GDdetach", &dum, &sdInterfaceID, &dum);
5180 :
5181 0 : if (status == 0)
5182 : {
5183 0 : gID = gridID % idOffset;
5184 0 : Vgetname(GDXGrid[gID].IDTable, gridname);
5185 :
5186 : /* SDS combined fields */
5187 : /* ------------------- */
5188 0 : if (strlen(GDXSDname) == 0)
5189 : {
5190 0 : nflds = 0;
5191 :
5192 : /* Allocate "dummy" arrays so free() doesn't bomb later */
5193 : /* ---------------------------------------------------- */
5194 0 : nameptr = (char **) calloc(1, sizeof(char *));
5195 0 : if(nameptr == NULL)
5196 : {
5197 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5198 0 : return(-1);
5199 : }
5200 0 : namelen = (int32 *) calloc(1, sizeof(int32));
5201 0 : if(namelen == NULL)
5202 : {
5203 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5204 0 : free(nameptr);
5205 0 : return(-1);
5206 : }
5207 0 : nameptr0 = (char **) calloc(1, sizeof(char *));
5208 0 : if(nameptr0 == NULL)
5209 : {
5210 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5211 0 : free(nameptr);
5212 0 : free(namelen);
5213 0 : return(-1);
5214 : }
5215 0 : namelen0 = (int32 *) calloc(1, sizeof(int32));
5216 0 : if(namelen0 == NULL)
5217 : {
5218 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5219 0 : free(nameptr);
5220 0 : free(namelen);
5221 0 : free(nameptr0);
5222 0 : return(-1);
5223 : }
5224 0 : dimptr = (char **) calloc(1, sizeof(char *));
5225 0 : if(dimptr == NULL)
5226 : {
5227 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5228 0 : free(nameptr);
5229 0 : free(namelen);
5230 0 : free(nameptr0);
5231 0 : free(namelen0);
5232 0 : return(-1);
5233 : }
5234 0 : dimlen = (int32 *) calloc(1, sizeof(int32));
5235 0 : if(dimlen == NULL)
5236 : {
5237 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5238 0 : free(nameptr);
5239 0 : free(namelen);
5240 0 : free(nameptr0);
5241 0 : free(namelen0);
5242 0 : free(dimptr);
5243 0 : return(-1);
5244 : }
5245 0 : offset = (int32 *) calloc(1, sizeof(int32));
5246 0 : if(offset == NULL)
5247 : {
5248 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5249 0 : free(nameptr);
5250 0 : free(namelen);
5251 0 : free(nameptr0);
5252 0 : free(namelen0);
5253 0 : free(dimptr);
5254 0 : free(dimlen);
5255 0 : return(-1);
5256 : }
5257 0 : indvdims = (int32 *) calloc(1, sizeof(int32));
5258 0 : if(indvdims == NULL)
5259 : {
5260 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5261 0 : free(nameptr);
5262 0 : free(namelen);
5263 0 : free(nameptr0);
5264 0 : free(namelen0);
5265 0 : free(dimptr);
5266 0 : free(dimlen);
5267 0 : free(offset);
5268 0 : return(-1);
5269 : }
5270 : }
5271 : else
5272 : {
5273 : /*
5274 : * "Trim Off" trailing "," and ";" in GDXSDname & GDXSDdims
5275 : * respectively
5276 : */
5277 0 : GDXSDname[strlen(GDXSDname) - 1] = 0;
5278 0 : GDXSDdims[strlen(GDXSDdims) - 1] = 0;
5279 :
5280 :
5281 : /* Get number of fields from GDXSDname string */
5282 : /* ------------------------------------------ */
5283 0 : nflds = EHparsestr(GDXSDname, ',', NULL, NULL);
5284 :
5285 : /* Allocate space for various dynamic arrays */
5286 : /* ----------------------------------------- */
5287 0 : nameptr = (char **) calloc(nflds, sizeof(char *));
5288 0 : if(nameptr == NULL)
5289 : {
5290 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5291 0 : return(-1);
5292 : }
5293 0 : namelen = (int32 *) calloc(nflds, sizeof(int32));
5294 0 : if(namelen == NULL)
5295 : {
5296 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5297 0 : free(nameptr);
5298 0 : return(-1);
5299 : }
5300 0 : nameptr0 = (char **) calloc(nflds, sizeof(char *));
5301 0 : if(nameptr0 == NULL)
5302 : {
5303 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5304 0 : free(nameptr);
5305 0 : free(namelen);
5306 0 : return(-1);
5307 : }
5308 0 : namelen0 = (int32 *) calloc(nflds, sizeof(int32));
5309 0 : if(namelen0 == NULL)
5310 : {
5311 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5312 0 : free(nameptr);
5313 0 : free(namelen);
5314 0 : free(nameptr0);
5315 0 : return(-1);
5316 : }
5317 0 : dimptr = (char **) calloc(nflds, sizeof(char *));
5318 0 : if(dimptr == NULL)
5319 : {
5320 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5321 0 : free(nameptr);
5322 0 : free(namelen);
5323 0 : free(nameptr0);
5324 0 : free(namelen0);
5325 0 : return(-1);
5326 : }
5327 0 : dimlen = (int32 *) calloc(nflds, sizeof(int32));
5328 0 : if(dimlen == NULL)
5329 : {
5330 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5331 0 : free(nameptr);
5332 0 : free(namelen);
5333 0 : free(nameptr0);
5334 0 : free(namelen0);
5335 0 : free(dimptr);
5336 0 : return(-1);
5337 : }
5338 0 : offset = (int32 *) calloc(nflds, sizeof(int32));
5339 0 : if(offset == NULL)
5340 : {
5341 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5342 0 : free(nameptr);
5343 0 : free(namelen);
5344 0 : free(nameptr0);
5345 0 : free(namelen0);
5346 0 : free(dimptr);
5347 0 : free(dimlen);
5348 0 : return(-1);
5349 : }
5350 0 : indvdims = (int32 *) calloc(nflds, sizeof(int32));
5351 0 : if(indvdims == NULL)
5352 : {
5353 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5354 0 : free(nameptr);
5355 0 : free(namelen);
5356 0 : free(nameptr0);
5357 0 : free(namelen0);
5358 0 : free(dimptr);
5359 0 : free(dimlen);
5360 0 : free(offset);
5361 0 : return(-1);
5362 : }
5363 :
5364 : /* Parse GDXSDname and GDXSDdims strings */
5365 : /* ------------------------------------- */
5366 0 : nflds = EHparsestr(GDXSDname, ',', nameptr, namelen);
5367 0 : nflds = EHparsestr(GDXSDdims, ';', dimptr, dimlen);
5368 : }
5369 :
5370 :
5371 0 : for (i = 0; i < nflds; i++)
5372 : {
5373 0 : if (GDXSDcomb[5 * i] != 0 &&
5374 0 : GDXSDcomb[5 * i + 3] == GDXGrid[gID].IDTable)
5375 : {
5376 0 : nambuf = (char *) calloc(strlen(GDXSDname) + 1, 1);
5377 0 : if(nambuf == NULL)
5378 : {
5379 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5380 0 : free(nameptr);
5381 0 : free(namelen);
5382 0 : free(nameptr0);
5383 0 : free(namelen0);
5384 0 : free(dimptr);
5385 0 : free(dimlen);
5386 0 : free(offset);
5387 0 : return(-1);
5388 : }
5389 0 : utlbuf = (char *) calloc(strlen(GDXSDname) * 2 + 7, 1);
5390 0 : if(utlbuf == NULL)
5391 : {
5392 0 : HEpush(DFE_NOSPACE,"GDdetach", __FILE__, __LINE__);
5393 0 : free(nambuf);
5394 0 : free(nameptr);
5395 0 : free(namelen);
5396 0 : free(nameptr0);
5397 0 : free(namelen0);
5398 0 : free(dimptr);
5399 0 : free(dimlen);
5400 0 : free(offset);
5401 0 : return(-1);
5402 : }
5403 :
5404 0 : for (k = 0; k < (intn)sizeof(dimbuf1); k++)
5405 0 : dimbuf1[k] = 0;
5406 :
5407 :
5408 : /* Load array to match, name & parse dims */
5409 : /* -------------------------------------- */
5410 0 : memcpy(match, &GDXSDcomb[5 * i], 20);
5411 0 : memcpy(nambuf, nameptr[i], namelen[i]);
5412 :
5413 0 : memcpy(dimbuf1, dimptr[i], dimlen[i]);
5414 0 : dum = EHparsestr(dimbuf1, ',', ptr1, slen1);
5415 :
5416 :
5417 : /* Separate combined dimension from others */
5418 : /* --------------------------------------- */
5419 0 : dimbuf1[slen1[0]] = 0;
5420 :
5421 0 : offset[0] = 0;
5422 0 : indvdims[0] = abs(match[0]);
5423 :
5424 0 : for (j = i + 1, cmbfldcnt = 0; j < nflds; j++)
5425 : {
5426 0 : for (k = 0; k < (intn)sizeof(dimbuf2); k++)
5427 0 : dimbuf2[k] = 0;
5428 0 : memcpy(dimbuf2, dimptr[j], dimlen[j]);
5429 0 : dum = EHparsestr(dimbuf2, ',', ptr2, slen2);
5430 0 : dimbuf2[slen2[0]] = 0;
5431 :
5432 :
5433 0 : if (GDXSDcomb[5 * j] != 0 &&
5434 0 : strcmp(dimbuf1 + slen1[0],
5435 0 : dimbuf2 + slen2[0]) == 0 &&
5436 0 : match[1] == GDXSDcomb[5 * j + 1] &&
5437 0 : match[2] == GDXSDcomb[5 * j + 2] &&
5438 0 : match[3] == GDXSDcomb[5 * j + 3] &&
5439 0 : match[4] == GDXSDcomb[5 * j + 4])
5440 : {
5441 : /* Add to combined dimension size */
5442 0 : match[0] += GDXSDcomb[5 * j];
5443 :
5444 : /* Concatenate name */
5445 0 : strcat(nambuf, ",");
5446 0 : memcpy(nambuf + strlen(nambuf),
5447 0 : nameptr[j], namelen[j]);
5448 :
5449 : /* Store individual dims and dim offsets */
5450 0 : cmbfldcnt++;
5451 0 : indvdims[cmbfldcnt] = abs(GDXSDcomb[5 * j]);
5452 0 : offset[cmbfldcnt] =
5453 0 : offset[cmbfldcnt - 1] + indvdims[cmbfldcnt - 1];
5454 :
5455 0 : GDXSDcomb[5 * j] = 0;
5456 : }
5457 : }
5458 :
5459 :
5460 : /* Create SDS */
5461 : /* ---------- */
5462 0 : nflds0 = EHparsestr(nambuf, ',', nameptr0, namelen0);
5463 :
5464 0 : if (abs(match[0]) == 1)
5465 : {
5466 0 : for (k = 0; k < 2; k++)
5467 0 : dims[k] = abs(match[k + 1]);
5468 :
5469 0 : rank = 2;
5470 :
5471 0 : sdid = SDcreate(sdInterfaceID, nambuf,
5472 0 : GDXSDcomb[5 * i + 4], 2, dims);
5473 : }
5474 : else
5475 : {
5476 0 : for (k = 0; k < 3; k++)
5477 0 : dims[k] = abs(match[k]);
5478 :
5479 0 : rank = 3;
5480 :
5481 0 : if (cmbfldcnt > 0)
5482 : {
5483 0 : strcpy(utlbuf, "MRGFLD_");
5484 0 : memcpy(utlbuf + 7, nameptr0[0], namelen0[0]);
5485 0 : utlbuf[7 + namelen0[0]] = 0;
5486 0 : strcat(utlbuf, ":");
5487 0 : strcat(utlbuf, nambuf);
5488 :
5489 0 : status = EHinsertmeta(sdInterfaceID, gridname, "g",
5490 : 6L, utlbuf, NULL);
5491 : }
5492 : else
5493 : {
5494 0 : strcpy(utlbuf, nambuf);
5495 : }
5496 :
5497 0 : sdid = SDcreate(sdInterfaceID, utlbuf,
5498 0 : GDXSDcomb[5 * i + 4], 3, dims);
5499 :
5500 :
5501 0 : if (cmbfldcnt > 0)
5502 : {
5503 0 : SDsetattr(sdid, "Field Dims", DFNT_INT32,
5504 : cmbfldcnt + 1, (VOIDP) indvdims);
5505 :
5506 0 : SDsetattr(sdid, "Field Offsets", DFNT_INT32,
5507 : cmbfldcnt + 1, (VOIDP) offset);
5508 : }
5509 :
5510 : }
5511 :
5512 :
5513 :
5514 : /* Register Dimensions in SDS */
5515 : /* -------------------------- */
5516 0 : for (k = 0; k < rank; k++)
5517 : {
5518 0 : if (rank == 2)
5519 : {
5520 0 : memcpy(dimbuf2, ptr1[k + 1], slen1[k + 1]);
5521 0 : dimbuf2[slen1[k + 1]] = 0;
5522 : }
5523 : else
5524 : {
5525 0 : memcpy(dimbuf2, ptr1[k], slen1[k]);
5526 0 : dimbuf2[slen1[k]] = 0;
5527 : }
5528 :
5529 :
5530 0 : if (k == 0 && rank > 2 && cmbfldcnt > 0)
5531 : {
5532 0 : snprintf(dimbuf2, sizeof(dimbuf2), "%s%s_%d", "MRGDIM:",
5533 0 : gridname, (int)dims[0]);
5534 : }
5535 : else
5536 : {
5537 0 : strcat(dimbuf2, ":");
5538 0 : strcat(dimbuf2, gridname);
5539 : }
5540 0 : SDsetdimname(SDgetdimid(sdid, k), (char *) dimbuf2);
5541 : }
5542 :
5543 :
5544 :
5545 : /* Write Fill Value */
5546 : /* ---------------- */
5547 0 : for (k = 0; k < nflds0; k++)
5548 : {
5549 0 : memcpy(utlbuf, nameptr0[k], namelen0[k]);
5550 0 : utlbuf[namelen[k]] = 0;
5551 0 : statusFill = GDgetfillvalue(gridID, utlbuf, fillval);
5552 :
5553 0 : if (statusFill == 0)
5554 : {
5555 0 : if (cmbfldcnt > 0)
5556 : {
5557 0 : dims[0] = indvdims[k];
5558 0 : truerank = (dims[0] == 1) ? 2 : 3;
5559 0 : EHfillfld(sdid, rank, truerank,
5560 0 : DFKNTsize(match[4]), offset[k],
5561 : dims, fillval);
5562 : }
5563 : else
5564 : {
5565 0 : status = SDsetfillvalue(sdid, fillval);
5566 : }
5567 : }
5568 : }
5569 :
5570 :
5571 0 : vgid = GDXGrid[gID].VIDTable[0];
5572 0 : Vaddtagref(vgid, DFTAG_NDG, SDidtoref(sdid));
5573 0 : SDendaccess(sdid);
5574 :
5575 0 : free(nambuf);
5576 0 : free(utlbuf);
5577 :
5578 : }
5579 : }
5580 :
5581 :
5582 0 : for (i = 0; i < nflds; i++)
5583 : {
5584 0 : if (GDXSDcomb[5 * i + 3] == GDXGrid[gID].IDTable)
5585 : {
5586 0 : if (i == (nflds - 1))
5587 : {
5588 0 : GDXSDcomb[5 * i] = 0;
5589 0 : *(nameptr[i] - (nflds != 1)) = 0;
5590 0 : *(dimptr[i] - (nflds != 1)) = 0;
5591 : }
5592 : else
5593 : {
5594 : /* memcpy(&GDXSDcomb[5 * i],
5595 : &GDXSDcomb[5 * (i + 1)],
5596 : (512 - i - 1) * 5 * 4);*/
5597 0 : memmove(&GDXSDcomb[5 * i],
5598 0 : &GDXSDcomb[5 * (i + 1)],
5599 0 : (512 - i - 1) * 5 * 4);
5600 : /* memcpy(nameptr[i],
5601 : nameptr[i + 1],
5602 : nameptr[0] + 2048 - nameptr[i + 1] - 1);*/
5603 0 : memmove(nameptr[i],
5604 0 : nameptr[i + 1],
5605 0 : nameptr[0] + 2048 - nameptr[i + 1] - 1);
5606 : /* memcpy(dimptr[i],
5607 : dimptr[i + 1],
5608 : dimptr[0] + 2048 * 2 - dimptr[i + 1] - 1);*/
5609 0 : memmove(dimptr[i],
5610 0 : dimptr[i + 1],
5611 0 : dimptr[0] + 2048 * 2 - dimptr[i + 1] - 1);
5612 : }
5613 :
5614 0 : i--;
5615 0 : nflds = EHparsestr(GDXSDname, ',', nameptr, namelen);
5616 0 : nflds = EHparsestr(GDXSDdims, ';', dimptr, dimlen);
5617 : }
5618 : }
5619 :
5620 0 : if (nflds != 0)
5621 : {
5622 0 : strcat(GDXSDname, ",");
5623 0 : strcat(GDXSDdims, ";");
5624 : }
5625 :
5626 :
5627 :
5628 : /* Free up a bunch of dynamically allocated arrays */
5629 : /* ----------------------------------------------- */
5630 0 : free(nameptr);
5631 0 : free(namelen);
5632 0 : free(nameptr0);
5633 0 : free(namelen0);
5634 0 : free(dimptr);
5635 0 : free(dimlen);
5636 0 : free(offset);
5637 0 : free(indvdims);
5638 :
5639 :
5640 :
5641 : /* "Detach" from previously attached SDSs */
5642 : /* -------------------------------------- */
5643 0 : for (k = 0; k < GDXGrid[gID].nSDS; k++)
5644 : {
5645 0 : SDendaccess(GDXGrid[gID].sdsID[k]);
5646 : }
5647 0 : free(GDXGrid[gID].sdsID);
5648 0 : GDXGrid[gID].sdsID = 0;
5649 0 : GDXGrid[gID].nSDS = 0;
5650 :
5651 :
5652 :
5653 : /* Detach Grid Vgroups */
5654 : /* ------------------- */
5655 0 : Vdetach(GDXGrid[gID].VIDTable[0]);
5656 0 : Vdetach(GDXGrid[gID].VIDTable[1]);
5657 0 : Vdetach(GDXGrid[gID].IDTable);
5658 :
5659 0 : GDXGrid[gID].active = 0;
5660 0 : GDXGrid[gID].VIDTable[0] = 0;
5661 0 : GDXGrid[gID].VIDTable[1] = 0;
5662 0 : GDXGrid[gID].IDTable = 0;
5663 0 : GDXGrid[gID].fid = 0;
5664 :
5665 :
5666 :
5667 :
5668 : /* Free Region Pointers */
5669 : /* -------------------- */
5670 0 : for (k = 0; k < NGRIDREGN; k++)
5671 : {
5672 0 : if (GDXRegion[k] != 0 &&
5673 0 : GDXRegion[k]->gridID == gridID)
5674 : {
5675 0 : for (i = 0; i < 8; i++)
5676 : {
5677 0 : if (GDXRegion[k]->DimNamePtr[i] != 0)
5678 : {
5679 0 : free(GDXRegion[k]->DimNamePtr[i]);
5680 0 : GDXRegion[k]->DimNamePtr[i] = 0;
5681 : }
5682 : }
5683 :
5684 0 : free(GDXRegion[k]);
5685 0 : GDXRegion[k] = 0;
5686 : }
5687 : }
5688 : }
5689 0 : return (status);
5690 : }
5691 :
5692 :
5693 : /*----------------------------------------------------------------------------|
5694 : | BEGIN_PROLOG |
5695 : | |
5696 : | FUNCTION: GDclose |
5697 : | |
5698 : | DESCRIPTION: Closes file. |
5699 : | |
5700 : | |
5701 : | Return Value Type Units Description |
5702 : | ============ ====== ========= ===================================== |
5703 : | status intn return status (0) SUCCEED, (-1) FAIL |
5704 : | |
5705 : | INPUTS: |
5706 : | fid int32 File ID |
5707 : | |
5708 : | |
5709 : | OUTPUTS: |
5710 : | None |
5711 : | |
5712 : | NOTES: |
5713 : | |
5714 : | |
5715 : | Date Programmer Description |
5716 : | ====== ============ ================================================= |
5717 : | Jun 96 Joel Gales Original Programmer |
5718 : | |
5719 : | END_PROLOG |
5720 : -----------------------------------------------------------------------------*/
5721 : intn
5722 4 : GDclose(int32 fid)
5723 :
5724 : {
5725 4 : intn status = 0; /* routine return status variable */
5726 :
5727 : /* Call EHclose to perform file close */
5728 : /* ---------------------------------- */
5729 4 : status = EHclose(fid);
5730 :
5731 4 : return (status);
5732 : }
5733 :
5734 :
5735 : /*----------------------------------------------------------------------------|
5736 : | BEGIN_PROLOG |
5737 : | |
5738 : | FUNCTION: GDgetdefaults |
5739 : | |
5740 : | DESCRIPTION: |
5741 : | |
5742 : | |
5743 : | Return Value Type Units Description |
5744 : | ============ ====== ========= ===================================== |
5745 : | status intn return status (0) SUCCEED, (-1) FAIL |
5746 : | |
5747 : | INPUTS: |
5748 : | projcode int32 GCTP projection code |
5749 : | zonecode int32 UTM zone code |
5750 : | projparm float64 Projection parameters |
5751 : | spherecode int32 GCTP spheriod code |
5752 : | upleftpt float64 upper left corner coordinates |
5753 : | lowrightpt float64 lower right corner coordinates |
5754 : | |
5755 : | |
5756 : | OUTPUTS: |
5757 : | upleftpt float64 upper left corner coordinates |
5758 : | lowrightpt float64 lower right corner coordinates |
5759 : | |
5760 : | NOTES: |
5761 : | |
5762 : | |
5763 : | Date Programmer Description |
5764 : | ====== ============ ================================================= |
5765 : | Aug 96 Joel Gales Original Programmer |
5766 : | Sep 96 Raj Gejjaga Fixed bugs in Polar Stereographic and Goode | | Homolosine default calculations. |
5767 : | Sep 96 Raj Gejjaga Added code to compute default boundary points |
5768 : | for Lambert Azimuthal Polar and Equatorial |
5769 : | projections. |
5770 : | Feb 97 Raj Gejjaga Added code to compute default boundary points |
5771 : | for Integerized Sinusoidal Grid. Added error |
5772 : | handling code. |
5773 : | Jun 00 Abe Taaheri Added support for EASE grid |
5774 : | |
5775 : | END_PROLOG |
5776 : -----------------------------------------------------------------------------*/
5777 : static intn
5778 0 : GDgetdefaults(int32 projcode, int32 zonecode, float64 projparm[],
5779 : int32 spherecode, float64 upleftpt[], float64 lowrightpt[])
5780 : {
5781 0 : int32 errorcode = 0, status = 0;
5782 : int32(*for_trans[100]) (double, double, double*, double*);
5783 :
5784 : float64 lon, lat, plat, x, y;
5785 : float64 plon, tlon, llon, rlon, pplon, LLon, LLat, RLon, RLat;
5786 :
5787 :
5788 : /* invoke GCTP initialization routine */
5789 : /* ---------------------------------- */
5790 0 : for_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
5791 : &errorcode, for_trans);
5792 :
5793 : /* Report error if any */
5794 : /* ------------------- */
5795 0 : if (errorcode != 0)
5796 : {
5797 0 : status = -1;
5798 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5799 0 : HEreport("GCTP Error: %d\n", errorcode);
5800 0 : return (status);
5801 : }
5802 :
5803 : /* Compute Default Boundary Points for EASE Grid */
5804 : /* Use Global coverage */
5805 : /* ------------------------------------------------------ */
5806 0 : if (projcode == GCTP_BCEA &&
5807 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
5808 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
5809 : {
5810 0 : upleftpt[0] = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LON, HDFE_DEG_DMS);
5811 0 : upleftpt[1] = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LAT, HDFE_DEG_DMS);
5812 0 : lowrightpt[0] = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LON, HDFE_DEG_DMS);
5813 0 : lowrightpt[1] = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LAT, HDFE_DEG_DMS);
5814 : }
5815 :
5816 : /* Compute Default Boundary Points for CEA */
5817 : /* --------------------------------------------*/
5818 0 : if (projcode == GCTP_CEA &&
5819 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
5820 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
5821 : {
5822 0 : LLon = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LON, HDFE_DEG_RAD);
5823 0 : LLat = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LAT, HDFE_DEG_RAD);
5824 0 : RLon = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LON, HDFE_DEG_RAD);
5825 0 : RLat = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LAT, HDFE_DEG_RAD);
5826 :
5827 0 : errorcode = for_trans[projcode] (LLon, LLat, &x, &y);
5828 0 : if (errorcode != 0)
5829 : {
5830 0 : status = -1;
5831 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5832 0 : HEreport("GCTP Error: %d\n", errorcode);
5833 0 : return (status);
5834 : }
5835 0 : upleftpt[0] = x;
5836 0 : upleftpt[1] = y;
5837 :
5838 0 : errorcode = for_trans[projcode] (RLon, RLat, &x, &y);
5839 0 : if (errorcode != 0)
5840 : {
5841 0 : status = -1;
5842 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5843 0 : HEreport("GCTP Error: %d\n", errorcode);
5844 0 : return (status);
5845 : }
5846 0 : lowrightpt[0] = x;
5847 0 : lowrightpt[1] = y;
5848 :
5849 : }
5850 :
5851 :
5852 : /* Compute Default Boundary Points for Polar Sterographic */
5853 : /* ------------------------------------------------------ */
5854 0 : if (projcode == GCTP_PS &&
5855 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
5856 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
5857 : {
5858 : /*
5859 : * Convert the longitude and latitude from the DMS to decimal degree
5860 : * format.
5861 : */
5862 0 : plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
5863 0 : plat = EHconvAng(projparm[5], HDFE_DMS_DEG);
5864 :
5865 : /*
5866 : * Compute the longitudes at 90, 180 and 270 degrees from the central
5867 : * longitude.
5868 : */
5869 :
5870 0 : if (plon <= 0.0)
5871 : {
5872 0 : tlon = 180.0 + plon;
5873 0 : pplon = plon + 360.0;
5874 : }
5875 : else
5876 : {
5877 0 : tlon = plon - 180.0;
5878 0 : pplon = plon;
5879 : }
5880 :
5881 0 : rlon = pplon + 90.0;
5882 0 : if (rlon > 360.0)
5883 0 : rlon = rlon - 360;
5884 :
5885 0 : if (rlon > 180.0)
5886 0 : rlon = rlon - 360.0;
5887 :
5888 0 : if (rlon <= 0.0)
5889 0 : llon = 180.0 + rlon;
5890 : else
5891 0 : llon = rlon - 180.0;
5892 :
5893 :
5894 : /* Convert all four longitudes from decimal degrees to radians */
5895 0 : plon = EHconvAng(plon, HDFE_DEG_RAD);
5896 0 : tlon = EHconvAng(tlon, HDFE_DEG_RAD);
5897 0 : llon = EHconvAng(llon, HDFE_DEG_RAD);
5898 0 : rlon = EHconvAng(rlon, HDFE_DEG_RAD);
5899 :
5900 0 : errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
5901 0 : if (errorcode != 0)
5902 : {
5903 0 : status = -1;
5904 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5905 0 : HEreport("GCTP Error: %d\n", errorcode);
5906 0 : return (status);
5907 : }
5908 :
5909 0 : upleftpt[0] = x;
5910 :
5911 0 : errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
5912 0 : if (errorcode != 0)
5913 : {
5914 0 : status = -1;
5915 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5916 0 : HEreport("GCTP Error: %d\n", errorcode);
5917 0 : return (status);
5918 : }
5919 :
5920 0 : lowrightpt[0] = x;
5921 :
5922 : /*
5923 : * Compute the upperleft and lowright y values based on the south or
5924 : * north polar projection
5925 : */
5926 :
5927 0 : if (plat < 0.0)
5928 : {
5929 0 : errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
5930 0 : if (errorcode != 0)
5931 : {
5932 0 : status = -1;
5933 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5934 0 : HEreport("GCTP Error: %d\n", errorcode);
5935 0 : return (status);
5936 : }
5937 :
5938 0 : upleftpt[1] = y;
5939 :
5940 0 : errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
5941 0 : if (errorcode != 0)
5942 : {
5943 0 : status = -1;
5944 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5945 0 : HEreport("GCTP Error: %d\n", errorcode);
5946 0 : return (status);
5947 : }
5948 :
5949 0 : lowrightpt[1] = y;
5950 :
5951 : }
5952 : else
5953 : {
5954 0 : errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
5955 0 : if (errorcode != 0)
5956 : {
5957 0 : status = -1;
5958 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5959 0 : HEreport("GCTP Error: %d\n", errorcode);
5960 0 : return (status);
5961 : }
5962 :
5963 0 : upleftpt[1] = y;
5964 :
5965 0 : errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
5966 0 : if (errorcode != 0)
5967 : {
5968 0 : status = -1;
5969 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5970 0 : HEreport("GCTP Error: %d\n", errorcode);
5971 0 : return (status);
5972 : }
5973 :
5974 0 : lowrightpt[1] = y;
5975 :
5976 : }
5977 : }
5978 :
5979 :
5980 : /* Compute Default Boundary Points for Goode Homolosine */
5981 : /* ---------------------------------------------------- */
5982 0 : if (projcode == GCTP_GOOD &&
5983 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
5984 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
5985 : {
5986 0 : lon = EHconvAng(-180, HDFE_DEG_RAD);
5987 0 : lat = 0.0;
5988 :
5989 0 : errorcode = for_trans[projcode] (lon, lat, &x, &y);
5990 0 : if (errorcode != 0)
5991 : {
5992 0 : status = -1;
5993 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
5994 0 : HEreport("GCTP Error: %d\n", errorcode);
5995 0 : return (status);
5996 : }
5997 :
5998 0 : upleftpt[0] = -fabs(x);
5999 0 : lowrightpt[0] = +fabs(x);
6000 :
6001 0 : lat = EHconvAng(90, HDFE_DEG_RAD);
6002 :
6003 0 : errorcode = for_trans[projcode] (lon, lat, &x, &y);
6004 0 : if (errorcode != 0)
6005 : {
6006 0 : status = -1;
6007 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6008 0 : HEreport("GCTP Error: %d\n", errorcode);
6009 0 : return (status);
6010 : }
6011 :
6012 0 : upleftpt[1] = +fabs(y);
6013 0 : lowrightpt[1] = -fabs(y);
6014 : }
6015 :
6016 : /* Compute Default Boundary Points for Lambert Azimuthal */
6017 : /* ----------------------------------------------------- */
6018 0 : if (projcode == GCTP_LAMAZ &&
6019 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
6020 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
6021 : {
6022 : /*
6023 : * Convert the longitude and latitude from the DMS to decimal degree
6024 : * format.
6025 : */
6026 0 : plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
6027 0 : plat = EHconvAng(projparm[5], HDFE_DMS_DEG);
6028 :
6029 : /*
6030 : * Compute the longitudes at 90, 180 and 270 degrees from the central
6031 : * longitude.
6032 : */
6033 :
6034 0 : if (plon <= 0.0)
6035 : {
6036 0 : tlon = 180.0 + plon;
6037 0 : pplon = plon + 360.0;
6038 : }
6039 : else
6040 : {
6041 0 : tlon = plon - 180.0;
6042 0 : pplon = plon;
6043 : }
6044 :
6045 0 : rlon = pplon + 90.0;
6046 0 : if (rlon > 360.0)
6047 0 : rlon = rlon - 360;
6048 :
6049 0 : if (rlon > 180.0)
6050 0 : rlon = rlon - 360.0;
6051 :
6052 0 : if (rlon <= 0.0)
6053 0 : llon = 180.0 + rlon;
6054 : else
6055 0 : llon = rlon - 180.0;
6056 :
6057 : /* Convert all four longitudes from decimal degrees to radians */
6058 0 : plon = EHconvAng(plon, HDFE_DEG_RAD);
6059 0 : tlon = EHconvAng(tlon, HDFE_DEG_RAD);
6060 0 : llon = EHconvAng(llon, HDFE_DEG_RAD);
6061 0 : rlon = EHconvAng(rlon, HDFE_DEG_RAD);
6062 :
6063 0 : errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
6064 0 : if (errorcode != 0)
6065 : {
6066 0 : status = -1;
6067 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6068 0 : HEreport("GCTP Error: %d\n", errorcode);
6069 0 : return (status);
6070 : }
6071 :
6072 0 : upleftpt[0] = x;
6073 :
6074 0 : errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
6075 0 : if (errorcode != 0)
6076 : {
6077 0 : status = -1;
6078 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6079 0 : HEreport("GCTP Error: %d\n", errorcode);
6080 0 : return (status);
6081 : }
6082 :
6083 0 : lowrightpt[0] = x;
6084 :
6085 : /*
6086 : * Compute upperleft and lowerright values based on whether the
6087 : * projection is south polar, north polar or equatorial
6088 : */
6089 :
6090 0 : if (plat == -90.0)
6091 : {
6092 0 : errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
6093 0 : if (errorcode != 0)
6094 : {
6095 0 : status = -1;
6096 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6097 0 : HEreport("GCTP Error: %d\n", errorcode);
6098 0 : return (status);
6099 : }
6100 :
6101 0 : upleftpt[1] = y;
6102 :
6103 0 : errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
6104 0 : if (errorcode != 0)
6105 : {
6106 0 : status = -1;
6107 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6108 0 : HEreport("GCTP Error: %d\n", errorcode);
6109 0 : return (status);
6110 : }
6111 :
6112 0 : lowrightpt[1] = y;
6113 : }
6114 0 : else if (plat == 90.0)
6115 : {
6116 0 : errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
6117 0 : if (errorcode != 0)
6118 : {
6119 0 : status = -1;
6120 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6121 0 : HEreport("GCTP Error: %d\n", errorcode);
6122 0 : return (status);
6123 : }
6124 :
6125 0 : upleftpt[1] = y;
6126 :
6127 0 : errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
6128 0 : if (errorcode != 0)
6129 : {
6130 0 : status = -1;
6131 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6132 0 : HEreport("GCTP Error: %d\n", errorcode);
6133 0 : return (status);
6134 : }
6135 :
6136 0 : lowrightpt[1] = y;
6137 : }
6138 : else
6139 : {
6140 0 : lat = EHconvAng(90, HDFE_DEG_RAD);
6141 0 : errorcode = for_trans[projcode] (plon, lat, &x, &y);
6142 0 : if (errorcode != 0)
6143 : {
6144 0 : status = -1;
6145 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6146 0 : HEreport("GCTP Error: %d\n", errorcode);
6147 0 : return (status);
6148 : }
6149 :
6150 0 : upleftpt[1] = y;
6151 :
6152 0 : lat = EHconvAng(-90, HDFE_DEG_RAD);
6153 0 : errorcode = for_trans[projcode] (plon, lat, &x, &y);
6154 0 : if (errorcode != 0)
6155 : {
6156 0 : status = -1;
6157 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6158 0 : HEreport("GCTP Error: %d\n", errorcode);
6159 0 : return (status);
6160 : }
6161 :
6162 0 : lowrightpt[1] = y;
6163 : }
6164 : }
6165 :
6166 : /* Compute Default Boundary Points for Integerized Sinusoidal Grid */
6167 : /* --------------------------------------------------------------- */
6168 0 : if (((projcode == GCTP_ISINUS) || (projcode == GCTP_ISINUS1)) &&
6169 0 : upleftpt[0] == 0 && upleftpt[1] == 0 &&
6170 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
6171 : {
6172 : /*
6173 : * Convert the longitude and latitude from the DMS to decimal degree
6174 : * format.
6175 : */
6176 0 : plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
6177 : /*plat = EHconvAng(projparm[5], HDFE_DMS_DEG); */
6178 :
6179 : /*
6180 : * Compute the longitudes at 90, 180 and 270 degrees from the central
6181 : * longitude.
6182 : */
6183 :
6184 0 : if (plon <= 0.0)
6185 : {
6186 0 : tlon = 180.0 + plon;
6187 0 : pplon = plon + 360.0;
6188 : }
6189 : else
6190 : {
6191 0 : tlon = plon - 180.0;
6192 0 : pplon = plon;
6193 : }
6194 :
6195 0 : rlon = pplon + 90.0;
6196 0 : if (rlon > 360.0)
6197 0 : rlon = rlon - 360;
6198 :
6199 0 : if (rlon > 180.0)
6200 0 : rlon = rlon - 360.0;
6201 :
6202 0 : if (rlon <= 0.0)
6203 0 : llon = 180.0 + rlon;
6204 : else
6205 0 : llon = rlon - 180.0;
6206 :
6207 : /* Convert all four longitudes from decimal degrees to radians */
6208 0 : plon = EHconvAng(plon, HDFE_DEG_RAD);
6209 0 : tlon = EHconvAng(tlon, HDFE_DEG_RAD);
6210 0 : llon = EHconvAng(llon, HDFE_DEG_RAD);
6211 0 : rlon = EHconvAng(rlon, HDFE_DEG_RAD);
6212 :
6213 0 : errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
6214 0 : if (errorcode != 0)
6215 : {
6216 0 : status = -1;
6217 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6218 0 : HEreport("GCTP Error: %d\n", errorcode);
6219 0 : return (status);
6220 : }
6221 :
6222 0 : upleftpt[0] = x;
6223 :
6224 0 : errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
6225 0 : if (errorcode != 0)
6226 : {
6227 0 : status = -1;
6228 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6229 0 : HEreport("GCTP Error: %d\n", errorcode);
6230 0 : return (status);
6231 : }
6232 :
6233 0 : lowrightpt[0] = x;
6234 :
6235 0 : lat = EHconvAng(90, HDFE_DEG_RAD);
6236 0 : errorcode = for_trans[projcode] (plon, lat, &x, &y);
6237 0 : if (errorcode != 0)
6238 : {
6239 0 : status = -1;
6240 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6241 0 : HEreport("GCTP Error: %d\n", errorcode);
6242 0 : return (status);
6243 : }
6244 :
6245 0 : upleftpt[1] = y;
6246 :
6247 0 : lat = EHconvAng(-90, HDFE_DEG_RAD);
6248 0 : errorcode = for_trans[projcode] (plon, lat, &x, &y);
6249 0 : if (errorcode != 0)
6250 : {
6251 0 : status = -1;
6252 0 : HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
6253 0 : HEreport("GCTP Error: %d\n", errorcode);
6254 0 : return (status);
6255 : }
6256 :
6257 0 : lowrightpt[1] = y;
6258 : }
6259 0 : return (errorcode);
6260 : }
6261 :
6262 : /*----------------------------------------------------------------------------|
6263 : | BEGIN_PROLOG |
6264 : | |
6265 : | FUNCTION: GDll2ij |
6266 : | |
6267 : | DESCRIPTION: |
6268 : | |
6269 : | |
6270 : | Return Value Type Units Description |
6271 : | ============ ====== ========= ===================================== |
6272 : | status intn return status (0) SUCCEED, (-1) FAIL |
6273 : | |
6274 : | INPUTS: |
6275 : | projcode int32 GCTP projection code |
6276 : | zonecode int32 UTM zone code |
6277 : | projparm float64 Projection parameters |
6278 : | spherecode int32 GCTP spheriod code |
6279 : | xdimsize int32 xdimsize from GDcreate |
6280 : | ydimsize int32 ydimsize from GDcreate |
6281 : | upleftpt float64 upper left corner coordinates |
6282 : | lowrightpt float64 lower right corner coordinates |
6283 : | npnts int32 number of lon-lat points |
6284 : | longitude float64 longitude array (radians) |
6285 : | latitude float64 latitude array (radians) |
6286 : | |
6287 : | OUTPUTS: |
6288 : | row int32 Row array |
6289 : | col int32 Column array |
6290 : | xval float64 X value array |
6291 : | yval float64 Y value array |
6292 : | |
6293 : | |
6294 : | NOTES: |
6295 : | |
6296 : | |
6297 : | Date Programmer Description |
6298 : | ====== ============ ================================================= |
6299 : | Jun 96 Joel Gales Original Programmer |
6300 : | Aug 96 Joel Gales Return x and y values if requested |
6301 : | Jun 00 Abe Taaheri Added support for EASE grid |
6302 : | |
6303 : | END_PROLOG |
6304 : -----------------------------------------------------------------------------*/
6305 : static intn
6306 0 : GDll2ij(int32 projcode, int32 zonecode, float64 projparm[],
6307 : int32 spherecode, int32 xdimsize, int32 ydimsize,
6308 : float64 upleftpt[], float64 lowrightpt[],
6309 : int32 npnts, float64 longitude[], float64 latitude[],
6310 : int32 row[], int32 col[], float64 xval[], float64 yval[])
6311 :
6312 :
6313 : {
6314 : intn i; /* Loop index */
6315 0 : intn status = 0; /* routine return status variable */
6316 :
6317 0 : int32 errorcode = 0; /* GCTP error code */
6318 : int32(*for_trans[100]) (double, double, double*, double*); /* GCTP function pointer */
6319 :
6320 : float64 xVal; /* Scaled x distance */
6321 : float64 yVal; /* Scaled y distance */
6322 : float64 xMtr; /* X value in meters from GCTP */
6323 : float64 yMtr; /* Y value in meters from GCTP */
6324 : float64 lonrad0; /* Longitude in radians of upleft point */
6325 0 : float64 latrad0 = 0; /* Latitude in radians of upleft point */
6326 : float64 lonrad; /* Longitude in radians of point */
6327 : float64 latrad; /* Latitude in radians of point */
6328 : float64 scaleX; /* X scale factor */
6329 : float64 scaleY; /* Y scale factor */
6330 0 : float64 xMtr0 = 0, xMtr1, yMtr0 = 0, yMtr1;
6331 : float64 lonrad1; /* Longitude in radians of lowright point */
6332 :
6333 : /* If projection not GEO call GCTP initialization routine */
6334 : /* ------------------------------------------------------ */
6335 0 : if (projcode != GCTP_GEO)
6336 : {
6337 0 : for_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
6338 : &errorcode, for_trans);
6339 :
6340 : /* Report error if any */
6341 : /* ------------------- */
6342 0 : if (errorcode != 0)
6343 : {
6344 0 : status = -1;
6345 0 : HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
6346 0 : HEreport("GCTP Error: %d\n", errorcode);
6347 : }
6348 : }
6349 :
6350 :
6351 0 : if (status == 0)
6352 : {
6353 : /* GEO projection */
6354 : /* -------------- */
6355 0 : if (projcode == GCTP_GEO)
6356 : {
6357 : /* Convert upleft and lowright X coords from DMS to radians */
6358 : /* -------------------------------------------------------- */
6359 0 : lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
6360 0 : lonrad = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
6361 :
6362 : /* Compute x scale factor */
6363 : /* ---------------------- */
6364 0 : scaleX = (lonrad - lonrad0) / xdimsize;
6365 :
6366 :
6367 : /* Convert upleft and lowright Y coords from DMS to radians */
6368 : /* -------------------------------------------------------- */
6369 0 : latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
6370 0 : latrad = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
6371 :
6372 :
6373 : /* Compute y scale factor */
6374 : /* ---------------------- */
6375 0 : scaleY = (latrad - latrad0) / ydimsize;
6376 : }
6377 :
6378 : /* BCEA projection */
6379 : /* -------------- */
6380 0 : else if ( projcode == GCTP_BCEA)
6381 : {
6382 : /* Convert upleft and lowright X coords from DMS to radians */
6383 : /* -------------------------------------------------------- */
6384 :
6385 0 : lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
6386 0 : lonrad = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
6387 :
6388 : /* Convert upleft and lowright Y coords from DMS to radians */
6389 : /* -------------------------------------------------------- */
6390 0 : latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
6391 0 : latrad = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
6392 :
6393 : /* Convert from lon/lat to meters(or whatever unit is, i.e unit
6394 : of r_major and r_minor) using GCTP */
6395 : /* ----------------------------------------- */
6396 0 : errorcode = for_trans[projcode] (lonrad0, latrad0, &xMtr0, &yMtr0);
6397 :
6398 :
6399 : /* Report error if any */
6400 : /* ------------------- */
6401 0 : if (errorcode != 0)
6402 : {
6403 0 : status = -1;
6404 0 : HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
6405 0 : HEreport("GCTP Error: %d\n", errorcode);
6406 0 : return (status);
6407 : }
6408 :
6409 : /* Convert from lon/lat to meters(or whatever unit is, i.e unit
6410 : of r_major and r_minor) using GCTP */
6411 : /* ----------------------------------------- */
6412 0 : errorcode = for_trans[projcode] (lonrad, latrad, &xMtr1, &yMtr1);
6413 :
6414 :
6415 : /* Report error if any */
6416 : /* ------------------- */
6417 0 : if (errorcode != 0)
6418 : {
6419 0 : status = -1;
6420 0 : HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
6421 0 : HEreport("GCTP Error: %d\n", errorcode);
6422 0 : return (status);
6423 : }
6424 :
6425 : /* Compute x scale factor */
6426 : /* ---------------------- */
6427 0 : scaleX = (xMtr1 - xMtr0) / xdimsize;
6428 :
6429 : /* Compute y scale factor */
6430 : /* ---------------------- */
6431 0 : scaleY = (yMtr1 - yMtr0) / ydimsize;
6432 : }
6433 : else
6434 : {
6435 : /* Non-GEO, Non_BCEA projections */
6436 : /* ---------------------------- */
6437 :
6438 : /* Compute x & y scale factors */
6439 : /* --------------------------- */
6440 0 : scaleX = (lowrightpt[0] - upleftpt[0]) / xdimsize;
6441 0 : scaleY = (lowrightpt[1] - upleftpt[1]) / ydimsize;
6442 : }
6443 :
6444 :
6445 :
6446 : /* Loop through all points */
6447 : /* ----------------------- */
6448 0 : for (i = 0; i < npnts; i++)
6449 : {
6450 : /* Convert lon & lat from decimal degrees to radians */
6451 : /* ------------------------------------------------- */
6452 0 : lonrad = EHconvAng(longitude[i], HDFE_DEG_RAD);
6453 0 : latrad = EHconvAng(latitude[i], HDFE_DEG_RAD);
6454 :
6455 :
6456 : /* GEO projection */
6457 : /* -------------- */
6458 0 : if (projcode == GCTP_GEO)
6459 : {
6460 : /* allow map to span dateline */
6461 0 : lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
6462 0 : lonrad1 = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
6463 : /* if time-line is passed */
6464 0 : if(lonrad < lonrad1)
6465 : {
6466 0 : if (lonrad < lonrad0) lonrad += 2.0 * M_PI;
6467 0 : if (lonrad > lonrad1) lonrad -= 2.0 * M_PI;
6468 : }
6469 :
6470 : /* Compute scaled distance to point from origin */
6471 : /* -------------------------------------------- */
6472 0 : xVal = (lonrad - lonrad0) / scaleX;
6473 0 : yVal = (latrad - latrad0) / scaleY;
6474 : }
6475 : else
6476 : {
6477 : /* Convert from lon/lat to meters using GCTP */
6478 : /* ----------------------------------------- */
6479 0 : errorcode = for_trans[projcode] (lonrad, latrad, &xMtr, &yMtr);
6480 :
6481 :
6482 : /* Report error if any */
6483 : /* ------------------- */
6484 0 : if (errorcode != 0)
6485 : {
6486 : /*status = -1;
6487 : HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
6488 : HEreport("GCTP Error: %d\n", errorcode);
6489 : return (status); */ /* Bruce Beaumont */
6490 0 : xVal = -2147483648.0; /* Bruce Beaumont */
6491 0 : yVal = -2147483648.0; /* Bruce Beaumont */
6492 : }/* (Note: MAXLONG is defined as 2147483647.0 in
6493 : function cproj.c of GCTP) */
6494 : else {
6495 : /* if projection is BCEA normalize x and y by cell size and
6496 : measure it from the upperleft corner of the grid */
6497 :
6498 : /* Compute scaled distance to point from origin */
6499 : /* -------------------------------------------- */
6500 0 : if( projcode == GCTP_BCEA)
6501 : {
6502 0 : xVal = (xMtr - xMtr0) / scaleX;
6503 0 : yVal = (yMtr - yMtr0) / scaleY;
6504 : }
6505 : else
6506 : {
6507 0 : xVal = (xMtr - upleftpt[0]) / scaleX;
6508 0 : yVal = (yMtr - upleftpt[1]) / scaleY;
6509 : }
6510 : }
6511 : }
6512 :
6513 :
6514 : /* Compute row and col from scaled distance */
6515 : /* ---------------------------------------- */
6516 0 : col[i] = (int32) xVal;
6517 0 : row[i] = (int32) yVal;
6518 :
6519 : /* Store scaled distances if requested */
6520 : /* ----------------------------------- */
6521 0 : if (xval != NULL)
6522 : {
6523 0 : xval[i] = xVal;
6524 : }
6525 :
6526 0 : if (yval != NULL)
6527 : {
6528 0 : yval[i] = yVal;
6529 : }
6530 : }
6531 : }
6532 0 : return (status);
6533 : }
6534 :
6535 :
6536 :
6537 :
6538 : /*----------------------------------------------------------------------------|
6539 : | BEGIN_PROLOG |
6540 : | |
6541 : | FUNCTION: GDrs2ll |
6542 : | |
6543 : | DESCRIPTION: Converts EASE grid's (r,s) coordinates to longitude and |
6544 : | latitude (in decimal degrees). |
6545 : | |
6546 : | |
6547 : | Return Value Type Units Description |
6548 : | ============ ====== ========= ===================================== |
6549 : | status intn return status (0) SUCCEED, (-1) FAIL |
6550 : | |
6551 : | INPUTS: |
6552 : | projcode int32 GCTP projection code |
6553 : | projparm float64 Projection parameters |
6554 : | xdimsize int32 xdimsize from GDcreate |
6555 : | ydimsize int32 ydimsize from GDcreate |
6556 : | pixcen int32 pixel center code |
6557 : | npnts int32 number of lon-lat points |
6558 : | s int32 s coordinate |
6559 : | r int32 r coordinate |
6560 : | pixcen int32 Code from GDpixreginfo |
6561 : | pixcnr int32 Code from GDorigininfo |
6562 : | upleft float64 upper left corner coordinates (DMS) |
6563 : | lowright float64 lower right corner coordinates (DMS) |
6564 : | |
6565 : | |
6566 : | OUTPUTS: |
6567 : | longitude float64 longitude array (decimal degrees) |
6568 : | latitude float64 latitude array (decimal degrees) |
6569 : | |
6570 : | NOTES: |
6571 : | |
6572 : | |
6573 : | Date Programmer Description |
6574 : | ====== ============ ================================================= |
6575 : | Jul 00 Abe Taaheri Original Programmer |
6576 : | |
6577 : | END_PROLOG |
6578 : -----------------------------------------------------------------------------*/
6579 : intn
6580 0 : GDrs2ll(int32 projcode, float64 projparm[],
6581 : int32 xdimsize, int32 ydimsize,
6582 : float64 upleft[], float64 lowright[],
6583 : int32 npnts, float64 r[], float64 s[],
6584 : float64 longitude[], float64 latitude[], int32 pixcen, int32 pixcnr)
6585 : {
6586 : intn i; /* Loop index */
6587 0 : intn status = 0; /* routine return status variable */
6588 :
6589 0 : int32 errorcode = 0; /* GCTP error code */
6590 : int32(*inv_trans[100]) (double, double, double*, double*); /* GCTP function pointer */
6591 :
6592 0 : float64 pixadjX = 0.0; /* Pixel adjustment (x) */
6593 0 : float64 pixadjY = 0.0; /* Pixel adjustment (y) */
6594 : float64 lonrad; /* Longitude in radians of point */
6595 : float64 latrad; /* Latitude in radians of point */
6596 : float64 xMtr; /* X value in meters from GCTP */
6597 : float64 yMtr; /* Y value in meters from GCTP */
6598 : float64 epsilon;
6599 : float64 beta;
6600 0 : float64 qp_cea = 0;
6601 0 : float64 kz_cea = 0;
6602 : float64 eccen, eccen_sq;
6603 : float64 phi1, sinphi1, cosphi1;
6604 : float64 scaleX, scaleY;
6605 :
6606 0 : int32 zonecode=0;
6607 :
6608 0 : int32 spherecode=0;
6609 : float64 lon[2],lat[2];
6610 : float64 xcor[2], ycor[2];
6611 : int32 nlatlon;
6612 :
6613 : /* If projection is BCEA define scale, r0 and s0 */
6614 0 : if (projcode == GCTP_BCEA)
6615 : {
6616 0 : eccen_sq = 1.0 - SQUARE(projparm[1]/projparm[0]);
6617 0 : eccen = sqrt(eccen_sq);
6618 0 : if(eccen < 0.00001)
6619 : {
6620 0 : qp_cea = 2.0;
6621 : }
6622 : else
6623 : {
6624 0 : qp_cea =
6625 0 : (1.0 - eccen_sq)*((1.0/(1.0 - eccen_sq))-(1.0/(2.0*eccen))*
6626 0 : log((1.0 - eccen)/(1.0 + eccen)));
6627 : }
6628 0 : phi1 = EHconvAng(projparm[5],HDFE_DMS_RAD);
6629 0 : cosphi1 = cos(phi1);
6630 0 : sinphi1 = sin(phi1);
6631 0 : kz_cea = cosphi1/(sqrt(1.0 - (eccen_sq*sinphi1*sinphi1)));
6632 : }
6633 :
6634 :
6635 :
6636 :
6637 : /* Compute adjustment of position within pixel */
6638 : /* ------------------------------------------- */
6639 0 : if (pixcen == HDFE_CENTER)
6640 : {
6641 : /* Pixel defined at center */
6642 : /* ----------------------- */
6643 0 : pixadjX = 0.5;
6644 0 : pixadjY = 0.5;
6645 : }
6646 : else
6647 : {
6648 0 : switch (pixcnr)
6649 : {
6650 0 : case HDFE_GD_UL:
6651 : {
6652 : /* Pixel defined at upper left corner */
6653 : /* ---------------------------------- */
6654 0 : pixadjX = 0.0;
6655 0 : pixadjY = 0.0;
6656 0 : break;
6657 : }
6658 :
6659 0 : case HDFE_GD_UR:
6660 : {
6661 : /* Pixel defined at upper right corner */
6662 : /* ----------------------------------- */
6663 0 : pixadjX = 1.0;
6664 0 : pixadjY = 0.0;
6665 0 : break;
6666 : }
6667 :
6668 0 : case HDFE_GD_LL:
6669 : {
6670 : /* Pixel defined at lower left corner */
6671 : /* ---------------------------------- */
6672 0 : pixadjX = 0.0;
6673 0 : pixadjY = 1.0;
6674 0 : break;
6675 : }
6676 :
6677 0 : case HDFE_GD_LR:
6678 : {
6679 : /* Pixel defined at lower right corner */
6680 : /* ----------------------------------- */
6681 0 : pixadjX = 1.0;
6682 0 : pixadjY = 1.0;
6683 0 : break;
6684 : }
6685 :
6686 : }
6687 0 : }
6688 :
6689 : /* If projection is BCEA call GCTP initialization routine */
6690 : /* ------------------------------------------------------ */
6691 0 : if (projcode == GCTP_BCEA)
6692 : {
6693 :
6694 0 : inv_init(projcode, 0, projparm, 0, NULL, NULL,
6695 : &errorcode, inv_trans);
6696 :
6697 : /* Report error if any */
6698 : /* ------------------- */
6699 0 : if (errorcode != 0)
6700 : {
6701 0 : status = -1;
6702 0 : HEpush(DFE_GENAPP, "GDrs2ll", __FILE__, __LINE__);
6703 0 : HEreport("GCTP Error: %d\n", errorcode);
6704 : }
6705 : else
6706 : {
6707 : /* For each point ... */
6708 : /* ------------------ */
6709 0 : for (i = 0; i < npnts; i++)
6710 : {
6711 : /* Convert from EASE grid's (r,s) to lon/lat (radians)
6712 : using GCTP */
6713 : /* --------------------------------------------------- */
6714 0 : nlatlon = 2;
6715 0 : lon[0] = upleft[0];
6716 0 : lon[1] = lowright[0];
6717 0 : lat[0] = upleft[1];
6718 0 : lat[1] = lowright[1];
6719 : status =
6720 0 : GDll2mm_cea(projcode,zonecode,spherecode,projparm,
6721 : xdimsize, ydimsize,
6722 : upleft, lowright, nlatlon,
6723 : lon, lat,
6724 : xcor, ycor, &scaleX, &scaleY);
6725 :
6726 0 : if (status == -1)
6727 : {
6728 0 : HEpush(DFE_GENAPP, "GDrs2ll", __FILE__, __LINE__);
6729 0 : return (status);
6730 : }
6731 :
6732 0 : xMtr = (r[i]/ scaleX + pixadjX - 0.5)* scaleX;
6733 0 : yMtr = - (s[i]/fabs(scaleY) + pixadjY - 0.5)* fabs(scaleY);
6734 :
6735 :
6736 : /* allow .5 cell tolerance in arcsin function
6737 : (used in bceainv function) so that grid
6738 : coordinates which are less than .5 cells
6739 : above 90.00N or below 90.00S are given lat of 90.00
6740 : */
6741 :
6742 0 : epsilon = 1 + 0.5 * (fabs(scaleY)/projparm[0]);
6743 0 : beta = 2.0 * (yMtr - projparm[7]) * kz_cea/(projparm[0] * qp_cea);
6744 :
6745 0 : if( fabs (beta) > epsilon)
6746 : {
6747 0 : status = -1;
6748 0 : HEpush(DFE_GENAPP, "GDrs2ll", __FILE__, __LINE__);
6749 0 : HEreport("GCTP Error: %s %s %s\n", "grid coordinates",
6750 : "are more than .5 cells",
6751 : "above 90.00N or below 90.00S. ");
6752 0 : return (status);
6753 : }
6754 0 : else if( beta <= -1)
6755 : {
6756 0 : errorcode = inv_trans[projcode] (xMtr, 0.0,
6757 : &lonrad, &latrad);
6758 0 : latrad = - M_PI/2;
6759 : }
6760 0 : else if( beta >= 1)
6761 : {
6762 0 : errorcode = inv_trans[projcode] (xMtr, 0.0,
6763 : &lonrad, &latrad);
6764 0 : latrad = M_PI/2;
6765 : }
6766 : else
6767 : {
6768 0 : errorcode = inv_trans[projcode] (xMtr, yMtr,
6769 : &lonrad, &latrad);
6770 : }
6771 :
6772 : /* Report error if any */
6773 : /* ------------------- */
6774 0 : if (errorcode != 0)
6775 : {
6776 0 : status = -1;
6777 0 : HEpush(DFE_GENAPP, "GDrs2ll", __FILE__, __LINE__);
6778 0 : HEreport("GCTP Error: %d\n", errorcode);
6779 0 : return (status);
6780 : }
6781 :
6782 : /* Convert from radians to decimal degrees */
6783 : /* --------------------------------------- */
6784 0 : longitude[i] = EHconvAng(lonrad, HDFE_RAD_DEG);
6785 0 : latitude[i] = EHconvAng(latrad, HDFE_RAD_DEG);
6786 : }
6787 : }
6788 : }
6789 :
6790 :
6791 :
6792 :
6793 0 : return (status);
6794 : }
6795 :
6796 :
6797 :
6798 : /*----------------------------------------------------------------------------|
6799 : | BEGIN_PROLOG |
6800 : | |
6801 : | FUNCTION: lamaxDxDtheta |
6802 : | |
6803 : | DESCRIPTION: Partial derivative along longitude line for Lambert Azimuthal |
6804 : | |
6805 : | |
6806 : | Return Value Type Units Description |
6807 : | ============ ====== ========= ===================================== |
6808 : | float64 Dx/D(theta) for LAMAZ projection |
6809 : | |
6810 : | INPUTS: |
6811 : | parms float64 Parameters defining partial derivative |
6812 : | |
6813 : | OUTPUTS: |
6814 : | None |
6815 : | |
6816 : | NOTES: |
6817 : | |
6818 : | |
6819 : | Date Programmer Description |
6820 : | ====== ============ ================================================= |
6821 : | Nov 96 Joel Gales Original Programmer |
6822 : | |
6823 : | END_PROLOG |
6824 : -----------------------------------------------------------------------------*/
6825 : static float64
6826 0 : lamazDxDtheta(float64 parms[])
6827 : {
6828 : float64 snTheta, sn2Theta, snTheta1, csTheta1, csLamda;
6829 :
6830 0 : snTheta = sin(EHconvAng(parms[0], HDFE_DEG_RAD));
6831 0 : sn2Theta = sin(2 * EHconvAng(parms[0], HDFE_DEG_RAD));
6832 0 : snTheta1 = sin(EHconvAng(parms[1], HDFE_DEG_RAD));
6833 0 : csTheta1 = cos(EHconvAng(parms[1], HDFE_DEG_RAD));
6834 0 : csLamda = cos(EHconvAng(parms[2], HDFE_DEG_RAD) -
6835 0 : EHconvAng(parms[3], HDFE_DEG_RAD));
6836 :
6837 0 : return (4 * snTheta +
6838 0 : (csTheta1 * csLamda * sn2Theta) +
6839 0 : (2 * snTheta1 * (1 + (snTheta * snTheta))));
6840 : }
6841 :
6842 :
6843 :
6844 :
6845 : /*----------------------------------------------------------------------------|
6846 : | BEGIN_PROLOG |
6847 : | |
6848 : | FUNCTION: lamaxDxDlamda |
6849 : | |
6850 : | DESCRIPTION: Partial derivative along latitude line for Lambert Azimuthal |
6851 : | |
6852 : | |
6853 : | Return Value Type Units Description |
6854 : | ============ ====== ========= ===================================== |
6855 : | float64 Dx/D(lamda) for LAMAZ projection |
6856 : | |
6857 : | INPUTS: |
6858 : | parms float64 Parameters defining partial derivative |
6859 : | |
6860 : | OUTPUTS: |
6861 : | None |
6862 : | |
6863 : | NOTES: |
6864 : | |
6865 : | |
6866 : | Date Programmer Description |
6867 : | ====== ============ ================================================= |
6868 : | Nov 96 Joel Gales Original Programmer |
6869 : | |
6870 : | END_PROLOG |
6871 : -----------------------------------------------------------------------------*/
6872 : static float64
6873 0 : lamazDxDlamda(float64 parms[])
6874 : {
6875 : float64 snTheta, csTheta, snTheta1, csTheta1, csLamda;
6876 : float64 cs, sn;
6877 :
6878 0 : snTheta = sin(EHconvAng(parms[2], HDFE_DEG_RAD));
6879 0 : csTheta = cos(EHconvAng(parms[2], HDFE_DEG_RAD));
6880 0 : snTheta1 = sin(EHconvAng(parms[1], HDFE_DEG_RAD));
6881 0 : csTheta1 = cos(EHconvAng(parms[1], HDFE_DEG_RAD));
6882 0 : csLamda = cos(EHconvAng(parms[0], HDFE_DEG_RAD) -
6883 0 : EHconvAng(parms[3], HDFE_DEG_RAD));
6884 :
6885 0 : cs = csTheta * csTheta1;
6886 0 : sn = snTheta * snTheta1;
6887 :
6888 0 : return (cs + (2 * (1 + sn) + (cs * csLamda)) * csLamda);
6889 : }
6890 :
6891 :
6892 :
6893 : /*----------------------------------------------------------------------------|
6894 : | BEGIN_PROLOG |
6895 : | |
6896 : | FUNCTION: lamaxDyDtheta |
6897 : | |
6898 : | DESCRIPTION: Partial derivative along longitude line for Lambert Azimuthal |
6899 : | |
6900 : | |
6901 : | Return Value Type Units Description |
6902 : | ============ ====== ========= ===================================== |
6903 : | float64 Dy/D(theta) for LAMAZ projection |
6904 : | |
6905 : | INPUTS: |
6906 : | parms float64 Parameters defining partial derivative |
6907 : | |
6908 : | OUTPUTS: |
6909 : | None |
6910 : | |
6911 : | NOTES: |
6912 : | |
6913 : | |
6914 : | Date Programmer Description |
6915 : | ====== ============ ================================================= |
6916 : | Nov 96 Joel Gales Original Programmer |
6917 : | |
6918 : | END_PROLOG |
6919 : -----------------------------------------------------------------------------*/
6920 : static float64
6921 0 : lamazDyDtheta(float64 parms[])
6922 : {
6923 : float64 snTheta, csTheta, snTheta1, csTheta1, csLamda;
6924 : float64 sn2, cs2, sndiff;
6925 :
6926 0 : snTheta = sin(EHconvAng(parms[0], HDFE_DEG_RAD));
6927 0 : csTheta = cos(EHconvAng(parms[0], HDFE_DEG_RAD));
6928 0 : snTheta1 = sin(EHconvAng(parms[1], HDFE_DEG_RAD));
6929 0 : csTheta1 = cos(EHconvAng(parms[1], HDFE_DEG_RAD));
6930 0 : csLamda = cos(EHconvAng(parms[2], HDFE_DEG_RAD) -
6931 0 : EHconvAng(parms[3], HDFE_DEG_RAD));
6932 :
6933 0 : sn2 = snTheta1 * snTheta;
6934 0 : cs2 = csTheta1 * csTheta;
6935 0 : sndiff = snTheta1 - snTheta;
6936 :
6937 0 : return (cs2 * (sn2 * (1 + (csLamda * csLamda)) + 2) +
6938 0 : csLamda * (2 * (1 + sn2 * sn2) - (sndiff * sndiff)));
6939 : }
6940 :
6941 :
6942 :
6943 : /*----------------------------------------------------------------------------|
6944 : | BEGIN_PROLOG |
6945 : | |
6946 : | FUNCTION: homDyDtheta |
6947 : | |
6948 : | DESCRIPTION: Partial derivative along longitude line for Oblique Mercator |
6949 : | |
6950 : | |
6951 : | Return Value Type Units Description |
6952 : | ============ ====== ========= ===================================== |
6953 : | float64 Dx/D(theta) for HOM projection |
6954 : | |
6955 : | INPUTS: |
6956 : | parms float64 Parameters defining partial derivative |
6957 : | |
6958 : | OUTPUTS: |
6959 : | None |
6960 : | |
6961 : | NOTES: |
6962 : | |
6963 : | |
6964 : | Date Programmer Description |
6965 : | ====== ============ ================================================= |
6966 : | Mar 97 Joel Gales Original Programmer |
6967 : | |
6968 : | END_PROLOG |
6969 : -----------------------------------------------------------------------------*/
6970 : static float64
6971 0 : homDyDtheta(float64 parms[])
6972 : {
6973 : float64 tnTheta, tnTheta1, snLamda;
6974 :
6975 0 : tnTheta = tan(EHconvAng(parms[0], HDFE_DEG_RAD));
6976 0 : tnTheta1 = tan(EHconvAng(parms[1], HDFE_DEG_RAD));
6977 0 : snLamda = cos(EHconvAng(parms[2], HDFE_DEG_RAD) -
6978 0 : EHconvAng(parms[3], HDFE_DEG_RAD));
6979 :
6980 0 : return (tnTheta * snLamda + tnTheta1);
6981 : }
6982 :
6983 :
6984 :
6985 :
6986 : /*----------------------------------------------------------------------------|
6987 : | BEGIN_PROLOG |
6988 : | |
6989 : | FUNCTION: GDtangentpnts |
6990 : | |
6991 : | DESCRIPTION: Finds tangent points along lon/lat lines |
6992 : | |
6993 : | |
6994 : | Return Value Type Units Description |
6995 : | ============ ====== ========= ===================================== |
6996 : | status intn return status (0) SUCCEED, (-1) FAIL |
6997 : | |
6998 : | INPUTS: |
6999 : | projcode int32 Projection code |
7000 : | projparm float64 Projection parameters |
7001 : | cornerlon float64 dec deg Longitude of opposite corners of box |
7002 : | cornerlat float64 dec deg Latitude of opposite corners of box |
7003 : | longitude float64 dec deg Longitude of points to check |
7004 : | latitude float64 dec deg Latitude of points to check |
7005 : | |
7006 : | |
7007 : | OUTPUTS: |
7008 : | npnts int32 Number of points to check in subset |
7009 : | |
7010 : | NOTES: |
7011 : | |
7012 : | |
7013 : | Date Programmer Description |
7014 : | ====== ============ ================================================= |
7015 : | Nov 96 Joel Gales Original Programmer |
7016 : | Mar 97 Joel Gales Add support for LAMCC, POLYC, TM |
7017 : | Aug 99 Abe Taaheri Add support for ALBERS, and MERCAT projections. |
7018 : | Also changed mistyped bisectParm[2] to |
7019 : | bisectParm[3] for HOM projection. |
7020 : | Jun 00 Abe Taaheri Added support for EASE grid |
7021 : | |
7022 : | END_PROLOG |
7023 : -----------------------------------------------------------------------------*/
7024 : static intn
7025 0 : GDtangentpnts(int32 projcode, float64 projparm[], float64 cornerlon[],
7026 : float64 cornerlat[], float64 longitude[], float64 latitude[],
7027 : int32 * npnts)
7028 : {
7029 : intn i; /* Loop index */
7030 0 : intn status = 0; /* routine return status variable */
7031 :
7032 : float64 lonrad; /* Longitude (radians) */
7033 : float64 latrad; /* Latitude (radians) */
7034 : float64 cs[4]; /* Cosine array */
7035 : float64 sn[4]; /* Sine array */
7036 : float64 csTest; /* Cosine test value */
7037 : float64 snTest; /* Sine test value */
7038 : float64 crs01; /* Cross product */
7039 : float64 crsTest[2]; /* Cross product array */
7040 : float64 longPol; /* Longitude beneath pole */
7041 : float64 minLat; /* Minimum latitude */
7042 : float64 bisectParm[4]; /* Bisection parameters */
7043 : float64 tanLat; /* Tangent latitude */
7044 : float64 tanLon; /* Tangent longitude */
7045 : float64 dotPrd; /* Dot product */
7046 : float64 centMerd; /* Central Meridian */
7047 : float64 orgLat; /* Latitude of origin */
7048 : float64 dpi; /* Double precision pi */
7049 :
7050 : #if 0
7051 : float64 lamazDxDtheta(); /* Lambert Azimuthal Dx/Dtheta */
7052 : float64 lamazDxDlamda(); /* Lambert Azimuthal Dx/Dlamda */
7053 : float64 lamazDyDtheta(); /* Lambert Azimuthal Dy/Dtheta */
7054 : float64 homDyDtheta(); /* Oblique Mercator Dy/Dtheta */
7055 : #endif
7056 :
7057 : /* Compute pi (double precision) */
7058 : /* ----------------------------- */
7059 0 : dpi = atan(1.0) * 4;
7060 :
7061 :
7062 0 : switch (projcode)
7063 : {
7064 0 : case GCTP_MERCAT:
7065 : {
7066 : /* No need for tangent points, since MERCAT projection
7067 : is rectangular */
7068 : }
7069 0 : break;
7070 0 : case GCTP_BCEA:
7071 : {
7072 : /* No need for tangent points, since BCEA projection
7073 : is rectangular */
7074 : }
7075 0 : break;
7076 0 : case GCTP_CEA:
7077 : {
7078 : /* No need for tangent points, since CEA projection
7079 : is rectangular */
7080 : }
7081 0 : break;
7082 :
7083 0 : case GCTP_PS:
7084 : {
7085 : /* Add "xy axis" points for Polar Stereographic if necessary */
7086 : /* --------------------------------------------------------- */
7087 :
7088 :
7089 : /* Get minimum of corner latitudes */
7090 : /* ------------------------------- */
7091 0 : minLat = (fabs(cornerlat[0]) <= fabs(cornerlat[1]))
7092 0 : ? cornerlat[0] : cornerlat[1];
7093 :
7094 :
7095 : /* Compute sine and cosine of corner longitudes */
7096 : /* -------------------------------------------- */
7097 0 : for (i = 0; i < 2; i++)
7098 : {
7099 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7100 0 : cs[i] = cos(lonrad);
7101 0 : sn[i] = sin(lonrad);
7102 : }
7103 :
7104 :
7105 : /* Compute cross product */
7106 : /* --------------------- */
7107 0 : crs01 = cs[0] * sn[1] - cs[1] * sn[0];
7108 :
7109 :
7110 : /* Convert longitude beneath pole from DMS to DEG */
7111 : /* ---------------------------------------------- */
7112 0 : longPol = EHconvAng(projparm[4], HDFE_DMS_RAD);
7113 :
7114 :
7115 :
7116 0 : for (i = 0; i < 4; i++)
7117 : {
7118 0 : csTest = cos(longPol);
7119 0 : snTest = sin(longPol);
7120 :
7121 0 : crsTest[0] = cs[0] * snTest - csTest * sn[0];
7122 0 : crsTest[1] = cs[1] * snTest - csTest * sn[1];
7123 :
7124 0 : if ((crs01 > 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7125 0 : (crs01 < 0 && crsTest[0] < 0 && crsTest[1] < 0) ||
7126 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7127 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] > 0))
7128 : {
7129 0 : longitude[*npnts] = EHconvAng(longPol, HDFE_RAD_DEG);
7130 0 : latitude[*npnts] = minLat;
7131 0 : (*npnts)++;
7132 : }
7133 0 : longPol += 0.5 * dpi;
7134 : }
7135 : }
7136 0 : break;
7137 :
7138 :
7139 0 : case GCTP_LAMAZ:
7140 : {
7141 0 : if ((int32) projparm[5] == +90000000 ||
7142 0 : (int32) projparm[5] == -90000000)
7143 : {
7144 : /* Add "xy axis" points for Polar Lambert Azimuthal */
7145 : /* ------------------------------------------------ */
7146 0 : minLat = (fabs(cornerlat[0]) <= fabs(cornerlat[1]))
7147 0 : ? cornerlat[0] : cornerlat[1];
7148 :
7149 0 : for (i = 0; i < 2; i++)
7150 : {
7151 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7152 0 : cs[i] = cos(lonrad);
7153 0 : sn[i] = sin(lonrad);
7154 : }
7155 0 : crs01 = cs[0] * sn[1] - cs[1] * sn[0];
7156 :
7157 0 : longPol = EHconvAng(projparm[4], HDFE_DMS_RAD);
7158 0 : for (i = 0; i < 4; i++)
7159 : {
7160 0 : csTest = cos(longPol);
7161 0 : snTest = sin(longPol);
7162 :
7163 0 : crsTest[0] = cs[0] * snTest - csTest * sn[0];
7164 0 : crsTest[1] = cs[1] * snTest - csTest * sn[1];
7165 :
7166 0 : if ((crs01 > 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7167 0 : (crs01 < 0 && crsTest[0] < 0 && crsTest[1] < 0) ||
7168 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7169 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] > 0))
7170 : {
7171 0 : longitude[*npnts] = EHconvAng(longPol, HDFE_RAD_DEG);
7172 0 : latitude[*npnts] = minLat;
7173 0 : (*npnts)++;
7174 : }
7175 0 : longPol += 0.5 * dpi;
7176 : }
7177 : }
7178 0 : else if ((int32) projparm[5] == 0)
7179 : {
7180 : /* Add "Equator" points for Equatorial Lambert Azimuthal */
7181 : /* ----------------------------------------------------- */
7182 0 : if (cornerlat[0] * cornerlat[1] < 0)
7183 : {
7184 0 : longitude[4] = cornerlon[0];
7185 0 : latitude[4] = 0;
7186 :
7187 0 : longitude[5] = cornerlon[1];
7188 0 : latitude[5] = 0;
7189 :
7190 0 : *npnts = 6;
7191 : }
7192 : }
7193 : else
7194 : {
7195 : /* Add tangent points for Oblique Lambert Azimuthal */
7196 : /* ------------------------------------------------ */
7197 0 : bisectParm[0] = EHconvAng(projparm[5], HDFE_DMS_DEG);
7198 0 : bisectParm[2] = EHconvAng(projparm[4], HDFE_DMS_DEG);
7199 :
7200 :
7201 : /* Tangent to y-axis along longitude */
7202 : /* --------------------------------- */
7203 0 : for (i = 0; i < 2; i++)
7204 : {
7205 0 : bisectParm[1] = cornerlon[i];
7206 :
7207 0 : if (EHbisect(lamazDxDtheta, bisectParm, 3,
7208 0 : cornerlat[0], cornerlat[1],
7209 : 0.0001, &tanLat) == 0)
7210 : {
7211 0 : longitude[*npnts] = cornerlon[i];
7212 0 : latitude[*npnts] = tanLat;
7213 0 : (*npnts)++;
7214 : }
7215 : }
7216 :
7217 : /* Tangent to y-axis along latitude */
7218 : /* -------------------------------- */
7219 0 : for (i = 0; i < 2; i++)
7220 : {
7221 0 : bisectParm[1] = cornerlat[i];
7222 :
7223 0 : if (EHbisect(lamazDxDlamda, bisectParm, 3,
7224 0 : cornerlon[0], cornerlon[1],
7225 : 0.0001, &tanLon) == 0)
7226 : {
7227 0 : longitude[*npnts] = tanLon;
7228 0 : latitude[*npnts] = cornerlat[i];
7229 0 : (*npnts)++;
7230 : }
7231 : }
7232 :
7233 :
7234 : /* Tangent to x-axis along longitude */
7235 : /* --------------------------------- */
7236 0 : for (i = 0; i < 2; i++)
7237 : {
7238 0 : bisectParm[1] = cornerlon[i];
7239 :
7240 0 : if (EHbisect(lamazDyDtheta, bisectParm, 3,
7241 0 : cornerlat[0], cornerlat[1],
7242 : 0.0001, &tanLat) == 0)
7243 : {
7244 0 : longitude[*npnts] = cornerlon[i];
7245 0 : latitude[*npnts] = tanLat;
7246 0 : (*npnts)++;
7247 : }
7248 : }
7249 :
7250 : /* Tangent to x-axis along latitude */
7251 : /* -------------------------------- */
7252 0 : for (i = 0; i < 2; i++)
7253 : {
7254 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7255 0 : cs[i] = cos(lonrad);
7256 0 : sn[i] = sin(lonrad);
7257 : }
7258 0 : crs01 = cs[0] * sn[1] - cs[1] * sn[0];
7259 :
7260 0 : longPol = EHconvAng(projparm[4], HDFE_DMS_RAD);
7261 0 : for (i = 0; i < 2; i++)
7262 : {
7263 0 : csTest = cos(longPol);
7264 0 : snTest = sin(longPol);
7265 :
7266 0 : crsTest[0] = cs[0] * snTest - csTest * sn[0];
7267 0 : crsTest[1] = cs[1] * snTest - csTest * sn[1];
7268 :
7269 0 : if ((crs01 > 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7270 0 : (crs01 < 0 && crsTest[0] < 0 && crsTest[1] < 0) ||
7271 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] < 0) ||
7272 0 : (crs01 < 0 && crsTest[0] > 0 && crsTest[1] > 0))
7273 : {
7274 0 : longitude[*npnts] = EHconvAng(longPol, HDFE_RAD_DEG);
7275 0 : latitude[*npnts] = cornerlat[0];
7276 0 : (*npnts)++;
7277 0 : longitude[*npnts] = EHconvAng(longPol, HDFE_RAD_DEG);
7278 0 : latitude[*npnts] = cornerlat[1];
7279 0 : (*npnts)++;
7280 : }
7281 0 : longPol += dpi;
7282 : }
7283 : }
7284 : }
7285 0 : break;
7286 :
7287 :
7288 0 : case GCTP_GOOD:
7289 : {
7290 : /* Add "Equator" points for Goode Homolosine if necessary */
7291 : /* ------------------------------------------------------ */
7292 0 : if (cornerlat[0] * cornerlat[1] < 0)
7293 : {
7294 0 : longitude[4] = cornerlon[0];
7295 0 : latitude[4] = 0;
7296 :
7297 0 : longitude[5] = cornerlon[1];
7298 0 : latitude[5] = 0;
7299 :
7300 0 : *npnts = 6;
7301 : }
7302 : }
7303 0 : break;
7304 :
7305 :
7306 0 : case GCTP_LAMCC:
7307 : {
7308 : /* Compute sine and cosine of corner longitudes */
7309 : /* -------------------------------------------- */
7310 0 : for (i = 0; i < 2; i++)
7311 : {
7312 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7313 0 : cs[i] = cos(lonrad);
7314 0 : sn[i] = sin(lonrad);
7315 : }
7316 :
7317 :
7318 : /* Compute dot product */
7319 : /* ------------------- */
7320 0 : dotPrd = cs[0] * cs[1] + sn[0] * sn[1];
7321 :
7322 :
7323 : /* Convert central meridian (DMS to DEG) & compute sin & cos */
7324 : /* --------------------------------------------------------- */
7325 0 : centMerd = EHconvAng(projparm[4], HDFE_DMS_DEG);
7326 0 : lonrad = EHconvAng(centMerd, HDFE_DEG_RAD);
7327 0 : cs[1] = cos(lonrad);
7328 0 : sn[1] = sin(lonrad);
7329 :
7330 :
7331 : /* If box brackets central meridian ... */
7332 : /* ------------------------------------ */
7333 0 : if (cs[0] * cs[1] + sn[0] * sn[1] > dotPrd)
7334 : {
7335 0 : latitude[4] = cornerlat[0];
7336 0 : longitude[4] = centMerd;
7337 :
7338 0 : latitude[5] = cornerlat[1];
7339 0 : longitude[5] = centMerd;
7340 :
7341 0 : *npnts = 6;
7342 : }
7343 : }
7344 0 : break;
7345 :
7346 :
7347 0 : case GCTP_ALBERS:
7348 : {
7349 : /* Compute sine and cosine of corner longitudes */
7350 : /* -------------------------------------------- */
7351 0 : for (i = 0; i < 2; i++)
7352 : {
7353 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7354 0 : cs[i] = cos(lonrad);
7355 0 : sn[i] = sin(lonrad);
7356 : }
7357 :
7358 :
7359 : /* Compute dot product */
7360 : /* ------------------- */
7361 0 : dotPrd = cs[0] * cs[1] + sn[0] * sn[1];
7362 :
7363 :
7364 : /* Convert central meridian (DMS to DEG) & compute sin & cos */
7365 : /* --------------------------------------------------------- */
7366 0 : centMerd = EHconvAng(projparm[4], HDFE_DMS_DEG);
7367 0 : lonrad = EHconvAng(centMerd, HDFE_DEG_RAD);
7368 0 : cs[1] = cos(lonrad);
7369 0 : sn[1] = sin(lonrad);
7370 :
7371 :
7372 : /* If box brackets central meridian ... */
7373 : /* ------------------------------------ */
7374 0 : if (cs[0] * cs[1] + sn[0] * sn[1] > dotPrd)
7375 : {
7376 0 : latitude[4] = cornerlat[0];
7377 0 : longitude[4] = centMerd;
7378 :
7379 0 : latitude[5] = cornerlat[1];
7380 0 : longitude[5] = centMerd;
7381 :
7382 0 : *npnts = 6;
7383 : }
7384 : }
7385 0 : break;
7386 :
7387 :
7388 0 : case GCTP_POLYC:
7389 : {
7390 : /* Compute sine and cosine of corner longitudes */
7391 : /* -------------------------------------------- */
7392 0 : for (i = 0; i < 2; i++)
7393 : {
7394 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7395 0 : cs[i] = cos(lonrad);
7396 0 : sn[i] = sin(lonrad);
7397 : }
7398 :
7399 :
7400 : /* Compute dot product */
7401 : /* ------------------- */
7402 0 : dotPrd = cs[0] * cs[1] + sn[0] * sn[1];
7403 :
7404 :
7405 : /* Convert central meridian (DMS to DEG) & compute sin & cos */
7406 : /* --------------------------------------------------------- */
7407 0 : centMerd = EHconvAng(projparm[4], HDFE_DMS_DEG);
7408 0 : lonrad = EHconvAng(centMerd, HDFE_DEG_RAD);
7409 0 : cs[1] = cos(lonrad);
7410 0 : sn[1] = sin(lonrad);
7411 :
7412 :
7413 : /* If box brackets central meridian ... */
7414 : /* ------------------------------------ */
7415 0 : if (cs[0] * cs[1] + sn[0] * sn[1] > dotPrd)
7416 : {
7417 0 : latitude[4] = cornerlat[0];
7418 0 : longitude[4] = centMerd;
7419 :
7420 0 : latitude[5] = cornerlat[1];
7421 0 : longitude[5] = centMerd;
7422 :
7423 0 : *npnts = 6;
7424 : }
7425 : }
7426 0 : break;
7427 :
7428 :
7429 0 : case GCTP_TM:
7430 : {
7431 : /* Compute sine and cosine of corner longitudes */
7432 : /* -------------------------------------------- */
7433 0 : for (i = 0; i < 2; i++)
7434 : {
7435 0 : lonrad = EHconvAng(cornerlon[i], HDFE_DEG_RAD);
7436 0 : cs[i] = cos(lonrad);
7437 0 : sn[i] = sin(lonrad);
7438 : }
7439 :
7440 :
7441 : /* Compute dot product */
7442 : /* ------------------- */
7443 0 : dotPrd = cs[0] * cs[1] + sn[0] * sn[1];
7444 :
7445 :
7446 0 : for (i = -1; i <= 1; i++)
7447 : {
7448 0 : centMerd = EHconvAng(projparm[4], HDFE_DMS_DEG);
7449 0 : lonrad = EHconvAng(centMerd + 90 * i, HDFE_DEG_RAD);
7450 0 : csTest = cos(lonrad);
7451 0 : snTest = sin(lonrad);
7452 :
7453 :
7454 : /* If box brackets meridian ... */
7455 : /* ---------------------------- */
7456 0 : if (csTest * cs[1] + snTest * sn[1] > dotPrd)
7457 : {
7458 0 : latitude[*npnts] = cornerlat[0];
7459 0 : longitude[*npnts] = centMerd;
7460 0 : (*npnts)++;
7461 :
7462 0 : latitude[*npnts] = cornerlat[1];
7463 0 : longitude[*npnts] = centMerd;
7464 0 : (*npnts)++;
7465 : }
7466 : }
7467 :
7468 :
7469 :
7470 : /* Compute sine and cosine of corner latitudes */
7471 : /* ------------------------------------------- */
7472 0 : for (i = 0; i < 2; i++)
7473 : {
7474 0 : latrad = EHconvAng(cornerlat[i], HDFE_DEG_RAD);
7475 0 : cs[i] = cos(latrad);
7476 0 : sn[i] = sin(latrad);
7477 : }
7478 :
7479 :
7480 : /* Compute dot product */
7481 : /* ------------------- */
7482 0 : dotPrd = cs[0] * cs[1] + sn[0] * sn[1];
7483 :
7484 :
7485 : /* Convert origin latitude (DMS to DEG) & compute sin & cos */
7486 : /* -------------------------------------------------------- */
7487 0 : orgLat = EHconvAng(projparm[5], HDFE_DMS_DEG);
7488 0 : latrad = EHconvAng(orgLat, HDFE_DEG_RAD);
7489 0 : cs[1] = cos(latrad);
7490 0 : sn[1] = sin(latrad);
7491 :
7492 :
7493 : /* If box brackets origin latitude ... */
7494 : /* ----------------------------------- */
7495 0 : if (cs[0] * cs[1] + sn[0] * sn[1] > dotPrd)
7496 : {
7497 0 : latitude[*npnts] = orgLat;
7498 0 : longitude[*npnts] = cornerlon[0];
7499 0 : (*npnts)++;
7500 :
7501 0 : latitude[*npnts] = orgLat;
7502 0 : longitude[*npnts] = cornerlon[1];
7503 0 : (*npnts)++;
7504 : }
7505 : }
7506 0 : break;
7507 :
7508 :
7509 0 : case GCTP_HOM:
7510 : {
7511 : /* Tangent to y-axis along longitude */
7512 : /* --------------------------------- */
7513 0 : if (projparm[12] == 0)
7514 : {
7515 0 : cs[0] = cos(EHconvAng(projparm[8], HDFE_DMS_RAD));
7516 0 : sn[0] = sin(EHconvAng(projparm[8], HDFE_DMS_RAD));
7517 0 : cs[1] = cos(EHconvAng(projparm[9], HDFE_DMS_RAD));
7518 0 : sn[1] = sin(EHconvAng(projparm[9], HDFE_DMS_RAD));
7519 0 : cs[2] = cos(EHconvAng(projparm[10], HDFE_DMS_RAD));
7520 0 : sn[2] = sin(EHconvAng(projparm[10], HDFE_DMS_RAD));
7521 0 : cs[3] = cos(EHconvAng(projparm[11], HDFE_DMS_RAD));
7522 0 : sn[3] = sin(EHconvAng(projparm[11], HDFE_DMS_RAD));
7523 :
7524 0 : bisectParm[3] = atan2(
7525 0 : (cs[1] * sn[3] * cs[0] - sn[1] * cs[3] * cs[2]),
7526 0 : (sn[1] * cs[3] * sn[2] - cs[1] * sn[3] * sn[0]));
7527 0 : bisectParm[0] = atan(
7528 0 : (sin(bisectParm[3]) * sn[0] - cos(bisectParm[3]) * cs[0]) /
7529 0 : (sn[1] / cs[1]));
7530 0 : bisectParm[2] = bisectParm[3] + 0.5 * dpi;
7531 : }
7532 : else
7533 : {
7534 0 : cs[0] = cos(EHconvAng(projparm[3], HDFE_DMS_RAD));
7535 0 : sn[0] = sin(EHconvAng(projparm[3], HDFE_DMS_RAD));
7536 0 : cs[1] = cos(EHconvAng(projparm[4], HDFE_DMS_RAD));
7537 0 : sn[1] = sin(EHconvAng(projparm[4], HDFE_DMS_RAD));
7538 :
7539 0 : bisectParm[0] = asin(cs[1] * sn[0]);
7540 0 : bisectParm[2] = atan2(-cs[0], (-sn[1] * sn[0])) + 0.5 * dpi;
7541 : }
7542 :
7543 0 : for (i = 0; i < 2; i++)
7544 : {
7545 0 : bisectParm[1] = cornerlon[i];
7546 :
7547 0 : if (EHbisect(homDyDtheta, bisectParm, 3,
7548 0 : cornerlat[0], cornerlat[1],
7549 : 0.0001, &tanLat) == 0)
7550 : {
7551 0 : longitude[*npnts] = cornerlon[i];
7552 0 : latitude[*npnts] = tanLat;
7553 0 : (*npnts)++;
7554 : }
7555 : }
7556 :
7557 : }
7558 0 : break;
7559 : }
7560 :
7561 :
7562 0 : return (status);
7563 : }
7564 :
7565 :
7566 :
7567 : /*----------------------------------------------------------------------------|
7568 : | BEGIN_PROLOG |
7569 : | |
7570 : | FUNCTION: GDdefboxregion |
7571 : | |
7572 : | DESCRIPTION: Defines region for subsetting in a grid. |
7573 : | |
7574 : | |
7575 : | Return Value Type Units Description |
7576 : | ============ ====== ========= ===================================== |
7577 : | regionID int32 Region ID |
7578 : | |
7579 : | INPUTS: |
7580 : | gridID int32 Grid structure ID |
7581 : | cornerlon float64 dec deg Longitude of opposite corners of box |
7582 : | cornerlat float64 dec deg Latitude of opposite corners of box |
7583 : | |
7584 : | |
7585 : | OUTPUTS: |
7586 : | None |
7587 : | |
7588 : | NOTES: |
7589 : | |
7590 : | |
7591 : | Date Programmer Description |
7592 : | ====== ============ ================================================= |
7593 : | Jun 96 Joel Gales Original Programmer |
7594 : | Oct 96 Joel Gales "Clamp" subset region around grid |
7595 : | Oct 96 Joel Gales Fix "outside region" check |
7596 : | Nov 96 Joel Gales Add check for "tangent" points (GDtangentpnts) |
7597 : | Dec 96 Joel Gales Trap if no projection code defined |
7598 : | Dec 96 Joel Gales Add multiple vertical subsetting capability |
7599 : | Mar 99 David Wynne Fix for NCR 21195, allow subsetting of MISR SOM |
7600 : | data sets |
7601 : | Jun 00 Abe Taaheri Added support for EASE grid |
7602 : | |
7603 : | END_PROLOG |
7604 : -----------------------------------------------------------------------------*/
7605 : int32
7606 0 : GDdefboxregion(int32 gridID, float64 cornerlon[], float64 cornerlat[])
7607 : {
7608 : intn i; /* Loop index */
7609 : intn j; /* Loop index */
7610 : intn k; /* Loop index */
7611 : intn n; /* Loop index */
7612 0 : intn status = 0; /* routine return status variable */
7613 :
7614 : int32 fid; /* HDF-EOS file ID */
7615 : int32 sdInterfaceID; /* HDF SDS interface ID */
7616 : int32 gdVgrpID; /* Grid root Vgroup ID */
7617 0 : int32 regionID = -1; /* Region ID */
7618 : int32 xdimsize; /* XDim size */
7619 : int32 ydimsize; /* YDim size */
7620 : int32 projcode; /* Projection code */
7621 : int32 zonecode; /* Zone code */
7622 : int32 spherecode; /* Sphere code */
7623 : int32 row[32]; /* Row array */
7624 : int32 col[32]; /* Column array */
7625 0 : int32 minCol = 0; /* Minimum column value */
7626 0 : int32 minRow = 0; /* Minimum row value */
7627 0 : int32 maxCol = 0; /* Maximum column value */
7628 0 : int32 maxRow = 0; /* Maximum row value */
7629 : int32 npnts; /* Number of boundary
7630 : (edge & tangent) pnts */
7631 :
7632 : float64 longitude[32]; /* Longitude array */
7633 : float64 latitude[32]; /* Latitude array */
7634 : float64 upleftpt[2]; /* Upper left pt coordinates */
7635 : float64 lowrightpt[2]; /* Lower right pt coordinates */
7636 : float64 somupleftpt[2]; /* temporary Upper left pt coordinates
7637 : for SOM projection */
7638 : float64 somlowrightpt[2]; /* temporary Lower right pt
7639 : coordinates for SOM projection */
7640 : float64 projparm[16]; /* Projection parameters */
7641 : float64 xscale; /* X scale */
7642 : float64 yscale; /* Y scale */
7643 : float64 lonrad0; /* Longitude of upper left point
7644 : (radians) */
7645 : float64 latrad0; /* Latitude of upper left point (radians) */
7646 : float64 lonrad2; /* Longitude of point (radians) */
7647 : float64 latrad2; /* Latitude of point (radians) */
7648 :
7649 : /* Used for SOM projection */
7650 : char *utlbuf;
7651 : char *gridname;
7652 0 : int32 blockindexstart = -1;
7653 0 : int32 blockindexstop = -1;
7654 : float32 offset[180];
7655 : float64 templeftpt[2];
7656 : float64 temprightpt[2];
7657 0 : int32 idOffset = GDIDOFFSET; /* Grid ID offset */
7658 : float64 xmtr[2], ymtr[2];
7659 : float64 lon[2],lat[2];
7660 : float64 xcor[2], ycor[2];
7661 : int32 nlatlon;
7662 : float64 upleftpt_m[2];
7663 :
7664 :
7665 0 : utlbuf = (char *)calloc(128, sizeof(char));
7666 0 : if(utlbuf == NULL)
7667 : {
7668 0 : HEpush(DFE_NOSPACE,"GDdefboxregion", __FILE__, __LINE__);
7669 0 : return(-1);
7670 : }
7671 0 : gridname = (char *)calloc(128, sizeof(char));
7672 0 : if(gridname == NULL)
7673 : {
7674 0 : HEpush(DFE_NOSPACE,"GDdefboxregion", __FILE__, __LINE__);
7675 0 : free(utlbuf);
7676 0 : return(-1);
7677 : }
7678 :
7679 : /* Check for valid grid ID */
7680 : /* ----------------------- */
7681 0 : status = GDchkgdid(gridID, "GDdefboxregion",
7682 : &fid, &sdInterfaceID, &gdVgrpID);
7683 :
7684 :
7685 0 : if (status == 0)
7686 : {
7687 : /* Get grid info */
7688 : /* ------------- */
7689 0 : status = GDgridinfo(gridID, &xdimsize, &ydimsize,
7690 : upleftpt, lowrightpt);
7691 :
7692 :
7693 : /* If error then bail */
7694 : /* ------------------ */
7695 0 : if (status != 0)
7696 : {
7697 0 : regionID = -1;
7698 0 : free(utlbuf);
7699 0 : free(gridname);
7700 0 : return (regionID);
7701 : }
7702 :
7703 :
7704 : /* Get proj info */
7705 : /* ------------- */
7706 0 : status = GDprojinfo(gridID, &projcode, &zonecode,
7707 : &spherecode, projparm);
7708 :
7709 :
7710 : /* If no projection code defined then bail */
7711 : /* --------------------------------------- */
7712 0 : if (projcode == -1)
7713 : {
7714 0 : regionID = -1;
7715 0 : free(utlbuf);
7716 0 : free(gridname);
7717 0 : return (regionID);
7718 : }
7719 :
7720 :
7721 : /* Get default values for upleft and lowright if necessary */
7722 : /* ------------------------------------------------------- */
7723 0 : if (upleftpt[0] == 0 && upleftpt[1] == 0 &&
7724 0 : lowrightpt[0] == 0 && lowrightpt[1] == 0)
7725 : {
7726 0 : status = GDgetdefaults(projcode, zonecode, projparm, spherecode,
7727 : upleftpt, lowrightpt);
7728 :
7729 : /* If error then bail */
7730 : /* ------------------ */
7731 0 : if (status != 0)
7732 : {
7733 0 : regionID = -1;
7734 0 : free(utlbuf);
7735 0 : free(gridname);
7736 0 : return (regionID);
7737 : }
7738 : }
7739 :
7740 :
7741 :
7742 : /* Fill-up longitude and latitude arrays */
7743 : /* ------------------------------------- */
7744 0 : longitude[0] = cornerlon[0];
7745 0 : latitude[0] = cornerlat[0];
7746 :
7747 0 : longitude[1] = cornerlon[0];
7748 0 : latitude[1] = cornerlat[1];
7749 :
7750 0 : longitude[2] = cornerlon[1];
7751 0 : latitude[2] = cornerlat[0];
7752 :
7753 0 : longitude[3] = cornerlon[1];
7754 0 : latitude[3] = cornerlat[1];
7755 :
7756 0 : npnts = 4;
7757 :
7758 :
7759 : /* Find additional tangent points from GDtangentpnts */
7760 : /* ------------------------------------------------- */
7761 0 : status = GDtangentpnts(projcode, projparm, cornerlon, cornerlat,
7762 : longitude, latitude, &npnts);
7763 :
7764 : /* If SOM projection with projparm[11] non-zero ... */
7765 0 : if (projcode == GCTP_SOM && projparm[11] != 0)
7766 : {
7767 0 : Vgetname(GDXGrid[gridID % idOffset].IDTable, gridname);
7768 0 : snprintf(utlbuf, 128, "%s%s", "_BLKSOM:", gridname);
7769 0 : status = GDreadattr(gridID, utlbuf, offset);
7770 :
7771 0 : somupleftpt[0] = upleftpt[0];
7772 0 : somupleftpt[1] = upleftpt[1];
7773 0 : somlowrightpt[0]= lowrightpt[0];
7774 0 : somlowrightpt[1] = lowrightpt[1];
7775 :
7776 0 : k = 0;
7777 0 : n = 2;
7778 :
7779 0 : for (j = 0; j <= projparm[11] - 1; j++)
7780 : {
7781 :
7782 : /* Convert from lon/lat to row/col */
7783 : /* ------------------------------- */
7784 0 : status = GDll2ij(projcode, zonecode, projparm, spherecode,
7785 : xdimsize, ydimsize, somupleftpt, somlowrightpt,
7786 : npnts, longitude, latitude, row, col, NULL, NULL);
7787 :
7788 :
7789 : /* Find min/max values for row & col */
7790 : /* --------------------------------- */
7791 0 : minCol = col[0];
7792 0 : minRow = row[0];
7793 0 : maxCol = col[0];
7794 0 : maxRow = row[0];
7795 0 : for (i = 1; i < npnts; i++)
7796 : {
7797 0 : if (col[i] < minCol)
7798 : {
7799 0 : minCol = col[i];
7800 : }
7801 :
7802 0 : if (col[i] > maxCol)
7803 : {
7804 0 : maxCol = col[i];
7805 : }
7806 :
7807 0 : if (row[i] < minRow)
7808 : {
7809 0 : minRow = row[i];
7810 : }
7811 :
7812 0 : if (row[i] > maxRow)
7813 : {
7814 0 : maxRow = row[i];
7815 : }
7816 : }
7817 :
7818 :
7819 :
7820 : /* "Clamp" if outside Grid */
7821 : /* ----------------------- */
7822 0 : minCol = (minCol < 0) ? 0 : minCol;
7823 0 : minRow = (minRow < 0) ? 0 : minRow;
7824 :
7825 0 : maxCol = (maxCol >= xdimsize) ? xdimsize - 1 : maxCol;
7826 0 : maxRow = (maxRow >= ydimsize) ? ydimsize - 1 : maxRow;
7827 :
7828 :
7829 : /* Check whether subset region is outside grid region */
7830 : /* -------------------------------------------------- */
7831 0 : if (minCol >= xdimsize || minRow >= ydimsize ||
7832 0 : maxCol < 0 || maxRow < 0)
7833 : {
7834 0 : if ( blockindexstart == -1 && (projparm[11]) == j)
7835 : {
7836 0 : status = -1;
7837 0 : HEpush(DFE_GENAPP, "GDdefboxregion", __FILE__, __LINE__);
7838 0 : HEreport("Subset Region outside of Grid Region\n");
7839 0 : regionID = -1;
7840 : }
7841 : }
7842 : else
7843 : {
7844 0 : if (k == 0)
7845 : {
7846 0 : blockindexstart = j;
7847 0 : blockindexstop = j;
7848 0 : k = 1;
7849 : }
7850 : else
7851 : {
7852 0 : blockindexstop = j;
7853 : }
7854 : }
7855 :
7856 : // E. Rouault: FIXME: was really abs(int) indented here ? Forcing the cast to int to please compilers
7857 0 : templeftpt[0] = upleftpt[0] + ((offset[j]/xdimsize)*abs((int)(upleftpt[0] - lowrightpt[0]))) + abs((int)(upleftpt[0] - lowrightpt[0]))*(n-1);
7858 0 : templeftpt[1] = upleftpt[1] + ((lowrightpt[1] - upleftpt[1]))*(n-1);
7859 :
7860 0 : temprightpt[0] = lowrightpt[0] + ((offset[j]/xdimsize)*abs((int)(lowrightpt[0] - upleftpt[0]))) + abs((int)(lowrightpt[0] - upleftpt[0]))*(n-1);
7861 0 : temprightpt[1] = lowrightpt[1] + ((upleftpt[1] - lowrightpt[1]))*(n-1);
7862 :
7863 0 : somupleftpt[0] = templeftpt[0];
7864 0 : somupleftpt[1] = templeftpt[1];
7865 :
7866 0 : somlowrightpt[0] = temprightpt[0];
7867 0 : somlowrightpt[1] = temprightpt[1];
7868 0 : n++;
7869 : }
7870 : }
7871 : else
7872 : {
7873 :
7874 : /* Convert from lon/lat to row/col */
7875 : /* ------------------------------- */
7876 :
7877 0 : status = GDll2ij(projcode, zonecode, projparm, spherecode,
7878 : xdimsize, ydimsize, upleftpt, lowrightpt,
7879 : npnts, longitude, latitude, row, col, NULL, NULL);
7880 :
7881 : /* Find min/max values for row & col */
7882 : /* --------------------------------- */
7883 0 : minCol = col[0];
7884 0 : minRow = row[0];
7885 0 : maxCol = col[0];
7886 0 : maxRow = row[0];
7887 0 : for (i = 1; i < npnts; i++)
7888 : {
7889 0 : if (col[i] < minCol)
7890 : {
7891 0 : minCol = col[i];
7892 : }
7893 :
7894 0 : if (col[i] > maxCol)
7895 : {
7896 0 : maxCol = col[i];
7897 : }
7898 :
7899 0 : if (row[i] < minRow)
7900 : {
7901 0 : minRow = row[i];
7902 : }
7903 :
7904 0 : if (row[i] > maxRow)
7905 : {
7906 0 : maxRow = row[i];
7907 : }
7908 : }
7909 :
7910 :
7911 :
7912 : /* "Clamp" if outside Grid */
7913 : /* ----------------------- */
7914 0 : minCol = (minCol < 0) ? 0 : minCol;
7915 0 : minRow = (minRow < 0) ? 0 : minRow;
7916 :
7917 0 : maxCol = (maxCol >= xdimsize) ? xdimsize - 1 : maxCol;
7918 0 : maxRow = (maxRow >= ydimsize) ? ydimsize - 1 : maxRow;
7919 :
7920 :
7921 : /* Check whether subset region is outside grid region */
7922 : /* -------------------------------------------------- */
7923 0 : if (minCol >= xdimsize || minRow >= ydimsize || maxCol < 0 || maxRow < 0)
7924 : {
7925 0 : status = -1;
7926 0 : HEpush(DFE_GENAPP, "GDdefboxregion", __FILE__, __LINE__);
7927 0 : HEreport("Subset Region outside of Grid Region\n");
7928 0 : regionID = -1;
7929 :
7930 : }
7931 : }
7932 0 : if (status == 0)
7933 : {
7934 : /* Store grid region info */
7935 : /* ---------------------- */
7936 0 : for (i = 0; i < NGRIDREGN; i++)
7937 : {
7938 : /* Find first empty grid region */
7939 : /* ---------------------------- */
7940 0 : if (GDXRegion[i] == 0)
7941 : {
7942 : /* Allocate space for grid region entry */
7943 : /* ------------------------------------ */
7944 0 : GDXRegion[i] = (struct gridRegion *)
7945 0 : calloc(1, sizeof(struct gridRegion));
7946 0 : if(GDXRegion[i] == NULL)
7947 : {
7948 0 : HEpush(DFE_NOSPACE,"GDdefboxregion", __FILE__, __LINE__);
7949 0 : free(utlbuf);
7950 0 : free(gridname);
7951 0 : return(-1);
7952 : }
7953 :
7954 :
7955 : /* Store file and grid ID */
7956 : /* ---------------------- */
7957 0 : GDXRegion[i]->fid = fid;
7958 0 : GDXRegion[i]->gridID = gridID;
7959 :
7960 :
7961 : /* Initialize vertical subset entries to -1 */
7962 : /* ---------------------------------------- */
7963 0 : for (j = 0; j < 8; j++)
7964 : {
7965 0 : GDXRegion[i]->StartVertical[j] = -1;
7966 0 : GDXRegion[i]->StopVertical[j] = -1;
7967 : }
7968 :
7969 :
7970 : /* Store start & count along x & y */
7971 : /* ------------------------------- */
7972 0 : GDXRegion[i]->xStart = minCol;
7973 0 : GDXRegion[i]->xCount = maxCol - minCol + 1;
7974 0 : GDXRegion[i]->yStart = minRow;
7975 0 : GDXRegion[i]->yCount = maxRow - minRow + 1;
7976 :
7977 :
7978 : /* Store upleft and lowright points of subset region */
7979 : /* ------------------------------------------------- */
7980 0 : if (projcode == GCTP_GEO )
7981 : {
7982 : /* GEO projection */
7983 : /* ------------------------ */
7984 :
7985 : /* Convert upleft & lowright lon from DMS to radians */
7986 : /* ------------------------------------------------- */
7987 0 : lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
7988 0 : lonrad2 = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
7989 :
7990 : /* Compute X scale */
7991 : /* --------------- */
7992 0 : xscale = (lonrad2 - lonrad0) / xdimsize;
7993 :
7994 : /* Convert upleft & lowright lat from DMS to radians */
7995 : /* ------------------------------------------------- */
7996 0 : latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
7997 0 : latrad2 = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
7998 :
7999 : /* Compute Y scale */
8000 : /* --------------- */
8001 0 : yscale = (latrad2 - latrad0) / ydimsize;
8002 :
8003 :
8004 : /* MinCol -> radians -> DMS -> upleftpt[0] */
8005 : /* --------------------------------------- */
8006 0 : GDXRegion[i]->upleftpt[0] =
8007 0 : EHconvAng(lonrad0 + xscale * minCol,
8008 : HDFE_RAD_DMS);
8009 :
8010 :
8011 : /* MinRow -> radians -> DMS -> upleftpt[1] */
8012 : /* --------------------------------------- */
8013 0 : GDXRegion[i]->upleftpt[1] =
8014 0 : EHconvAng(latrad0 + yscale * minRow,
8015 : HDFE_RAD_DMS);
8016 :
8017 :
8018 : /* MinCol + 1 -> radians -> DMS -> lowrightpt[0] */
8019 : /* --------------------------------------------- */
8020 0 : GDXRegion[i]->lowrightpt[0] =
8021 0 : EHconvAng(lonrad0 + xscale * (maxCol + 1),
8022 : HDFE_RAD_DMS);
8023 :
8024 :
8025 : /* MinRow + 1 -> radians -> DMS -> lowrightpt[1] */
8026 : /* --------------------------------------------- */
8027 0 : GDXRegion[i]->lowrightpt[1] =
8028 0 : EHconvAng(latrad0 + yscale * (maxRow + 1),
8029 : HDFE_RAD_DMS);
8030 : }
8031 0 : else if (projcode == GCTP_BCEA)
8032 : {
8033 : /* BCEA projection */
8034 : /* -------------- */
8035 0 : nlatlon = 2;
8036 0 : lon[0] = upleftpt[0];
8037 0 : lon[1] = lowrightpt[0];
8038 0 : lat[0] = upleftpt[1];
8039 0 : lat[1] = lowrightpt[1];
8040 : status =
8041 0 : GDll2mm_cea(projcode,zonecode,spherecode,projparm,
8042 : xdimsize, ydimsize,
8043 : upleftpt, lowrightpt,nlatlon,
8044 : lon, lat,
8045 : xcor, ycor, &xscale, &yscale);
8046 0 : upleftpt_m[0] = xcor[0];
8047 0 : upleftpt_m[1] = ycor[0];
8048 :
8049 :
8050 0 : if (status == -1)
8051 : {
8052 0 : HEpush(DFE_GENAPP, "GDdefboxregion", __FILE__, __LINE__);
8053 0 : free(utlbuf);
8054 0 : free(gridname);
8055 0 : return (status);
8056 : }
8057 :
8058 : /* MinCol -> meters -> upleftpt[0] */
8059 : /* ------------------------------- */
8060 0 : xmtr[0] = upleftpt_m[0] + xscale * minCol;
8061 :
8062 : /* MinRow -> meters -> upleftpt[1] */
8063 : /* ------------------------------- */
8064 0 : ymtr[0] = upleftpt_m[1] + yscale * minRow;
8065 :
8066 : /* MinCol + 1 -> meters -> lowrightpt[0] */
8067 : /* ------------------------------------- */
8068 0 : xmtr[1] = upleftpt_m[0] + xscale * (maxCol + 1);
8069 :
8070 : /* MinRow + 1 -> meters -> lowrightpt[1] */
8071 : /* ------------------------------------- */
8072 0 : ymtr[1] = upleftpt_m[1] + yscale * (maxRow + 1);
8073 :
8074 : /* Convert upleft & lowright lon from DMS to radians */
8075 : /* ------------------------------------------------- */
8076 0 : npnts = 2;
8077 0 : status = GDmm2ll_cea(projcode, zonecode, spherecode,
8078 : projparm, xdimsize, ydimsize,
8079 : upleftpt, lowrightpt, npnts,
8080 : xmtr, ymtr,
8081 : longitude, latitude);
8082 0 : if (status == -1)
8083 : {
8084 0 : HEpush(DFE_GENAPP, "GDdefboxregion", __FILE__, __LINE__);
8085 0 : free(utlbuf);
8086 0 : free(gridname);
8087 0 : return (status);
8088 : }
8089 0 : GDXRegion[i]->upleftpt[0] = longitude[0];
8090 :
8091 0 : GDXRegion[i]->upleftpt[1] = latitude[0];
8092 :
8093 0 : GDXRegion[i]->lowrightpt[0] = longitude[1];
8094 :
8095 0 : GDXRegion[i]->lowrightpt[1] = latitude[1];
8096 : }
8097 0 : else if (projcode == GCTP_SOM)
8098 : {
8099 : /* Store start & count along x & y */
8100 : /* ------------------------------- */
8101 0 : GDXRegion[i]->xStart = 0;
8102 0 : GDXRegion[i]->xCount = xdimsize;
8103 0 : GDXRegion[i]->yStart = 0;
8104 0 : GDXRegion[i]->yCount = ydimsize;
8105 :
8106 0 : GDXRegion[i]->somStart = blockindexstart;
8107 0 : GDXRegion[i]->somCount = blockindexstop - blockindexstart + 1;
8108 :
8109 : /* Store upleft and lowright points of subset region */
8110 : /* ------------------------------------------------- */
8111 0 : if (blockindexstart == 0)
8112 : {
8113 0 : GDXRegion[i]->upleftpt[0] = upleftpt[0];
8114 0 : GDXRegion[i]->upleftpt[1] = upleftpt[1];
8115 0 : GDXRegion[i]->lowrightpt[0] = lowrightpt[0];
8116 0 : GDXRegion[i]->lowrightpt[1] = lowrightpt[1];
8117 : }
8118 : else
8119 : {
8120 0 : GDXRegion[i]->upleftpt[0] =
8121 0 : (lowrightpt[0] - upleftpt[0])*
8122 0 : (offset[blockindexstart-1]/xdimsize) + upleftpt[0];
8123 0 : GDXRegion[i]->upleftpt[1] =
8124 0 : (lowrightpt[1] - upleftpt[1])*
8125 0 : (blockindexstart+1-1) + upleftpt[1];
8126 :
8127 0 : GDXRegion[i]->lowrightpt[0] =
8128 0 : (lowrightpt[0] - upleftpt[0])*
8129 0 : (offset[blockindexstart-1]/xdimsize) + lowrightpt[0];
8130 0 : GDXRegion[i]->lowrightpt[1] =
8131 0 : (lowrightpt[1] - upleftpt[1])*
8132 0 : (blockindexstart+1-1) + lowrightpt[1];
8133 :
8134 : }
8135 : }
8136 : else
8137 : {
8138 : /* Non-GEO, Non-BCEA projections */
8139 : /* ---------------------------- */
8140 :
8141 : /* Compute X & Y scale */
8142 : /* ------------------- */
8143 0 : xscale = (lowrightpt[0] - upleftpt[0]) / xdimsize;
8144 0 : yscale = (lowrightpt[1] - upleftpt[1]) / ydimsize;
8145 :
8146 :
8147 : /* MinCol -> meters -> upleftpt[0] */
8148 : /* ------------------------------- */
8149 0 : GDXRegion[i]->upleftpt[0] = upleftpt[0] +
8150 0 : xscale * minCol;
8151 :
8152 :
8153 : /* MinRow -> meters -> upleftpt[1] */
8154 : /* ------------------------------- */
8155 0 : GDXRegion[i]->upleftpt[1] = upleftpt[1] +
8156 0 : yscale * minRow;
8157 :
8158 :
8159 : /* MinCol + 1 -> meters -> lowrightpt[0] */
8160 : /* ------------------------------------- */
8161 0 : GDXRegion[i]->lowrightpt[0] = upleftpt[0] +
8162 0 : xscale * (maxCol + 1);
8163 :
8164 :
8165 : /* MinRow + 1 -> meters -> lowrightpt[1] */
8166 : /* ------------------------------------- */
8167 0 : GDXRegion[i]->lowrightpt[1] = upleftpt[1] +
8168 0 : yscale * (maxRow + 1);
8169 : }
8170 :
8171 : /* Store region ID */
8172 : /* --------------- */
8173 0 : regionID = i;
8174 0 : break;
8175 : }
8176 :
8177 : }
8178 : }
8179 :
8180 : }
8181 0 : free(utlbuf);
8182 0 : free(gridname);
8183 0 : return (regionID);
8184 : }
8185 :
8186 :
8187 :
8188 :
8189 :
8190 : /*----------------------------------------------------------------------------|
8191 : | BEGIN_PROLOG |
8192 : | |
8193 : | FUNCTION: GDregioninfo |
8194 : | |
8195 : | DESCRIPTION: Retrieves size of region in bytes. |
8196 : | |
8197 : | |
8198 : | Return Value Type Units Description |
8199 : | ============ ====== ========= ===================================== |
8200 : | status intn return status (0) SUCCEED, (-1) FAIL |
8201 : | |
8202 : | INPUTS: |
8203 : | gridID int32 Grid structure ID |
8204 : | regionID int32 Region ID |
8205 : | fieldname char Fieldname |
8206 : | |
8207 : | |
8208 : | OUTPUTS: |
8209 : | ntype int32 field number type |
8210 : | rank int32 field rank |
8211 : | dims int32 dimensions of field region |
8212 : | size int32 size in bytes of field region |
8213 : | upleftpt float64 Upper left corner coord for region |
8214 : | lowrightpt float64 Lower right corner coord for region |
8215 : | |
8216 : | NOTES: |
8217 : | |
8218 : | |
8219 : | Date Programmer Description |
8220 : | ====== ============ ================================================= |
8221 : | Jun 96 Joel Gales Original Programmer |
8222 : | Aug 96 Joel Gales Add vertical subsetting |
8223 : | Dec 96 Joel Gales Add multiple vertical subsetting capability |
8224 : | Apr 99 David Wynne Added support for MISR SOM projection, NCR 21195 |
8225 : | |
8226 : | END_PROLOG |
8227 : -----------------------------------------------------------------------------*/
8228 : intn
8229 0 : GDregioninfo(int32 gridID, int32 regionID, const char *fieldname,
8230 : int32 * ntype, int32 * rank, int32 dims[], int32 * size,
8231 : float64 upleftpt[], float64 lowrightpt[])
8232 : {
8233 : intn j; /* Loop index */
8234 0 : intn status = 0; /* routine return status variable */
8235 :
8236 : int32 fid; /* HDF-EOS file ID */
8237 : int32 sdInterfaceID; /* HDF SDS interface ID */
8238 : int32 gdVgrpID; /* Grid root Vgroup ID */
8239 : int32 l_index; /* Dimension l_index */
8240 :
8241 : char dimlist[256]; /* Dimension list */
8242 0 : const char *errMesg = "Vertical Dimension Not Found: \"%s\".\n";
8243 0 : const char *errM1 = "Both \"XDim\" and \"YDim\" must be present ";
8244 0 : const char *errM2 = "in the dimension list for \"%s\".\n";
8245 : char errbuf[256];/* Error buffer */
8246 :
8247 :
8248 : /* Check for valid grid ID */
8249 : /* ----------------------- */
8250 0 : status = GDchkgdid(gridID, "GDregioninfo", &fid, &sdInterfaceID,
8251 : &gdVgrpID);
8252 :
8253 :
8254 : /* Check for valid region ID */
8255 : /* ------------------------- */
8256 0 : if (status == 0)
8257 : {
8258 0 : if (regionID < 0 || regionID >= NGRIDREGN)
8259 : {
8260 0 : status = -1;
8261 0 : HEpush(DFE_RANGE, "GDregioninfo", __FILE__, __LINE__);
8262 0 : HEreport("Invalid Region id: %d.\n", regionID);
8263 : }
8264 : }
8265 :
8266 :
8267 : /* Check for active region ID */
8268 : /* -------------------------- */
8269 0 : if (status == 0)
8270 : {
8271 0 : if (GDXRegion[regionID] == 0)
8272 : {
8273 0 : status = -1;
8274 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8275 0 : HEreport("Inactive Region ID: %d.\n", regionID);
8276 : }
8277 : }
8278 :
8279 :
8280 :
8281 : /* Check that region defined for this file */
8282 : /* --------------------------------------- */
8283 0 : if (status == 0)
8284 : {
8285 0 : if (GDXRegion[regionID]->fid != fid)
8286 : {
8287 0 : status = -1;
8288 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8289 0 : HEreport("Region is not defined for this file.\n");
8290 : }
8291 : }
8292 :
8293 :
8294 : /* Check that region defined for this grid */
8295 : /* --------------------------------------- */
8296 0 : if (status == 0)
8297 : {
8298 0 : if (GDXRegion[regionID]->gridID != gridID)
8299 : {
8300 0 : status = -1;
8301 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8302 0 : HEreport("Region is not defined for this Grid.\n");
8303 : }
8304 : }
8305 :
8306 :
8307 :
8308 : /* Check for valid fieldname */
8309 : /* ------------------------- */
8310 0 : if (status == 0)
8311 : {
8312 0 : status = GDfieldinfo(gridID, fieldname, rank, dims, ntype, dimlist);
8313 :
8314 0 : if (status != 0)
8315 : {
8316 : /* Fieldname not found in grid */
8317 : /* --------------------------- */
8318 0 : status = -1;
8319 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8320 0 : HEreport("Fieldname \"%s\" not found.\n",
8321 : fieldname);
8322 : }
8323 0 : else if (*rank == 1)
8324 : {
8325 : /* Field is 1 dimensional */
8326 : /* ---------------------- */
8327 0 : status = -1;
8328 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8329 0 : HEreport(
8330 : "One-Dimesional fields \"%s\" may not be subsetted.\n",
8331 : fieldname);
8332 : }
8333 : else
8334 : {
8335 : /* "XDim" and/or "YDim" not found */
8336 : /* ------------------------------ */
8337 0 : if (EHstrwithin("XDim", dimlist, ',') == -1 ||
8338 0 : EHstrwithin("YDim", dimlist, ',') == -1)
8339 : {
8340 0 : status = -1;
8341 0 : HEpush(DFE_GENAPP, "GDregioninfo", __FILE__, __LINE__);
8342 0 : snprintf(errbuf, sizeof(errbuf), "%s%s", errM1, errM2);
8343 0 : HEreport(errbuf, fieldname);
8344 : }
8345 : }
8346 : }
8347 :
8348 :
8349 :
8350 : /* If no problems ... */
8351 : /* ------------------ */
8352 0 : if (status == 0)
8353 : {
8354 : /* Check if SOM projection */
8355 : /* ----------------------- */
8356 0 : if (EHstrwithin("SOMBlockDim", dimlist, ',') == 0)
8357 : {
8358 0 : dims[EHstrwithin("SOMBlockDim", dimlist, ',')] =
8359 0 : GDXRegion[regionID]->somCount;
8360 : }
8361 :
8362 : /* Load XDim dimension from region entry */
8363 : /* ------------------------------------- */
8364 0 : if (GDXRegion[regionID]->xCount != 0)
8365 : {
8366 0 : dims[EHstrwithin("XDim", dimlist, ',')] =
8367 0 : GDXRegion[regionID]->xCount;
8368 : }
8369 :
8370 : /* Load YDim dimension from region entry */
8371 : /* ------------------------------------- */
8372 0 : if (GDXRegion[regionID]->yCount != 0)
8373 : {
8374 0 : dims[EHstrwithin("YDim", dimlist, ',')] =
8375 0 : GDXRegion[regionID]->yCount;
8376 : }
8377 :
8378 :
8379 : /* Vertical Subset */
8380 : /* --------------- */
8381 0 : for (j = 0; j < 8; j++)
8382 : {
8383 :
8384 : /* If active vertical subset ... */
8385 : /* ----------------------------- */
8386 0 : if (GDXRegion[regionID]->StartVertical[j] != -1)
8387 : {
8388 : /* Find vertical dimension within dimlist */
8389 : /* -------------------------------------- */
8390 0 : l_index = EHstrwithin(GDXRegion[regionID]->DimNamePtr[j],
8391 : dimlist, ',');
8392 :
8393 : /* If dimension found ... */
8394 : /* ---------------------- */
8395 0 : if (l_index != -1)
8396 : {
8397 : /* Compute dimension size */
8398 : /* ---------------------- */
8399 0 : dims[l_index] =
8400 0 : GDXRegion[regionID]->StopVertical[j] -
8401 0 : GDXRegion[regionID]->StartVertical[j] + 1;
8402 : }
8403 : else
8404 : {
8405 : /* Vertical dimension not found */
8406 : /* ---------------------------- */
8407 0 : status = -1;
8408 0 : *size = -1;
8409 0 : HEpush(DFE_GENAPP, "GDregioninfo",
8410 : __FILE__, __LINE__);
8411 0 : HEreport(errMesg,
8412 0 : GDXRegion[regionID]->DimNamePtr[j]);
8413 : }
8414 : }
8415 : }
8416 :
8417 :
8418 0 : if (status == 0)
8419 : {
8420 : /* Compute number of total elements */
8421 : /* -------------------------------- */
8422 0 : *size = dims[0];
8423 0 : for (j = 1; j < *rank; j++)
8424 : {
8425 0 : *size *= dims[j];
8426 : }
8427 :
8428 : /* Multiply by size in bytes of numbertype */
8429 : /* --------------------------------------- */
8430 0 : *size *= DFKNTsize(*ntype);
8431 :
8432 :
8433 : /* Return upper left and lower right subset values */
8434 : /* ----------------------------------------------- */
8435 0 : upleftpt[0] = GDXRegion[regionID]->upleftpt[0];
8436 0 : upleftpt[1] = GDXRegion[regionID]->upleftpt[1];
8437 0 : lowrightpt[0] = GDXRegion[regionID]->lowrightpt[0];
8438 0 : lowrightpt[1] = GDXRegion[regionID]->lowrightpt[1];
8439 : }
8440 : }
8441 0 : return (status);
8442 : }
8443 :
8444 :
8445 :
8446 :
8447 :
8448 : /*----------------------------------------------------------------------------|
8449 : | BEGIN_PROLOG |
8450 : | |
8451 : | FUNCTION: GDextractregion |
8452 : | |
8453 : | DESCRIPTION: Retrieves data from specified region. |
8454 : | |
8455 : | |
8456 : | Return Value Type Units Description |
8457 : | ============ ====== ========= ===================================== |
8458 : | status intn return status (0) SUCCEED, (-1) FAIL |
8459 : | |
8460 : | INPUTS: |
8461 : | gridID int32 Grid structure ID |
8462 : | regionID int32 Region ID |
8463 : | fieldname char Fieldname |
8464 : | |
8465 : | OUTPUTS: |
8466 : | buffer void Data buffer containing subsetted region |
8467 : | |
8468 : | |
8469 : | NOTES: |
8470 : | |
8471 : | |
8472 : | Date Programmer Description |
8473 : | ====== ============ ================================================= |
8474 : | Jun 96 Joel Gales Original Programmer |
8475 : | Aug 96 Joel Gales Add vertical subsetting |
8476 : | Dec 96 Joel Gales Add multiple vertical subsetting capability |
8477 : | Apr 99 David Wynne Add support for MISR SOM projection, NCR 21195 |
8478 : | |
8479 : | END_PROLOG |
8480 : -----------------------------------------------------------------------------*/
8481 : intn
8482 0 : GDextractregion(int32 gridID, int32 regionID, const char *fieldname,
8483 : VOIDP buffer)
8484 : {
8485 : intn i; /* Loop index */
8486 : intn j; /* Loop index */
8487 0 : intn status = 0; /* routine return status variable */
8488 :
8489 : int32 fid; /* HDF-EOS file ID */
8490 : int32 sdInterfaceID; /* HDF SDS interface ID */
8491 : int32 gdVgrpID; /* Grid root Vgroup ID */
8492 : int32 l_index; /* Dimension l_index */
8493 : int32 start[8]; /* Start array for data read */
8494 : int32 edge[8]; /* Edge array for data read */
8495 : int32 dims[8]; /* Dimensions */
8496 0 : int32 rank = 0; /* Field rank */
8497 : int32 ntype; /* Field number type */
8498 : int32 origincode; /* Pixel origin code */
8499 :
8500 : char dimlist[256]; /* Dimension list */
8501 0 : const char *errMesg = "Vertical Dimension Not Found: \"%s\".\n";
8502 0 : const char *errM1 = "Both \"XDim\" and \"YDim\" must be present ";
8503 0 : const char *errM2 = "in the dimension list for \"%s\".\n";
8504 : char errbuf[256];/* Error buffer */
8505 :
8506 :
8507 : /* Check for valid grid ID */
8508 : /* ----------------------- */
8509 0 : status = GDchkgdid(gridID, "GDextractregion", &fid, &sdInterfaceID,
8510 : &gdVgrpID);
8511 :
8512 :
8513 : /* Check for valid region ID */
8514 : /* ------------------------- */
8515 0 : if (status == 0)
8516 : {
8517 0 : if (regionID < 0 || regionID >= NGRIDREGN)
8518 : {
8519 0 : status = -1;
8520 0 : HEpush(DFE_RANGE, "GDextractregion", __FILE__, __LINE__);
8521 0 : HEreport("Invalid Region id: %d.\n", regionID);
8522 : }
8523 : }
8524 :
8525 :
8526 : /* Check for active region ID */
8527 : /* -------------------------- */
8528 0 : if (status == 0)
8529 : {
8530 0 : if (GDXRegion[regionID] == 0)
8531 : {
8532 0 : status = -1;
8533 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8534 0 : HEreport("Inactive Region ID: %d.\n", regionID);
8535 : }
8536 : }
8537 :
8538 :
8539 :
8540 : /* Check that region defined for this file */
8541 : /* --------------------------------------- */
8542 0 : if (status == 0)
8543 : {
8544 0 : if (GDXRegion[regionID]->fid != fid)
8545 : {
8546 0 : status = -1;
8547 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8548 0 : HEreport("Region is not defined for this file.\n");
8549 : }
8550 : }
8551 :
8552 :
8553 : /* Check that region defined for this grid */
8554 : /* --------------------------------------- */
8555 0 : if (status == 0)
8556 : {
8557 0 : if (GDXRegion[regionID]->gridID != gridID)
8558 : {
8559 0 : status = -1;
8560 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8561 0 : HEreport("Region is not defined for this Grid.\n");
8562 : }
8563 : }
8564 :
8565 :
8566 :
8567 : /* Check for valid fieldname */
8568 : /* ------------------------- */
8569 0 : if (status == 0)
8570 : {
8571 0 : status = GDfieldinfo(gridID, fieldname, &rank, dims, &ntype, dimlist);
8572 :
8573 0 : if (status != 0)
8574 : {
8575 : /* Fieldname not found in grid */
8576 : /* --------------------------- */
8577 0 : status = -1;
8578 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8579 0 : HEreport("Fieldname \"%s\" not found.\n",
8580 : fieldname);
8581 : }
8582 0 : else if (rank == 1)
8583 : {
8584 : /* Field is 1 dimensional */
8585 : /* ---------------------- */
8586 0 : status = -1;
8587 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8588 0 : HEreport(
8589 : "One-Dimesional fields \"%s\" may not be subsetted.\n",
8590 : fieldname);
8591 : }
8592 : else
8593 : {
8594 : /* "XDim" and/or "YDim" not found */
8595 : /* ------------------------------ */
8596 0 : if (EHstrwithin("XDim", dimlist, ',') == -1 ||
8597 0 : EHstrwithin("YDim", dimlist, ',') == -1)
8598 : {
8599 0 : status = -1;
8600 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8601 0 : snprintf(errbuf, sizeof(errbuf), "%s%s", errM1, errM2);
8602 0 : HEreport(errbuf, fieldname);
8603 : }
8604 : }
8605 : }
8606 :
8607 :
8608 :
8609 0 : if (status == 0)
8610 : {
8611 :
8612 : /* Get origin order info */
8613 : /* --------------------- */
8614 0 : status = GDorigininfo(gridID, &origincode);
8615 :
8616 :
8617 : /* Initialize start & edge arrays */
8618 : /* ------------------------------ */
8619 0 : for (i = 0; i < rank; i++)
8620 : {
8621 0 : start[i] = 0;
8622 0 : edge[i] = dims[i];
8623 : }
8624 :
8625 :
8626 : /* if MISR SOM projection, set start */
8627 : /* & edge arrays for SOMBlockDim */
8628 : /* --------------------------------- */
8629 0 : if (EHstrwithin("SOMBlockDim", dimlist, ',') == 0)
8630 : {
8631 0 : l_index = EHstrwithin("SOMBlockDim", dimlist, ',');
8632 0 : edge[l_index] = GDXRegion[regionID]->somCount;
8633 0 : start[l_index] = GDXRegion[regionID]->somStart;
8634 : }
8635 :
8636 :
8637 : /* Set start & edge arrays for XDim */
8638 : /* -------------------------------- */
8639 0 : l_index = EHstrwithin("XDim", dimlist, ',');
8640 0 : if (GDXRegion[regionID]->xCount != 0)
8641 : {
8642 0 : edge[l_index] = GDXRegion[regionID]->xCount;
8643 0 : start[l_index] = GDXRegion[regionID]->xStart;
8644 : }
8645 :
8646 : /* Adjust X-dim start if origin on right edge */
8647 : /* ------------------------------------------ */
8648 0 : if ((origincode & 1) == 1)
8649 : {
8650 0 : start[l_index] = dims[l_index] - (start[l_index] + edge[l_index]);
8651 : }
8652 :
8653 :
8654 : /* Set start & edge arrays for YDim */
8655 : /* -------------------------------- */
8656 0 : l_index = EHstrwithin("YDim", dimlist, ',');
8657 0 : if (GDXRegion[regionID]->yCount != 0)
8658 : {
8659 0 : start[l_index] = GDXRegion[regionID]->yStart;
8660 0 : edge[l_index] = GDXRegion[regionID]->yCount;
8661 : }
8662 :
8663 : /* Adjust Y-dim start if origin on lower edge */
8664 : /* ------------------------------------------ */
8665 0 : if ((origincode & 2) == 2)
8666 : {
8667 0 : start[l_index] = dims[l_index] - (start[l_index] + edge[l_index]);
8668 : }
8669 :
8670 :
8671 :
8672 : /* Vertical Subset */
8673 : /* --------------- */
8674 0 : for (j = 0; j < 8; j++)
8675 : {
8676 : /* If active vertical subset ... */
8677 : /* ----------------------------- */
8678 0 : if (GDXRegion[regionID]->StartVertical[j] != -1)
8679 : {
8680 :
8681 : /* Find vertical dimension within dimlist */
8682 : /* -------------------------------------- */
8683 0 : l_index = EHstrwithin(GDXRegion[regionID]->DimNamePtr[j],
8684 : dimlist, ',');
8685 :
8686 : /* If dimension found ... */
8687 : /* ---------------------- */
8688 0 : if (l_index != -1)
8689 : {
8690 : /* Compute start and edge for vertical dimension */
8691 : /* --------------------------------------------- */
8692 0 : start[l_index] = GDXRegion[regionID]->StartVertical[j];
8693 0 : edge[l_index] = GDXRegion[regionID]->StopVertical[j] -
8694 0 : GDXRegion[regionID]->StartVertical[j] + 1;
8695 : }
8696 : else
8697 : {
8698 : /* Vertical dimension not found */
8699 : /* ---------------------------- */
8700 0 : status = -1;
8701 0 : HEpush(DFE_GENAPP, "GDextractregion", __FILE__, __LINE__);
8702 0 : HEreport(errMesg,
8703 0 : GDXRegion[regionID]->DimNamePtr[j]);
8704 : }
8705 : }
8706 : }
8707 :
8708 :
8709 : /* Read into data buffer */
8710 : /* --------------------- */
8711 0 : if (status == 0)
8712 : {
8713 0 : status = GDreadfield(gridID, fieldname, start, NULL, edge, buffer);
8714 : }
8715 : }
8716 0 : return (status);
8717 : }
8718 :
8719 :
8720 :
8721 :
8722 : /*----------------------------------------------------------------------------|
8723 : | BEGIN_PROLOG |
8724 : | |
8725 : | FUNCTION: GDdupregion |
8726 : | |
8727 : | DESCRIPTION: Duplicates a region |
8728 : | |
8729 : | |
8730 : | Return Value Type Units Description |
8731 : | ============ ====== ========= ===================================== |
8732 : | newregionID int32 New region ID |
8733 : | |
8734 : | INPUTS: |
8735 : | oldregionID int32 Old region ID |
8736 : | |
8737 : | OUTPUTS: |
8738 : | None |
8739 : | |
8740 : | NOTES: |
8741 : | |
8742 : | |
8743 : | Date Programmer Description |
8744 : | ====== ============ ================================================= |
8745 : | Jan 97 Joel Gales Original Programmer |
8746 : | Oct 98 Abe Taaheri changed *GDXRegion[i] = *GDXRegion[oldregionID]; |
8747 : | to copy elements of structure one by one to avoid |
8748 : | copying pointer for DimNamePtr to another place that|
8749 : | causes "Freeing Unallocated Memory" in purify when |
8750 : | using GDdetach |
8751 : | |
8752 : | END_PROLOG |
8753 : -----------------------------------------------------------------------------*/
8754 : int32
8755 0 : GDdupregion(int32 oldregionID)
8756 : {
8757 : intn i; /* Loop index */
8758 : intn j; /* Loop index */
8759 : int32 slendupregion;
8760 0 : int32 newregionID = -1; /* New region ID */
8761 :
8762 :
8763 : /* Find first empty (inactive) region */
8764 : /* ---------------------------------- */
8765 0 : for (i = 0; i < NGRIDREGN; i++)
8766 : {
8767 0 : if (GDXRegion[i] == 0)
8768 : {
8769 : /* Allocate space for new grid region entry */
8770 : /* ---------------------------------------- */
8771 0 : GDXRegion[i] = (struct gridRegion *)
8772 0 : calloc(1, sizeof(struct gridRegion));
8773 0 : if(GDXRegion[i] == NULL)
8774 : {
8775 0 : HEpush(DFE_NOSPACE,"GDdupregion", __FILE__, __LINE__);
8776 0 : return(-1);
8777 : }
8778 :
8779 :
8780 : /* Copy old region structure data to new region */
8781 : /* -------------------------------------------- */
8782 :
8783 0 : GDXRegion[i]->fid = GDXRegion[oldregionID]->fid;
8784 0 : GDXRegion[i]->gridID = GDXRegion[oldregionID]->gridID;
8785 0 : GDXRegion[i]->xStart = GDXRegion[oldregionID]->xStart;
8786 0 : GDXRegion[i]->xCount = GDXRegion[oldregionID]->xCount;
8787 0 : GDXRegion[i]->yStart = GDXRegion[oldregionID]->yStart;
8788 0 : GDXRegion[i]->yCount = GDXRegion[oldregionID]->yCount;
8789 0 : GDXRegion[i]->upleftpt[0] = GDXRegion[oldregionID]->upleftpt[0];
8790 0 : GDXRegion[i]->upleftpt[1] = GDXRegion[oldregionID]->upleftpt[1];
8791 0 : GDXRegion[i]->lowrightpt[0] = GDXRegion[oldregionID]->lowrightpt[0];
8792 0 : GDXRegion[i]->lowrightpt[1] = GDXRegion[oldregionID]->lowrightpt[1];
8793 0 : for (j = 0; j < 8; j++)
8794 : {
8795 0 : GDXRegion[i]->StartVertical[j] = GDXRegion[oldregionID]->StartVertical[j];
8796 0 : GDXRegion[i]->StopVertical[j] = GDXRegion[oldregionID]->StopVertical[j];
8797 : }
8798 :
8799 0 : for (j=0; j<8; j++)
8800 : {
8801 0 : if(GDXRegion[oldregionID]->DimNamePtr[j] != NULL)
8802 : {
8803 0 : slendupregion = (int)strlen(GDXRegion[oldregionID]->DimNamePtr[j]);
8804 0 : GDXRegion[i]->DimNamePtr[j] = (char *) malloc(slendupregion + 1);
8805 0 : strcpy(GDXRegion[i]->DimNamePtr[j],GDXRegion[oldregionID]->DimNamePtr[j]);
8806 : }
8807 : }
8808 :
8809 :
8810 : /* Define new region ID */
8811 : /* -------------------- */
8812 0 : newregionID = i;
8813 :
8814 0 : break;
8815 : }
8816 : }
8817 0 : return (newregionID);
8818 : }
8819 :
8820 :
8821 : /*----------------------------------------------------------------------------|
8822 : | BEGIN_PROLOG |
8823 : | |
8824 : | FUNCTION: GDdefvrtregion |
8825 : | |
8826 : | DESCRIPTION: Finds elements of a monotonic field within a vertical subset |
8827 : | region. |
8828 : | |
8829 : | |
8830 : | Return Value Type Units Description |
8831 : | ============ ====== ========= ===================================== |
8832 : | regionID int32 Region ID |
8833 : | |
8834 : | INPUTS: |
8835 : | gridID int32 Grid structure ID |
8836 : | regionID int32 Region ID |
8837 : | vertObj char Vertical object to subset |
8838 : | range float64 Vertical subsetting range |
8839 : | |
8840 : | OUTPUTS: |
8841 : | None |
8842 : | |
8843 : | NOTES: |
8844 : | |
8845 : | |
8846 : | Date Programmer Description |
8847 : | ====== ============ ================================================= |
8848 : | Aug 96 Joel Gales Original Programmer |
8849 : | Dec 96 Joel Gales Add multiple vertical subsetting capability |
8850 : | Feb 97 Joel Gales Store XDim, YDim, upleftpt, lowrightpt in GDXRegion |
8851 : | |
8852 : | END_PROLOG |
8853 : -----------------------------------------------------------------------------*/
8854 : #define SETGRIDREG \
8855 : \
8856 : status = GDgridinfo(gridID, &xdimsize, &ydimsize, upleftpt, lowrightpt); \
8857 : for (k = 0; k < NGRIDREGN; k++) \
8858 : { \
8859 : if (GDXRegion[k] == 0) \
8860 : { \
8861 : GDXRegion[k] = (struct gridRegion *) \
8862 : calloc(1, sizeof(struct gridRegion)); \
8863 : GDXRegion[k]->fid = fid; \
8864 : GDXRegion[k]->gridID = gridID; \
8865 : GDXRegion[k]->xStart = 0; \
8866 : GDXRegion[k]->xCount = xdimsize; \
8867 : GDXRegion[k]->yStart = 0; \
8868 : GDXRegion[k]->yCount = ydimsize; \
8869 : GDXRegion[k]->upleftpt[0] = upleftpt[0]; \
8870 : GDXRegion[k]->upleftpt[1] = upleftpt[1]; \
8871 : GDXRegion[k]->lowrightpt[0] = lowrightpt[0]; \
8872 : GDXRegion[k]->lowrightpt[1] = lowrightpt[1]; \
8873 : regionID = k; \
8874 : for (j=0; j<8; j++) \
8875 : { \
8876 : GDXRegion[k]->StartVertical[j] = -1; \
8877 : GDXRegion[k]->StopVertical[j] = -1; \
8878 : } \
8879 : break; \
8880 : } \
8881 : }
8882 :
8883 : #define FILLVERTREG \
8884 : for (j=0; j<8; j++) \
8885 : { \
8886 : if (GDXRegion[regionID]->StartVertical[j] == -1) \
8887 : { \
8888 : GDXRegion[regionID]->StartVertical[j] = i; \
8889 : GDXRegion[regionID]->DimNamePtr[j] = \
8890 : (char *) malloc(slen + 1); \
8891 : memcpy(GDXRegion[regionID]->DimNamePtr[j], \
8892 : dimlist, slen + 1); \
8893 : break; \
8894 : } \
8895 : } \
8896 :
8897 :
8898 :
8899 : int32
8900 0 : GDdefvrtregion(int32 gridID, int32 regionID, const char *vertObj, float64 range[])
8901 : {
8902 0 : intn i, j = 0, k, status;
8903 0 : uint8 found = 0;
8904 :
8905 : int16 vertINT16;
8906 :
8907 : int32 fid, sdInterfaceID, slen;
8908 : int32 gdVgrpID, rank, nt, dims[8], size;
8909 : int32 vertINT32;
8910 : int32 xdimsize;
8911 : int32 ydimsize;
8912 :
8913 : float32 vertFLT32;
8914 : float64 vertFLT64;
8915 : float64 upleftpt[2];
8916 : float64 lowrightpt[2];
8917 :
8918 : char *vertArr;
8919 : char *dimlist;
8920 :
8921 : /* Allocate space for dimlist */
8922 : /* --------------------------------- */
8923 0 : dimlist = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
8924 0 : if(dimlist == NULL)
8925 : {
8926 0 : HEpush(DFE_NOSPACE,"GDdefvrtregion", __FILE__, __LINE__);
8927 0 : return(-1);
8928 : }
8929 : /* Check for valid grid ID */
8930 : /* ----------------------- */
8931 0 : status = GDchkgdid(gridID, "GDdefvrtregion",
8932 : &fid, &sdInterfaceID, &gdVgrpID);
8933 :
8934 0 : if (status == 0)
8935 : {
8936 0 : memcpy(dimlist, vertObj, 4);
8937 0 : dimlist[4] = 0;
8938 :
8939 0 : if (strcmp(dimlist, "DIM:") == 0)
8940 : {
8941 0 : slen = (int)strlen(vertObj) - 4;
8942 0 : if (regionID == -1)
8943 : {
8944 0 : SETGRIDREG;
8945 : }
8946 0 : for (j = 0; j < 8; j++)
8947 : {
8948 0 : if (GDXRegion[regionID]->StartVertical[j] == -1)
8949 : {
8950 0 : GDXRegion[regionID]->StartVertical[j] = (int32) range[0];
8951 0 : GDXRegion[regionID]->StopVertical[j] = (int32) range[1];
8952 0 : GDXRegion[regionID]->DimNamePtr[j] =
8953 0 : (char *) malloc(slen + 1);
8954 0 : if(GDXRegion[regionID]->DimNamePtr[j] == NULL)
8955 : {
8956 0 : HEpush(DFE_NOSPACE,"GDdefvrtregion", __FILE__, __LINE__);
8957 0 : free(dimlist);
8958 0 : return(-1);
8959 : }
8960 0 : memcpy(GDXRegion[regionID]->DimNamePtr[j],
8961 0 : vertObj + 4, slen + 1);
8962 0 : break;
8963 : }
8964 : }
8965 : }
8966 : else
8967 : {
8968 0 : status = GDfieldinfo(gridID, vertObj, &rank, dims, &nt, dimlist);
8969 0 : if (status != 0)
8970 : {
8971 0 : status = -1;
8972 0 : HEpush(DFE_GENAPP, "GDdefvrtregion", __FILE__, __LINE__);
8973 0 : HEreport("Vertical Field: \"%s\" not found.\n", vertObj);
8974 : }
8975 : else
8976 : {
8977 0 : if (rank != 1)
8978 : {
8979 0 : status = -1;
8980 0 : HEpush(DFE_GENAPP, "GDdefvrtregion", __FILE__, __LINE__);
8981 0 : HEreport("Vertical Field: \"%s\" must be 1-dim.\n",
8982 : vertObj);
8983 : }
8984 : else
8985 : {
8986 0 : slen = (int)strlen(dimlist);
8987 0 : size = DFKNTsize(nt);
8988 0 : vertArr = (char *) calloc(dims[0], size);
8989 0 : if(vertArr == NULL)
8990 : {
8991 0 : HEpush(DFE_NOSPACE,"GDdefvrtregion", __FILE__, __LINE__);
8992 0 : free(dimlist);
8993 0 : return(-1);
8994 : }
8995 :
8996 0 : status = GDreadfield(gridID, vertObj,
8997 : NULL, NULL, NULL, vertArr);
8998 :
8999 0 : switch (nt)
9000 : {
9001 0 : case DFNT_INT16:
9002 :
9003 0 : for (i = 0; i < dims[0]; i++)
9004 : {
9005 0 : memcpy(&vertINT16, vertArr + i * size, size);
9006 :
9007 0 : if (vertINT16 >= range[0] &&
9008 0 : vertINT16 <= range[1])
9009 : {
9010 0 : found = 1;
9011 0 : if (regionID == -1)
9012 : {
9013 0 : SETGRIDREG;
9014 : }
9015 0 : FILLVERTREG;
9016 :
9017 0 : break;
9018 : }
9019 : }
9020 :
9021 0 : if (found == 1)
9022 : {
9023 0 : for (i = dims[0] - 1; i >= 0; i--)
9024 : {
9025 0 : memcpy(&vertINT16, vertArr + i * size, size);
9026 :
9027 0 : if (vertINT16 >= range[0] &&
9028 0 : vertINT16 <= range[1])
9029 : {
9030 0 : GDXRegion[regionID]->StopVertical[j] = i;
9031 0 : break;
9032 : }
9033 : }
9034 : }
9035 : else
9036 : {
9037 0 : status = -1;
9038 : }
9039 0 : break;
9040 :
9041 :
9042 0 : case DFNT_INT32:
9043 :
9044 0 : for (i = 0; i < dims[0]; i++)
9045 : {
9046 0 : memcpy(&vertINT32, vertArr + i * size, size);
9047 :
9048 0 : if (vertINT32 >= range[0] &&
9049 0 : vertINT32 <= range[1])
9050 : {
9051 0 : found = 1;
9052 0 : if (regionID == -1)
9053 : {
9054 0 : SETGRIDREG;
9055 : }
9056 0 : FILLVERTREG;
9057 :
9058 0 : break;
9059 : }
9060 : }
9061 :
9062 0 : if (found == 1)
9063 : {
9064 0 : for (i = dims[0] - 1; i >= 0; i--)
9065 : {
9066 0 : memcpy(&vertINT32, vertArr + i * size, size);
9067 :
9068 0 : if (vertINT32 >= range[0] &&
9069 0 : vertINT32 <= range[1])
9070 : {
9071 0 : GDXRegion[regionID]->StopVertical[j] = i;
9072 0 : break;
9073 : }
9074 : }
9075 : }
9076 : else
9077 : {
9078 0 : status = -1;
9079 : }
9080 0 : break;
9081 :
9082 :
9083 0 : case DFNT_FLOAT32:
9084 :
9085 0 : for (i = 0; i < dims[0]; i++)
9086 : {
9087 0 : memcpy(&vertFLT32, vertArr + i * size, size);
9088 :
9089 0 : if (vertFLT32 >= range[0] &&
9090 0 : vertFLT32 <= range[1])
9091 : {
9092 0 : found = 1;
9093 0 : if (regionID == -1)
9094 : {
9095 0 : SETGRIDREG;
9096 : }
9097 0 : FILLVERTREG;
9098 :
9099 0 : break;
9100 : }
9101 : }
9102 :
9103 0 : if (found == 1)
9104 : {
9105 0 : for (i = dims[0] - 1; i >= 0; i--)
9106 : {
9107 0 : memcpy(&vertFLT32, vertArr + i * size, size);
9108 :
9109 0 : if (vertFLT32 >= range[0] &&
9110 0 : vertFLT32 <= range[1])
9111 : {
9112 0 : GDXRegion[regionID]->StopVertical[j] = i;
9113 0 : break;
9114 : }
9115 : }
9116 : }
9117 : else
9118 : {
9119 0 : status = -1;
9120 : }
9121 0 : break;
9122 :
9123 :
9124 0 : case DFNT_FLOAT64:
9125 :
9126 0 : for (i = 0; i < dims[0]; i++)
9127 : {
9128 0 : memcpy(&vertFLT64, vertArr + i * size, size);
9129 :
9130 0 : if (vertFLT64 >= range[0] &&
9131 0 : vertFLT64 <= range[1])
9132 : {
9133 0 : found = 1;
9134 0 : if (regionID == -1)
9135 : {
9136 0 : SETGRIDREG;
9137 : }
9138 0 : FILLVERTREG;
9139 :
9140 0 : break;
9141 : }
9142 : }
9143 :
9144 0 : if (found == 1)
9145 : {
9146 0 : for (i = dims[0] - 1; i >= 0; i--)
9147 : {
9148 0 : memcpy(&vertFLT64, vertArr + i * size, size);
9149 :
9150 0 : if (vertFLT64 >= range[0] &&
9151 0 : vertFLT64 <= range[1])
9152 : {
9153 0 : GDXRegion[regionID]->StopVertical[j] = i;
9154 0 : break;
9155 : }
9156 : }
9157 : }
9158 : else
9159 : {
9160 0 : status = -1;
9161 : }
9162 0 : break;
9163 :
9164 : }
9165 0 : free(vertArr);
9166 : }
9167 : }
9168 : }
9169 : }
9170 0 : if (status == -1)
9171 : {
9172 0 : regionID = -1;
9173 : }
9174 0 : free(dimlist);
9175 0 : return (regionID);
9176 : }
9177 :
9178 :
9179 :
9180 :
9181 :
9182 : /*----------------------------------------------------------------------------|
9183 : | BEGIN_PROLOG |
9184 : | |
9185 : | FUNCTION: GDdeftimeperiod |
9186 : | |
9187 : | DESCRIPTION: Finds elements of the "Time" field within a given time |
9188 : | period. |
9189 : | |
9190 : | |
9191 : | Return Value Type Units Description |
9192 : | ============ ====== ========= ===================================== |
9193 : | periodID int32 Period ID |
9194 : | |
9195 : | INPUTS: |
9196 : | gridID int32 Grid structure ID |
9197 : | periodID int32 Period ID |
9198 : | starttime float64 TAI sec Start of time period |
9199 : | stoptime float64 TAI sec Stop of time period |
9200 : | |
9201 : | OUTPUTS: |
9202 : | None |
9203 : | |
9204 : | NOTES: |
9205 : | |
9206 : | |
9207 : | Date Programmer Description |
9208 : | ====== ============ ================================================= |
9209 : | Aug 96 Joel Gales Original Programmer |
9210 : | |
9211 : | END_PROLOG |
9212 : -----------------------------------------------------------------------------*/
9213 : int32
9214 0 : GDdeftimeperiod(int32 gridID, int32 periodID, float64 starttime,
9215 : float64 stoptime)
9216 : {
9217 : float64 timerange[2];
9218 :
9219 0 : timerange[0] = starttime;
9220 0 : timerange[1] = stoptime;
9221 :
9222 0 : periodID = GDdefvrtregion(gridID, periodID, "Time", timerange);
9223 :
9224 0 : return (periodID);
9225 : }
9226 :
9227 :
9228 :
9229 : /*----------------------------------------------------------------------------|
9230 : | BEGIN_PROLOG |
9231 : | |
9232 : | FUNCTION: GDgetpixels |
9233 : | |
9234 : | DESCRIPTION: Finds row and columns for specified lon/lat values |
9235 : | |
9236 : | |
9237 : | Return Value Type Units Description |
9238 : | ============ ====== ========= ===================================== |
9239 : | status intn return status (0) SUCCEED, (-1) FAIL |
9240 : | |
9241 : | INPUTS: |
9242 : | gridID int32 Grid structure ID |
9243 : | nLonLat int32 Number of lonlat values |
9244 : | lonVal float64 dec deg Longitude values |
9245 : | latVal float64 dec deg Latitude values |
9246 : | |
9247 : | |
9248 : | OUTPUTS: |
9249 : | pixRow int32 Pixel rows |
9250 : | pixCol int32 Pixel columns |
9251 : | |
9252 : | NOTES: |
9253 : | |
9254 : | |
9255 : | Date Programmer Description |
9256 : | ====== ============ ================================================= |
9257 : | Aug 96 Joel Gales Original Programmer |
9258 : | Oct 96 Joel Gales Set row/col to -1 if outside boundary |
9259 : | Mar 97 Joel Gales Adjust row/col for CORNER pixel registration |
9260 : | |
9261 : | END_PROLOG |
9262 : -----------------------------------------------------------------------------*/
9263 : intn
9264 0 : GDgetpixels(int32 gridID, int32 nLonLat, float64 lonVal[], float64 latVal[],
9265 : int32 pixRow[], int32 pixCol[])
9266 : {
9267 : intn i; /* Loop index */
9268 0 : intn status = 0; /* routine return status variable */
9269 :
9270 : int32 fid; /* HDF-EOS file ID */
9271 : int32 sdInterfaceID; /* HDF SDS interface ID */
9272 : int32 gdVgrpID; /* Grid root Vgroup ID */
9273 :
9274 : int32 xdimsize; /* Size of "XDim" */
9275 : int32 ydimsize; /* Size of "YDim" */
9276 : int32 projcode; /* GCTP projection code */
9277 : int32 zonecode; /* Zone code */
9278 : int32 spherecode; /* Sphere code */
9279 : int32 origincode; /* Origin code */
9280 : int32 pixregcode; /* Pixel registration code */
9281 :
9282 : float64 upleftpt[2];/* Upper left point */
9283 : float64 lowrightpt[2]; /* Lower right point */
9284 : float64 projparm[16]; /* Projection parameters */
9285 : float64 *xVal; /* Pointer to point x location values */
9286 : float64 *yVal; /* Pointer to point y location values */
9287 :
9288 :
9289 : /* Check for valid grid ID */
9290 : /* ----------------------- */
9291 0 : status = GDchkgdid(gridID, "GDgetpixels", &fid, &sdInterfaceID, &gdVgrpID);
9292 :
9293 0 : if (status == 0)
9294 : {
9295 : /* Get grid info */
9296 : /* ------------- */
9297 0 : status = GDgridinfo(gridID, &xdimsize, &ydimsize,
9298 : upleftpt, lowrightpt);
9299 :
9300 :
9301 : /* Get projection info */
9302 : /* ------------------- */
9303 0 : status = GDprojinfo(gridID, &projcode, &zonecode,
9304 : &spherecode, projparm);
9305 :
9306 :
9307 : /* Get explicit upleftpt & lowrightpt if defaults are used */
9308 : /* ------------------------------------------------------- */
9309 0 : status = GDgetdefaults(projcode, zonecode, projparm, spherecode,
9310 : upleftpt, lowrightpt);
9311 :
9312 :
9313 : /* Get pixel registration and origin info */
9314 : /* -------------------------------------- */
9315 0 : status = GDorigininfo(gridID, &origincode);
9316 0 : status = GDpixreginfo(gridID, &pixregcode);
9317 :
9318 :
9319 : /* Allocate space for x & y locations */
9320 : /* ---------------------------------- */
9321 0 : xVal = (float64 *) calloc(nLonLat, sizeof(float64));
9322 0 : if(xVal == NULL)
9323 : {
9324 0 : HEpush(DFE_NOSPACE,"GDgetpixels", __FILE__, __LINE__);
9325 0 : return(-1);
9326 : }
9327 0 : yVal = (float64 *) calloc(nLonLat, sizeof(float64));
9328 0 : if(yVal == NULL)
9329 : {
9330 0 : HEpush(DFE_NOSPACE,"GDgetpixels", __FILE__, __LINE__);
9331 0 : free(xVal);
9332 0 : return(-1);
9333 : }
9334 :
9335 :
9336 : /* Get pixRow, pixCol, xVal, & yVal */
9337 : /* -------------------------------- */
9338 0 : status = GDll2ij(projcode, zonecode, projparm, spherecode,
9339 : xdimsize, ydimsize, upleftpt, lowrightpt,
9340 : nLonLat, lonVal, latVal, pixRow, pixCol,
9341 : xVal, yVal);
9342 :
9343 :
9344 :
9345 : /* Loop through all lon/lat values */
9346 : /* ------------------------------- */
9347 0 : for (i = 0; i < nLonLat; i++)
9348 : {
9349 : /* Adjust columns & rows for "corner" registered grids */
9350 : /* --------------------------------------------------- */
9351 0 : if (pixregcode == HDFE_CORNER)
9352 : {
9353 0 : if (origincode == HDFE_GD_UL)
9354 : {
9355 0 : if (xVal[i] - pixCol[i] > 0.5)
9356 : {
9357 0 : ++pixCol[i];
9358 : }
9359 :
9360 0 : if (yVal[i] - pixRow[i] > 0.5)
9361 : {
9362 0 : ++pixRow[i];
9363 : }
9364 : }
9365 0 : else if (origincode == HDFE_GD_UR)
9366 : {
9367 0 : if (xVal[i] - pixCol[i] <= 0.5)
9368 : {
9369 0 : --pixCol[i];
9370 : }
9371 :
9372 0 : if (yVal[i] - pixRow[i] > 0.5)
9373 : {
9374 0 : ++pixRow[i];
9375 : }
9376 : }
9377 0 : else if (origincode == HDFE_GD_LL)
9378 : {
9379 0 : if (xVal[i] - pixCol[i] > 0.5)
9380 : {
9381 0 : ++pixCol[i];
9382 : }
9383 :
9384 0 : if (yVal[i] - pixRow[i] <= 0.5)
9385 : {
9386 0 : --pixRow[i];
9387 : }
9388 : }
9389 0 : else if (origincode == HDFE_GD_LR)
9390 : {
9391 0 : if (xVal[i] - pixCol[i] <= 0.5)
9392 : {
9393 0 : --pixCol[i];
9394 : }
9395 :
9396 0 : if (yVal[i] - pixRow[i] <= 0.5)
9397 : {
9398 0 : --pixRow[i];
9399 : }
9400 : }
9401 : }
9402 :
9403 :
9404 : /* If outside grid boundaries then set to -1 */
9405 : /* ----------------------------------------- */
9406 0 : if (pixCol[i] < 0 || pixCol[i] >= xdimsize ||
9407 0 : pixRow[i] < 0 || pixRow[i] >= ydimsize)
9408 : {
9409 0 : pixCol[i] = -1;
9410 0 : pixRow[i] = -1;
9411 : }
9412 : }
9413 0 : free(xVal);
9414 0 : free(yVal);
9415 : }
9416 0 : return (status);
9417 : }
9418 :
9419 :
9420 :
9421 :
9422 :
9423 : /*----------------------------------------------------------------------------|
9424 : | BEGIN_PROLOG |
9425 : | |
9426 : | FUNCTION: GDgetpixvalues |
9427 : | |
9428 : | DESCRIPTION: Retrieves data from specified pixels. |
9429 : | |
9430 : | |
9431 : | Return Value Type Units Description |
9432 : | ============ ====== ========= ===================================== |
9433 : | size*nPixels int32 Size of data buffer |
9434 : | |
9435 : | INPUTS: |
9436 : | gridID int32 Grid structure ID |
9437 : | nPixels int32 Number of pixels |
9438 : | pixRow int32 Pixel row numbers |
9439 : | pixCol int32 Pixel column numbers |
9440 : | fieldname char Fieldname |
9441 : | |
9442 : | OUTPUTS: |
9443 : | buffer void Data buffer |
9444 : | |
9445 : | |
9446 : | NOTES: |
9447 : | |
9448 : | |
9449 : | Date Programmer Description |
9450 : | ====== ============ ================================================= |
9451 : | Aug 96 Joel Gales Original Programmer |
9452 : | Oct 96 Joel Gales Check for pixels outside boundaries (-1) |
9453 : | Mar 98 Abe Taaheri revised to reduce overhead for rechecking |
9454 : | for gridid, fieldname, etc in GDreadfield. |
9455 : | June 98 AT fixed bug with 2-dim field merged in 3-dim field |
9456 : | (for offset and count) |
9457 : | END_PROLOG |
9458 : -----------------------------------------------------------------------------*/
9459 : int32
9460 0 : GDgetpixvalues(int32 gridID, int32 nPixels, int32 pixRow[], int32 pixCol[],
9461 : const char *fieldname, VOIDP buffer)
9462 : {
9463 : intn i; /* Loop index */
9464 : intn j; /* Loop index */
9465 0 : intn status = 0; /* routine return status variable */
9466 :
9467 : int32 fid; /* HDF-EOS file ID */
9468 : int32 sdInterfaceID; /* HDF SDS interface ID */
9469 : int32 gdVgrpID; /* Grid root Vgroup ID */
9470 :
9471 : int32 start[8]; /* GDreadfield start array */
9472 : int32 edge[8]; /* GDreadfield edge array */
9473 : int32 dims[8]; /* Field dimensions */
9474 : int32 rank; /* Field rank */
9475 0 : int32 xdum = 0; /* Location of "XDim" within field list */
9476 0 : int32 ydum = 0; /* Location of "YDim" within field list */
9477 : int32 ntype; /* Field number type */
9478 : int32 origincode; /* Origin code */
9479 : int32 bufOffset; /* Data buffer offset */
9480 0 : int32 size = 0; /* Size of returned data buffer for each
9481 : * value in bytes */
9482 : int32 offset[8]; /* I/O offset (start) */
9483 : int32 incr[8]; /* I/O increment (stride) */
9484 : int32 count[8]; /* I/O count (edge) */
9485 : int32 sdid; /* SDS ID */
9486 : int32 rankSDS; /* Rank of SDS */
9487 : int32 rankFld; /* Rank of field */
9488 : int32 dum; /* Dummy variable */
9489 : int32 mrgOffset; /* Merged field offset */
9490 :
9491 : char *dimlist; /* Dimension list */
9492 :
9493 :
9494 :
9495 : /* Allocate space for dimlist */
9496 : /* --------------------------------- */
9497 0 : dimlist = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
9498 0 : if(dimlist == NULL)
9499 : {
9500 0 : HEpush(DFE_NOSPACE,"GDgetpixvalues", __FILE__, __LINE__);
9501 0 : return(-1);
9502 : }
9503 : /* Check for valid grid ID */
9504 : /* ----------------------- */
9505 0 : status = GDchkgdid(gridID, "GDgetpixvalues",
9506 : &fid, &sdInterfaceID, &gdVgrpID);
9507 :
9508 :
9509 0 : if (status == 0)
9510 : {
9511 : /* Get field list */
9512 : /* -------------- */
9513 0 : status = GDfieldinfo(gridID, fieldname, &rank, dims, &ntype, dimlist);
9514 :
9515 :
9516 : /* Check for "XDim" & "YDim" in dimension list */
9517 : /* ------------------------------------------- */
9518 0 : if (status == 0)
9519 : {
9520 0 : xdum = EHstrwithin("XDim", dimlist, ',');
9521 0 : ydum = EHstrwithin("YDim", dimlist, ',');
9522 :
9523 0 : if (xdum == -1)
9524 : {
9525 0 : status = -1;
9526 0 : HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
9527 0 : HEreport(
9528 : "\"XDim\" not present in dimlist for field: \"%s\".\n",
9529 : fieldname);
9530 : }
9531 :
9532 :
9533 0 : if (ydum == -1)
9534 : {
9535 0 : status = -1;
9536 0 : HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
9537 0 : HEreport(
9538 : "\"YDim\" not present in dimlist for field: \"%s\".\n",
9539 : fieldname);
9540 : }
9541 : }
9542 : else
9543 : {
9544 0 : status = -1;
9545 0 : HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
9546 0 : HEreport("Fieldname \"%s\" not found.\n", fieldname);
9547 : }
9548 :
9549 :
9550 0 : if (status == 0)
9551 : {
9552 :
9553 : /* Get origin order info */
9554 : /* --------------------- */
9555 0 : status = GDorigininfo(gridID, &origincode);
9556 :
9557 :
9558 : /* Initialize start & edge arrays */
9559 : /* ------------------------------ */
9560 0 : for (i = 0; i < rank; i++)
9561 : {
9562 0 : start[i] = 0;
9563 0 : edge[i] = dims[i];
9564 : }
9565 :
9566 :
9567 : /* Compute size of data buffer for each pixel */
9568 : /* ------------------------------------------ */
9569 0 : edge[xdum] = 1;
9570 0 : edge[ydum] = 1;
9571 0 : size = edge[0];
9572 0 : for (j = 1; j < rank; j++)
9573 : {
9574 0 : size *= edge[j];
9575 : }
9576 0 : size *= DFKNTsize(ntype);
9577 :
9578 :
9579 :
9580 : /* If data values are requested ... */
9581 : /* -------------------------------- */
9582 0 : if (buffer != NULL)
9583 : {
9584 : /* get sdid */
9585 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
9586 : &rankSDS, &rankFld, &mrgOffset, dims, &dum);
9587 :
9588 : /* Loop through all pixels */
9589 : /* ----------------------- */
9590 0 : for (i = 0; i < nPixels; i++)
9591 : {
9592 : /* Conmpute offset within returned data buffer */
9593 : /* ------------------------------------------- */
9594 0 : bufOffset = size * i;
9595 :
9596 :
9597 : /* If pixel row & column OK ... */
9598 : /* ---------------------------- */
9599 0 : if (pixCol[i] != -1 && pixRow[i] != -1)
9600 : {
9601 0 : start[xdum] = pixCol[i];
9602 0 : start[ydum] = pixRow[i];
9603 :
9604 :
9605 : /* Adjust X-dim start if origin on right edge */
9606 : /* ------------------------------------------ */
9607 0 : if ((origincode & 1) == 1)
9608 : {
9609 0 : start[xdum] = dims[xdum] - (start[xdum] + 1);
9610 : }
9611 :
9612 :
9613 : /* Adjust Y-dim start if origin on lower edge */
9614 : /* ------------------------------------------ */
9615 0 : if ((origincode & 2) == 2)
9616 : {
9617 0 : start[ydum] = dims[ydum] - (start[ydum] + 1);
9618 : }
9619 :
9620 : /* Set I/O offset and count Section */
9621 : /* ---------------------- */
9622 :
9623 : /*
9624 : * start and edge != NULL, set I/O offset and count to
9625 : * user values, adjusting the
9626 : * 0th field with the merged field offset (if any)
9627 : */
9628 0 : if (rankFld == rankSDS)
9629 : {
9630 0 : for (j = 0; j < rankSDS; j++)
9631 : {
9632 0 : offset[j] = start[j];
9633 0 : count[j] = edge[j];
9634 : }
9635 0 : offset[0] += mrgOffset;
9636 : }
9637 : else
9638 : {
9639 : /*
9640 : * If field really 2-dim merged in 3-dim field then set
9641 : * 0th field offset to merge offset and then next two to
9642 : * the user values
9643 : */
9644 0 : for (j = 0; j < rankFld; j++)
9645 : {
9646 0 : offset[j + 1] = start[j];
9647 0 : count[j + 1] = edge[j];
9648 : }
9649 0 : offset[0] = mrgOffset;
9650 0 : count[0] = 1;
9651 : }
9652 :
9653 :
9654 :
9655 : /* Set I/O stride Section */
9656 : /* ---------------------- */
9657 :
9658 : /* In original code stride entered as NULL.
9659 : Abe Taaheri June 12, 1998 */
9660 : /*
9661 : * If stride == NULL (default) set I/O stride to 1
9662 : */
9663 0 : for (j = 0; j < rankSDS; j++)
9664 : {
9665 0 : incr[j] = 1;
9666 : }
9667 :
9668 :
9669 : /* Read into data buffer */
9670 : /* --------------------- */
9671 0 : status = SDreaddata(sdid,
9672 : offset, incr, count,
9673 : (VOIDP) ((uint8 *) buffer + bufOffset));
9674 : }
9675 : }
9676 : }
9677 : }
9678 : }
9679 :
9680 :
9681 : /* If successful return size of returned data in bytes */
9682 : /* --------------------------------------------------- */
9683 0 : if (status == 0)
9684 : {
9685 0 : free(dimlist);
9686 0 : return (size * nPixels);
9687 : }
9688 : else
9689 : {
9690 0 : free(dimlist);
9691 0 : return ((int32) status);
9692 : }
9693 : }
9694 :
9695 :
9696 : /*----------------------------------------------------------------------------|
9697 : | BEGIN_PROLOG |
9698 : | |
9699 : | FUNCTION: GDinterpolate |
9700 : | |
9701 : | DESCRIPTION: Performs bilinear interpolate on a set of xy values |
9702 : | |
9703 : | |
9704 : | Return Value Type Units Description |
9705 : | ============ ====== ========= ===================================== |
9706 : | nRetn*nValues* int32 Size of data buffer |
9707 : | sizeof(float64) |
9708 : | |
9709 : | INPUTS: |
9710 : | gridID int32 Grid structure ID |
9711 : | nValues int32 Number of lon/lat points to interpolate |
9712 : | xyValues float64 XY values of points to interpolate |
9713 : | fieldname char Fieldname |
9714 : | |
9715 : | OUTPUTS: |
9716 : | interpVal float64 Interpolated Data Values |
9717 : | |
9718 : | |
9719 : | NOTES: |
9720 : | |
9721 : | |
9722 : | Date Programmer Description |
9723 : | ====== ============ ================================================= |
9724 : | Aug 96 Joel Gales Original Programmer |
9725 : | Oct 96 Joel Gales Fix array l_index problem with interpVal write |
9726 : | Apr 97 Joel Gales Trap interpolation boundary out of bounds error |
9727 : | Jun 98 Abe Taaheri changed the return value so that the Return Value |
9728 : | is size in bytes for the data buffer which is |
9729 : | float64.
9730 : | |
9731 : | END_PROLOG |
9732 : -----------------------------------------------------------------------------*/
9733 : int32
9734 0 : GDinterpolate(int32 gridID, int32 nValues, float64 lonVal[], float64 latVal[],
9735 : const char *fieldname, float64 interpVal[])
9736 : {
9737 : intn i; /* Loop index */
9738 : intn j; /* Loop index */
9739 : intn k; /* Loop index */
9740 0 : intn status = 0; /* routine return status variable */
9741 :
9742 : int32 fid; /* HDF-EOS file ID */
9743 : int32 sdInterfaceID; /* HDF SDS interface ID */
9744 : int32 gdVgrpID; /* Grid root Vgroup ID */
9745 : int32 xdimsize; /* XDim size */
9746 : int32 ydimsize; /* YDim size */
9747 : int32 projcode; /* Projection code */
9748 : int32 zonecode; /* Zone code */
9749 : int32 spherecode; /* Sphere code */
9750 : int32 pixregcode; /* Pixel registration code */
9751 : int32 origincode; /* Origin code */
9752 : int32 dims[8]; /* Field dimensions */
9753 : int32 numsize; /* Size in bytes of number type */
9754 : int32 rank; /* Field rank */
9755 0 : int32 xdum = 0; /* Location of "XDim" within field list */
9756 0 : int32 ydum = 0; /* Location of "YDim" within field list */
9757 : int32 ntype; /* Number type */
9758 : int32 dum; /* Dummy variable */
9759 : int32 size; /* Size of returned data buffer for each
9760 : * value in bytes */
9761 : int32 pixCol[4]; /* Pixel columns for 4 nearest neighbors */
9762 : int32 pixRow[4]; /* Pixel rows for 4 nearest neighbors */
9763 : int32 tDen; /* Interpolation denominator value 1 */
9764 : int32 uDen; /* Interpolation denominator value 2 */
9765 0 : int32 nRetn = 0; /* Number of data values returned */
9766 :
9767 : float64 upleftpt[2];/* Upper left pt coordinates */
9768 : float64 lowrightpt[2]; /* Lower right pt coordinates */
9769 : float64 projparm[16]; /* Projection parameters */
9770 0 : float64 xVal = 0.0; /* "Exact" x location of interpolated point */
9771 0 : float64 yVal = 0.0; /* "Exact" y location of interpolated point */
9772 0 : float64 tNum = 0.0; /* Interpolation numerator value 1 */
9773 0 : float64 uNum = 0.0; /* Interpolation numerator value 2 */
9774 :
9775 : int16 i16[4]; /* Working buffer (int16) */
9776 : int32 i32[4]; /* Working buffer (int132) */
9777 : float32 f32[4]; /* Working buffer (float32) */
9778 : float64 f64[4]; /* Working buffer (float64) */
9779 :
9780 : char *pixVal; /* Nearest neighbor values */
9781 : char *dimlist; /* Dimension list */
9782 :
9783 : /* Allocate space for dimlist */
9784 : /* --------------------------------- */
9785 0 : dimlist = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
9786 0 : if(dimlist == NULL)
9787 : {
9788 0 : HEpush(DFE_NOSPACE,"GDinterpolate", __FILE__, __LINE__);
9789 0 : return(-1);
9790 : }
9791 : /* Check for valid grid ID */
9792 : /* ----------------------- */
9793 0 : status = GDchkgdid(gridID, "GDinterpolate",
9794 : &fid, &sdInterfaceID, &gdVgrpID);
9795 :
9796 :
9797 : /* If no problems ... */
9798 : /* ------------------ */
9799 0 : if (status == 0)
9800 : {
9801 : /* Get field information */
9802 : /* --------------------- */
9803 0 : status = GDfieldinfo(gridID, fieldname, &rank, dims, &ntype, dimlist);
9804 :
9805 :
9806 : /* Check for "XDim" & "YDim" in dimension list */
9807 : /* ------------------------------------------- */
9808 0 : if (status == 0)
9809 : {
9810 0 : xdum = EHstrwithin("XDim", dimlist, ',');
9811 0 : ydum = EHstrwithin("YDim", dimlist, ',');
9812 :
9813 0 : if (xdum == -1)
9814 : {
9815 0 : status = -1;
9816 0 : HEpush(DFE_GENAPP, "GDinterpolate", __FILE__, __LINE__);
9817 0 : HEreport(
9818 : "\"XDim\" not present in dimlist for field: \"%s\".\n",
9819 : fieldname);
9820 : }
9821 :
9822 :
9823 0 : if (ydum == -1)
9824 : {
9825 0 : status = -1;
9826 0 : HEpush(DFE_GENAPP, "GDinterpolate", __FILE__, __LINE__);
9827 0 : HEreport(
9828 : "\"YDim\" not present in dimlist for field: \"%s\".\n",
9829 : fieldname);
9830 : }
9831 : }
9832 : else
9833 : {
9834 : /* Fieldname not found in grid */
9835 : /* --------------------------- */
9836 0 : status = -1;
9837 0 : HEpush(DFE_GENAPP, "GDinterpolate", __FILE__, __LINE__);
9838 0 : HEreport("Fieldname \"%s\" not found.\n", fieldname);
9839 : }
9840 :
9841 :
9842 : /* If no problems ... */
9843 : /* ------------------ */
9844 0 : if (status == 0)
9845 : {
9846 : /* Compute size of data buffer for each interpolated value */
9847 : /* ------------------------------------------------------- */
9848 0 : dims[xdum] = 1;
9849 0 : dims[ydum] = 1;
9850 0 : size = dims[0];
9851 0 : for (i = 1; i < rank; i++)
9852 : {
9853 0 : size *= dims[i];
9854 : }
9855 0 : numsize = DFKNTsize(ntype);
9856 0 : size *= numsize;
9857 :
9858 0 : nRetn = size / numsize;
9859 :
9860 :
9861 :
9862 : /* If interpolated values are requested ... */
9863 : /* ---------------------------------------- */
9864 0 : if (interpVal != NULL)
9865 : {
9866 : /* Get grid info */
9867 : /* ------------- */
9868 0 : status = GDgridinfo(gridID, &xdimsize, &ydimsize,
9869 : upleftpt, lowrightpt);
9870 :
9871 :
9872 : /* Get projection info */
9873 : /* ------------------- */
9874 0 : status = GDprojinfo(gridID, &projcode, &zonecode,
9875 : &spherecode, projparm);
9876 :
9877 :
9878 : /* Get explicit upleftpt & lowrightpt if defaults are used */
9879 : /* ------------------------------------------------------- */
9880 0 : status = GDgetdefaults(projcode, zonecode, projparm,
9881 : spherecode, upleftpt, lowrightpt);
9882 :
9883 :
9884 : /* Get pixel registration and origin info */
9885 : /* -------------------------------------- */
9886 0 : status = GDpixreginfo(gridID, &pixregcode);
9887 0 : status = GDorigininfo(gridID, &origincode);
9888 :
9889 :
9890 :
9891 : /* Loop through all interpolated points */
9892 : /* ------------------------------------ */
9893 0 : for (i = 0; i < nValues; i++)
9894 : {
9895 : /* Get row & column of point pixel */
9896 : /* ------------------------------- */
9897 0 : status = GDll2ij(projcode, zonecode, projparm, spherecode,
9898 : xdimsize, ydimsize, upleftpt, lowrightpt,
9899 0 : 1, &lonVal[i], &latVal[i],
9900 : pixRow, pixCol, &xVal, &yVal);
9901 :
9902 :
9903 : /* Get diff of interp. point from pixel location */
9904 : /* --------------------------------------------- */
9905 0 : if (pixregcode == HDFE_CENTER)
9906 : {
9907 0 : tNum = xVal - (pixCol[0] + 0.5);
9908 0 : uNum = yVal - (pixRow[0] + 0.5);
9909 : }
9910 0 : else if (origincode == HDFE_GD_UL)
9911 : {
9912 0 : tNum = xVal - pixCol[0];
9913 0 : uNum = yVal - pixRow[0];
9914 : }
9915 0 : else if (origincode == HDFE_GD_UR)
9916 : {
9917 0 : tNum = xVal - (pixCol[0] + 1);
9918 0 : uNum = yVal - pixRow[0];
9919 : }
9920 0 : else if (origincode == HDFE_GD_LL)
9921 : {
9922 0 : tNum = xVal - pixCol[0];
9923 0 : uNum = yVal - (pixRow[0] + 1);
9924 : }
9925 0 : else if (origincode == HDFE_GD_LR)
9926 : {
9927 0 : tNum = xVal - (pixCol[0] + 1);
9928 0 : uNum = yVal - (pixRow[0] + 1);
9929 : }
9930 :
9931 :
9932 : /* Get rows and columns of other nearest neighbor pixels */
9933 : /* ----------------------------------------------------- */
9934 0 : pixCol[1] = pixCol[0];
9935 0 : pixRow[3] = pixRow[0];
9936 :
9937 0 : if (tNum >= 0)
9938 : {
9939 0 : pixCol[2] = pixCol[0] + 1;
9940 0 : pixCol[3] = pixCol[0] + 1;
9941 : }
9942 :
9943 0 : if (tNum < 0)
9944 : {
9945 0 : pixCol[2] = pixCol[0] - 1;
9946 0 : pixCol[3] = pixCol[0] - 1;
9947 : }
9948 :
9949 0 : if (uNum >= 0)
9950 : {
9951 0 : pixRow[2] = pixRow[0] + 1;
9952 0 : pixRow[1] = pixRow[0] + 1;
9953 : }
9954 :
9955 0 : if (uNum < 0)
9956 : {
9957 0 : pixRow[2] = pixRow[0] - 1;
9958 0 : pixRow[1] = pixRow[0] - 1;
9959 : }
9960 :
9961 :
9962 : /* Get values of nearest neighbors */
9963 : /* -------------------------------- */
9964 0 : pixVal = (char *) malloc(4 * size);
9965 0 : if(pixVal == NULL)
9966 : {
9967 0 : HEpush(DFE_NOSPACE,"GDinterpolate", __FILE__, __LINE__);
9968 0 : free(dimlist);
9969 0 : return(-1);
9970 : }
9971 0 : dum = GDgetpixvalues(gridID, 4, pixRow, pixCol,
9972 : fieldname, pixVal);
9973 :
9974 :
9975 : /* Trap interpolation boundary out of range error */
9976 : /* ---------------------------------------------- */
9977 0 : if (dum == -1)
9978 : {
9979 0 : status = -1;
9980 0 : HEpush(DFE_GENAPP, "GDinterpolate", __FILE__, __LINE__);
9981 0 : HEreport("Interpolation boundary outside of grid.\n");
9982 : }
9983 : else
9984 : {
9985 :
9986 : /*
9987 : * Algorithm taken for Numerical Recipes in C, 2nd
9988 : * edition, Section 3.6
9989 : */
9990 :
9991 : /* Perform bilinear interpolation */
9992 : /* ------------------------------ */
9993 0 : tDen = pixCol[3] - pixCol[0];
9994 0 : uDen = pixRow[1] - pixRow[0];
9995 :
9996 0 : switch (ntype)
9997 : {
9998 0 : case DFNT_INT16:
9999 :
10000 :
10001 : /* Loop through all returned data values */
10002 : /* ------------------------------------- */
10003 0 : for (j = 0; j < nRetn; j++)
10004 : {
10005 : /* Copy 4 NN values into working array */
10006 : /* ----------------------------------- */
10007 0 : for (k = 0; k < 4; k++)
10008 : {
10009 0 : memcpy(&i16[k],
10010 0 : pixVal + j * numsize + k * size,
10011 : sizeof(int16));
10012 : }
10013 :
10014 : /* Compute interpolated value */
10015 : /* -------------------------- */
10016 0 : interpVal[i * nRetn + j] =
10017 0 : (1 - tNum / tDen) * (1 - uNum / uDen) *
10018 0 : i16[0] +
10019 0 : (tNum / tDen) * (1 - uNum / uDen) *
10020 0 : i16[3] +
10021 0 : (tNum / tDen) * (uNum / uDen) *
10022 0 : i16[2] +
10023 0 : (1 - tNum / tDen) * (uNum / uDen) *
10024 0 : i16[1];
10025 : }
10026 0 : break;
10027 :
10028 :
10029 0 : case DFNT_INT32:
10030 :
10031 0 : for (j = 0; j < nRetn; j++)
10032 : {
10033 0 : for (k = 0; k < 4; k++)
10034 : {
10035 0 : memcpy(&i32[k],
10036 0 : pixVal + j * numsize + k * size,
10037 : sizeof(int32));
10038 : }
10039 :
10040 0 : interpVal[i * nRetn + j] =
10041 0 : (1 - tNum / tDen) * (1 - uNum / uDen) *
10042 0 : i32[0] +
10043 0 : (tNum / tDen) * (1 - uNum / uDen) *
10044 0 : i32[3] +
10045 0 : (tNum / tDen) * (uNum / uDen) *
10046 0 : i32[2] +
10047 0 : (1 - tNum / tDen) * (uNum / uDen) *
10048 0 : i32[1];
10049 : }
10050 0 : break;
10051 :
10052 :
10053 0 : case DFNT_FLOAT32:
10054 :
10055 0 : for (j = 0; j < nRetn; j++)
10056 : {
10057 0 : for (k = 0; k < 4; k++)
10058 : {
10059 0 : memcpy(&f32[k],
10060 0 : pixVal + j * numsize + k * size,
10061 : sizeof(float32));
10062 : }
10063 :
10064 0 : interpVal[i * nRetn + j] =
10065 0 : (1 - tNum / tDen) * (1 - uNum / uDen) *
10066 0 : f32[0] +
10067 0 : (tNum / tDen) * (1 - uNum / uDen) *
10068 0 : f32[3] +
10069 0 : (tNum / tDen) * (uNum / uDen) *
10070 0 : f32[2] +
10071 0 : (1 - tNum / tDen) * (uNum / uDen) *
10072 0 : f32[1];
10073 : }
10074 0 : break;
10075 :
10076 :
10077 0 : case DFNT_FLOAT64:
10078 :
10079 0 : for (j = 0; j < nRetn; j++)
10080 : {
10081 0 : for (k = 0; k < 4; k++)
10082 : {
10083 0 : memcpy(&f64[k],
10084 0 : pixVal + j * numsize + k * size,
10085 : sizeof(float64));
10086 : }
10087 :
10088 0 : interpVal[i * nRetn + j] =
10089 0 : (1 - tNum / tDen) * (1 - uNum / uDen) *
10090 0 : f64[0] +
10091 0 : (tNum / tDen) * (1 - uNum / uDen) *
10092 0 : f64[3] +
10093 0 : (tNum / tDen) * (uNum / uDen) *
10094 0 : f64[2] +
10095 0 : (1 - tNum / tDen) * (uNum / uDen) *
10096 0 : f64[1];
10097 : }
10098 0 : break;
10099 : }
10100 0 : }
10101 0 : free(pixVal);
10102 : }
10103 : }
10104 : }
10105 : }
10106 :
10107 :
10108 : /* If successful return size of returned data in bytes */
10109 : /* --------------------------------------------------- */
10110 0 : if (status == 0)
10111 : {
10112 : /*always return size of float64 buffer */
10113 0 : free(dimlist);
10114 0 : return (nRetn * nValues * sizeof(float64));
10115 : }
10116 : else
10117 : {
10118 0 : free(dimlist);
10119 0 : return ((int32) status);
10120 : }
10121 :
10122 : }
10123 : /***********************************************
10124 : GDwrrdtile --
10125 : This function is the underlying function below GDwritetile and
10126 : GDreadtile.
10127 :
10128 :
10129 : Author--
10130 : Alexis Zubrow
10131 :
10132 : ********************************************************/
10133 :
10134 : static intn
10135 0 : GDwrrdtile(int32 gridID, const char *fieldname, const char *code, int32 start[],
10136 : VOIDP datbuf)
10137 : {
10138 : intn i; /* Loop index */
10139 0 : intn status = 0; /* routine return status variable */
10140 :
10141 : int32 fid; /* HDF-EOS file ID */
10142 : int32 sdInterfaceID; /* HDF SDS interface ID */
10143 : int32 sdid; /* SDS ID */
10144 :
10145 : int32 dum; /* Dummy variable */
10146 : int32 rankSDS; /* Rank of SDS/Field */
10147 :
10148 : int32 dims[8]; /* Field/SDS dimensions */
10149 : int32 tileFlags; /* flag to determine if field is tiled */
10150 : int32 numTileDims;/* number of tiles spanning a dimension */
10151 : HDF_CHUNK_DEF tileDef; /* union holding tiling info. */
10152 :
10153 :
10154 : /* Get gridID */
10155 0 : status = GDchkgdid(gridID, "GDwrrdtile", &fid, &sdInterfaceID, &dum);
10156 0 : if (status == 0)
10157 : {
10158 :
10159 : /* Get field info */
10160 0 : status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
10161 :
10162 0 : if (status == 0)
10163 : {
10164 :
10165 : /* Check whether fieldname is in SDS (multi-dim field) */
10166 : /* --------------------------------------------------- */
10167 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
10168 : &rankSDS, &dum, &dum, dims, &dum);
10169 :
10170 :
10171 :
10172 : /*
10173 : * Check for errors in parameters passed to GDwritetile or
10174 : * GDreadtile
10175 : */
10176 :
10177 : /* Check if untiled field */
10178 0 : status = SDgetchunkinfo(sdid, &tileDef, &tileFlags);
10179 0 : if (tileFlags == HDF_NONE)
10180 : {
10181 0 : HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
10182 0 : HEreport("Field \"%s\" is not tiled.\n", fieldname);
10183 0 : status = -1;
10184 0 : return (status);
10185 :
10186 : }
10187 :
10188 : /*
10189 : * Check if rd/wr tilecoords are within the extent of the field
10190 : */
10191 0 : for (i = 0; i < rankSDS; i++)
10192 : {
10193 : /*
10194 : * Calculate the number of tiles which span a dimension of
10195 : * the field
10196 : */
10197 0 : numTileDims = dims[i] / tileDef.chunk_lengths[i];
10198 0 : if ((start[i] >= numTileDims) || (start[i] < 0))
10199 : {
10200 : /*
10201 : * ERROR INDICATING BEYOND EXTENT OF THAT DIMENSION OR
10202 : * NEGATIVE TILECOORDS
10203 : */
10204 0 : HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
10205 0 : HEreport("Tilecoords for dimension \"%d\" ...\n", i);
10206 0 : HEreport("is beyond the extent of dimension length\n");
10207 0 : status = -1;
10208 :
10209 : }
10210 : }
10211 :
10212 0 : if (status == -1)
10213 : {
10214 0 : return (status);
10215 : }
10216 :
10217 :
10218 : /* Actually write/read to the field */
10219 :
10220 0 : if (strcmp(code, "w") == 0) /* write tile */
10221 : {
10222 0 : status = SDwritechunk(sdid, start, (VOIDP) datbuf);
10223 : }
10224 0 : else if (strcmp(code, "r") == 0) /* read tile */
10225 : {
10226 0 : status = SDreadchunk(sdid, start, (VOIDP) datbuf);
10227 : }
10228 :
10229 :
10230 : }
10231 :
10232 : /* Non-existent fieldname */
10233 : else
10234 : {
10235 0 : HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
10236 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
10237 0 : status = -1;
10238 : }
10239 :
10240 : }
10241 :
10242 0 : return (status);
10243 : }
10244 :
10245 :
10246 : /***********************************************
10247 : GDtileinfo --
10248 : This function queries the field to determine if it is tiled. If it is
10249 : tile, one can retrieve some of the characteristics of the tiles.
10250 :
10251 : Author-- Alexis Zubrow
10252 :
10253 : ********************************************************/
10254 :
10255 :
10256 : intn
10257 0 : GDtileinfo(int32 gridID, const char *fieldname, int32 * tilecode, int32 * tilerank,
10258 : int32 tiledims[])
10259 :
10260 : {
10261 : intn i; /* Loop index */
10262 0 : intn status = 0; /* routine return status variable */
10263 :
10264 : int32 fid; /* HDF-EOS file ID */
10265 : int32 sdInterfaceID; /* HDF SDS interface ID */
10266 : int32 sdid; /* SDS ID */
10267 :
10268 : int32 dum; /* Dummy variable */
10269 : int32 rankSDS; /* Rank of SDS/Field/tile */
10270 :
10271 : int32 dims[8]; /* Field/SDS dimensions */
10272 : int32 tileFlags; /* flag to determine if field is tiled */
10273 : HDF_CHUNK_DEF tileDef; /* union holding tiling info. */
10274 :
10275 :
10276 : /* Check if improper gridID */
10277 0 : status = GDchkgdid(gridID, "GDtileinfo", &fid, &sdInterfaceID, &dum);
10278 0 : if (status == 0)
10279 : {
10280 :
10281 : /* Get field info */
10282 0 : status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
10283 :
10284 0 : if (status == 0)
10285 : {
10286 :
10287 : /* Check whether fieldname is in SDS (multi-dim field) */
10288 : /* --------------------------------------------------- */
10289 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
10290 : &rankSDS, &dum, &dum, dims, &dum);
10291 :
10292 :
10293 :
10294 : /* Query field for tiling information */
10295 0 : status = SDgetchunkinfo(sdid, &tileDef, &tileFlags);
10296 :
10297 : /* If field is untiled, return untiled flag */
10298 0 : if (tileFlags == HDF_NONE)
10299 : {
10300 0 : *tilecode = HDFE_NOTILE;
10301 0 : return (status);
10302 : }
10303 :
10304 : /* IF field is tiled or tiled with compression */
10305 0 : else if ((tileFlags == HDF_CHUNK) ||
10306 0 : (tileFlags == (HDF_CHUNK | HDF_COMP)))
10307 : {
10308 0 : if (tilecode != NULL)
10309 : {
10310 0 : *tilecode = HDFE_TILE;
10311 : }
10312 0 : if (tilerank != NULL)
10313 : {
10314 0 : *tilerank = rankSDS;
10315 : }
10316 0 : if (tiledims != NULL)
10317 : {
10318 : /* Assign size of tile dimensions */
10319 0 : for (i = 0; i < rankSDS; i++)
10320 : {
10321 0 : tiledims[i] = tileDef.chunk_lengths[i];
10322 : }
10323 : }
10324 : }
10325 : }
10326 :
10327 : /* Non-existent fieldname */
10328 : else
10329 : {
10330 0 : HEpush(DFE_GENAPP, "GDtileinfo", __FILE__, __LINE__);
10331 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
10332 0 : status = -1;
10333 : }
10334 :
10335 : }
10336 0 : return (status);
10337 : }
10338 : /***********************************************
10339 : GDwritetile --
10340 : This function writes one tile to a particular field.
10341 :
10342 :
10343 : Author--
10344 : Alexis Zubrow
10345 :
10346 : ********************************************************/
10347 :
10348 : intn
10349 0 : GDwritetile(int32 gridID, const char *fieldname, int32 tilecoords[],
10350 : VOIDP tileData)
10351 : {
10352 0 : char code[] = "w"; /* write tile code */
10353 0 : intn status = 0; /* routine return status variable */
10354 :
10355 0 : status = GDwrrdtile(gridID, fieldname, code, tilecoords, tileData);
10356 :
10357 0 : return (status);
10358 : }
10359 : /***********************************************
10360 : GDreadtile --
10361 : This function reads one tile from a particular field.
10362 :
10363 :
10364 : Author--
10365 : Alexis Zubrow
10366 :
10367 : ********************************************************/
10368 :
10369 : intn
10370 0 : GDreadtile(int32 gridID, const char *fieldname, int32 tilecoords[],
10371 : VOIDP tileData)
10372 : {
10373 0 : char code[] = "r"; /* read tile code */
10374 0 : intn status = 0; /* routine return status variable */
10375 :
10376 0 : status = GDwrrdtile(gridID, fieldname, code, tilecoords, tileData);
10377 :
10378 0 : return (status);
10379 : }
10380 : /***********************************************
10381 : GDsettilecache --
10382 : This function sets the cache size for a tiled field.
10383 :
10384 :
10385 : Author--
10386 : Alexis Zubrow
10387 :
10388 : ********************************************************/
10389 :
10390 : intn
10391 0 : GDsettilecache(int32 gridID, const char *fieldname, int32 maxcache, CPL_UNUSED int32 cachecode)
10392 : {
10393 :
10394 0 : intn status = 0; /* routine return status variable */
10395 :
10396 : int32 fid; /* HDF-EOS file ID */
10397 : int32 sdInterfaceID; /* HDF SDS interface ID */
10398 : int32 sdid; /* SDS ID */
10399 :
10400 : int32 dum; /* Dummy variable */
10401 :
10402 : int32 dims[8]; /* Field/SDS dimensions */
10403 :
10404 :
10405 : /* Check gridID */
10406 0 : status = GDchkgdid(gridID, "GDwrrdtile", &fid, &sdInterfaceID, &dum);
10407 0 : if (status == 0)
10408 : {
10409 :
10410 : /* Get field info */
10411 0 : status = GDfieldinfo(gridID, fieldname, &dum, dims, &dum, NULL);
10412 :
10413 0 : if (status == 0)
10414 : {
10415 :
10416 : /* Check whether fieldname is in SDS (multi-dim field) */
10417 : /* --------------------------------------------------- */
10418 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
10419 : &dum, &dum, &dum, dims, &dum);
10420 :
10421 :
10422 : /* Check if maxcache is less than or equal to zero */
10423 0 : if (maxcache <= 0)
10424 : {
10425 0 : HEpush(DFE_GENAPP, "GDsettilecache", __FILE__, __LINE__);
10426 0 : HEreport("Improper maxcache \"%d\"... \n", maxcache);
10427 0 : HEreport("maxcache must be greater than zero.\n");
10428 0 : status = -1;
10429 0 : return (status);
10430 : }
10431 :
10432 :
10433 : /* Set the number of tiles to cache */
10434 : /* Presently, the only cache flag allowed is 0 */
10435 0 : status = SDsetchunkcache(sdid, maxcache, 0);
10436 :
10437 :
10438 : }
10439 :
10440 : /* Non-existent fieldname */
10441 : else
10442 : {
10443 0 : HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
10444 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
10445 0 : status = -1;
10446 : }
10447 :
10448 : }
10449 :
10450 0 : return (status);
10451 : }
10452 :
10453 : /*----------------------------------------------------------------------------|
10454 : | BEGIN_PROLOG |
10455 : | |
10456 : | FUNCTION: GDsettilecomp |
10457 : | |
10458 : | DESCRIPTION: Sets the tiling/compression parameters for the specified |
10459 : | field. This can be called after GDsetfillvalue and assumes |
10460 : | that the field was defined with no compression/tiling set |
10461 : | by GDdeftile or GDdefcomp. |
10462 : | |
10463 : | This function replaces the following sequence: |
10464 : | GDdefcomp |
10465 : | GDdeftile |
10466 : | GDdeffield |
10467 : | GDsetfillvalue |
10468 : | with: |
10469 : | GDdeffield |
10470 : | GDsetfillvalue |
10471 : | GDsettilecomp |
10472 : | so that fill values will work correctly. |
10473 : | |
10474 : | Return Value Type Units Description |
10475 : | ============ ====== ========= ===================================== |
10476 : | status intn return status (0) SUCCEED, (-1) FAIL |
10477 : | |
10478 : | INPUTS: |
10479 : | gridID int32 grid structure ID |
10480 : | fieldname char field name |
10481 : | tilerank int32 number of tiling dimensions |
10482 : | tiledims int32 tiling dimensions |
10483 : | compcode int32 compression code |
10484 : | compparm intn compression parameters |
10485 : | |
10486 : | OUTPUTS: |
10487 : | None |
10488 : | |
10489 : | NOTES: |
10490 : | |
10491 : | |
10492 : | Date Programmer Description |
10493 : | ====== ============ ================================================= |
10494 : | Jun 98 MISR Used GDsetfillvalue as a template and copied |
10495 : | tiling/comp portions of GDdeffield.(NCR15866). |
10496 : | |
10497 : | END_PROLOG |
10498 : -----------------------------------------------------------------------------*/
10499 : intn
10500 0 : GDsettilecomp(int32 gridID, const char *fieldname, int32 tilerank, int32*
10501 : tiledims, int32 compcode, intn* compparm)
10502 : {
10503 : intn status; /* routine return status variable */
10504 :
10505 : int32 fid; /* HDF-EOS file ID */
10506 : int32 sdInterfaceID; /* HDF SDS interface ID */
10507 : int32 gdVgrpID; /* Grid root Vgroup ID */
10508 : int i; /* Looping variable. */
10509 : int32 sdid; /* SDS id */
10510 : int32 nt; /* Number type */
10511 : int32 dims[8]; /* Dimensions array */
10512 : int32 dum; /* Dummy variable */
10513 : int32 solo; /* "Solo" (non-merged) field flag */
10514 : comp_info c_info; /* Compression parameter structure */
10515 : HDF_CHUNK_DEF chunkDef; /* Tiling structure */
10516 : int32 chunkFlag; /* Chunking (Tiling) flag */
10517 :
10518 0 : c_info.nbit.nt = 0;
10519 :
10520 : /* Check for valid grid ID and get SDS interface ID */
10521 0 : status = GDchkgdid(gridID, "GDsetfillvalue",
10522 : &fid, &sdInterfaceID, &gdVgrpID);
10523 :
10524 0 : if (status == 0)
10525 : {
10526 : /* Get field info */
10527 0 : status = GDfieldinfo(gridID, fieldname, &dum, dims, &nt, NULL);
10528 :
10529 0 : if (status == 0)
10530 : {
10531 : /* Get SDS ID and solo flag */
10532 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
10533 : &sdid, &dum, &dum, &dum,
10534 : dims, &solo);
10535 0 : if (status !=0) {
10536 0 : HEpush(DFE_GENAPP, "GDsettilecomp", __FILE__, __LINE__);
10537 0 : HEreport("GDSDfldsrch failed\n", fieldname);
10538 0 : return FAIL;
10539 : }
10540 : /* Tiling with Compression */
10541 : /* ----------------------- */
10542 :
10543 :
10544 : /* Setup Compression */
10545 : /* ----------------- */
10546 0 : if (compcode == HDFE_COMP_NBIT)
10547 : {
10548 0 : c_info.nbit.nt = nt;
10549 0 : c_info.nbit.sign_ext = compparm[0];
10550 0 : c_info.nbit.fill_one = compparm[1];
10551 0 : c_info.nbit.start_bit = compparm[2];
10552 0 : c_info.nbit.bit_len = compparm[3];
10553 : }
10554 0 : else if (compcode == HDFE_COMP_SKPHUFF)
10555 : {
10556 0 : c_info.skphuff.skp_size = (intn) DFKNTsize(nt);
10557 : }
10558 0 : else if (compcode == HDFE_COMP_DEFLATE)
10559 : {
10560 0 : c_info.deflate.level = compparm[0];
10561 : }
10562 :
10563 : /* Setup chunk lengths */
10564 : /* ------------------- */
10565 0 : for (i = 0; i < tilerank; i++)
10566 : {
10567 0 : chunkDef.comp.chunk_lengths[i] = tiledims[i];
10568 : }
10569 :
10570 : /* Setup chunk flag & chunk compression type */
10571 : /* ----------------------------------------- */
10572 0 : chunkFlag = HDF_CHUNK | HDF_COMP;
10573 0 : chunkDef.comp.comp_type = compcode;
10574 :
10575 : /* Setup chunk compression parameters */
10576 : /* ---------------------------------- */
10577 0 : if (compcode == HDFE_COMP_SKPHUFF)
10578 : {
10579 0 : chunkDef.comp.cinfo.skphuff.skp_size =
10580 0 : c_info.skphuff.skp_size;
10581 : }
10582 0 : else if (compcode == HDFE_COMP_DEFLATE)
10583 : {
10584 0 : chunkDef.comp.cinfo.deflate.level =
10585 0 : c_info.deflate.level;
10586 : }
10587 : /* Call SDsetchunk routine */
10588 : /* ----------------------- */
10589 0 : status = SDsetchunk(sdid, chunkDef, chunkFlag);
10590 0 : if (status ==FAIL) {
10591 0 : HEpush(DFE_GENAPP, "GDsettilecomp", __FILE__, __LINE__);
10592 0 : HEreport("Fieldname \"%s\" does not exist.\n",
10593 : fieldname);
10594 0 : return status;
10595 : }
10596 : }
10597 : else
10598 : {
10599 0 : HEpush(DFE_GENAPP, "GDsettilecomp", __FILE__, __LINE__);
10600 0 : HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
10601 : }
10602 : }
10603 0 : return (status);
10604 : }
10605 :
10606 : /*----------------------------------------------------------------------------|
10607 : | BEGIN_PROLOG |
10608 : | |
10609 : | FUNCTION: GDll2mm_cea |
10610 : | |
10611 : | DESCRIPTION: |
10612 : | |
10613 : | |
10614 : | Return Value Type Units Description |
10615 : | ============ ====== ========= ===================================== |
10616 : | status intn return status (0) SUCCEED, (-1) FAIL |
10617 : | |
10618 : | INPUTS: |
10619 : | projcode int32 GCTP projection code |
10620 : | zonecode int32 UTM zone code |
10621 : | projparm float64 Projection parameters |
10622 : | spherecode int32 GCTP spheriod code |
10623 : | xdimsize int32 xdimsize from GDcreate |
10624 : | ydimsize int32 ydimsize from GDcreate |
10625 : | upleftpt float64 upper left corner coordinates (DMS) |
10626 : | lowrightpt float64 lower right corner coordinates (DMS) |
10627 : | longitude float64 longitude array (DMS) |
10628 : | latitude float64 latitude array (DMS) |
10629 : | npnts int32 number of lon-lat points |
10630 : | |
10631 : | OUTPUTS: |
10632 : | x float64 X value array |
10633 : | y float64 Y value array |
10634 : | scaleX float64 X grid size |
10635 : | scaley float64 Y grid size |
10636 : | |
10637 : | NOTES: |
10638 : | |
10639 : | |
10640 : | Date Programmer Description |
10641 : | ====== ============ ================================================= |
10642 : | Oct 02 Abe Taaheri Added support for EASE grid |
10643 : | |
10644 : | END_PROLOG |
10645 : -----------------------------------------------------------------------------*/
10646 0 : static intn GDll2mm_cea(int32 projcode,int32 zonecode, int32 spherecode,
10647 : float64 projparm[],
10648 : int32 xdimsize, int32 ydimsize,
10649 : float64 upleftpt[], float64 lowrightpt[], int32 npnts,
10650 : CPL_UNUSED float64 lon[],CPL_UNUSED float64 lat[],
10651 : float64 x[],float64 y[], float64 *scaleX,float64 *scaleY)
10652 : {
10653 0 : intn status = 0; /* routine return status variable */
10654 0 : int32 errorcode = 0; /* GCTP error code */
10655 : float64 xMtr0, xMtr1, yMtr0, yMtr1;
10656 : float64 lonrad0; /* Longitude in radians of upleft point */
10657 : float64 latrad0; /* Latitude in radians of upleft point */
10658 : float64 lonrad; /* Longitude in radians of point */
10659 : float64 latrad; /* Latitude in radians of point */
10660 : int32(*for_trans[100]) (double, double, double*, double*); /* GCTP function pointer */
10661 :
10662 0 : if(npnts <= 0)
10663 : {
10664 0 : HEpush(DFE_GENAPP, " GDll2mm_cea", __FILE__, __LINE__);
10665 0 : HEreport("Improper npnts value\"%d\"... \n", npnts);
10666 0 : HEreport("npnts must be greater than zero.\n");
10667 0 : status = -1;
10668 0 : return (status);
10669 : }
10670 0 : if ( projcode == GCTP_BCEA)
10671 : {
10672 0 : for_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
10673 : &errorcode, for_trans);
10674 : /* Convert upleft and lowright X coords from DMS to radians */
10675 : /* -------------------------------------------------------- */
10676 :
10677 0 : lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
10678 0 : lonrad = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
10679 :
10680 : /* Convert upleft and lowright Y coords from DMS to radians */
10681 : /* -------------------------------------------------------- */
10682 0 : latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
10683 0 : latrad = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
10684 :
10685 : /* Convert from lon/lat to meters(or whatever unit is, i.e unit
10686 : of r_major and r_minor) using GCTP */
10687 : /* ----------------------------------------- */
10688 0 : errorcode = for_trans[projcode] (lonrad0, latrad0, &xMtr0, &yMtr0);
10689 0 : x[0] = xMtr0;
10690 0 : y[0] = yMtr0;
10691 :
10692 : /* Report error if any */
10693 : /* ------------------- */
10694 0 : if (errorcode != 0)
10695 : {
10696 0 : status = -1;
10697 0 : HEpush(DFE_GENAPP, "GDll2mm_cea", __FILE__, __LINE__);
10698 0 : HEreport("GCTP Error: %d\n", errorcode);
10699 0 : return (status);
10700 : }
10701 :
10702 : /* Convert from lon/lat to meters(or whatever unit is, i.e unit
10703 : of r_major and r_minor) using GCTP */
10704 : /* ----------------------------------------- */
10705 0 : errorcode = for_trans[projcode] (lonrad, latrad, &xMtr1, &yMtr1);
10706 0 : x[1] = xMtr1;
10707 0 : y[1] = yMtr1;
10708 :
10709 : /* Report error if any */
10710 : /* ------------------- */
10711 0 : if (errorcode != 0)
10712 : {
10713 0 : status = -1;
10714 0 : HEpush(DFE_GENAPP, "GDll2mm_cea", __FILE__, __LINE__);
10715 0 : HEreport("GCTP Error: %d\n", errorcode);
10716 0 : return (status);
10717 : }
10718 :
10719 : /* Compute x scale factor */
10720 : /* ---------------------- */
10721 0 : *scaleX = (xMtr1 - xMtr0) / xdimsize;
10722 :
10723 : /* Compute y scale factor */
10724 : /* ---------------------- */
10725 0 : *scaleY = (yMtr1 - yMtr0) / ydimsize;
10726 : }
10727 : else
10728 : {
10729 0 : status = -1;
10730 0 : HEpush(DFE_GENAPP, "GDll2mm_cea", __FILE__, __LINE__);
10731 0 : HEreport("Wrong projection code; this function is only for EASE grid");
10732 0 : return (status);
10733 : }
10734 0 : return (0);
10735 : }
10736 :
10737 :
10738 : /*----------------------------------------------------------------------------|
10739 : | BEGIN_PROLOG |
10740 : | |
10741 : | FUNCTION: GDmm2ll_cea |
10742 : | |
10743 : | DESCRIPTION: |
10744 : | |
10745 : | |
10746 : | Return Value Type Units Description |
10747 : | ============ ====== ========= ===================================== |
10748 : | status intn return status (0) SUCCEED, (-1) FAIL |
10749 : | |
10750 : | INPUTS: |
10751 : | projcode int32 GCTP projection code |
10752 : | zonecode int32 UTM zone code |
10753 : | projparm float64 Projection parameters |
10754 : | spherecode int32 GCTP spheriod code |
10755 : | xdimsize int32 xdimsize from GDcreate |
10756 : | ydimsize int32 ydimsize from GDcreate |
10757 : | upleftpt float64 upper left corner coordinates (DMS) |
10758 : | lowrightpt float64 lower right corner coordinates (DMS) |
10759 : | x float64 X value array |
10760 : | y float64 Y value array |
10761 : | npnts int32 number of x-y points |
10762 : | |
10763 : | OUTPUTS: |
10764 : | longitude float64 longitude array (DMS) |
10765 : | latitude float64 latitude array (DMS) |
10766 : | |
10767 : | NOTES: |
10768 : | |
10769 : | |
10770 : | Date Programmer Description |
10771 : | ====== ============ ================================================= |
10772 : | Oct 02 Abe Taaheri Added support for EASE grid |
10773 : | |
10774 : | END_PROLOG |
10775 : -----------------------------------------------------------------------------*/
10776 0 : static intn GDmm2ll_cea(int32 projcode,int32 zonecode, int32 spherecode,
10777 : float64 projparm[],
10778 : CPL_UNUSED int32 xdimsize, CPL_UNUSED int32 ydimsize,
10779 : CPL_UNUSED float64 upleftpt[], CPL_UNUSED float64 lowrightpt[], int32 npnts,
10780 : float64 x[], float64 y[],
10781 : float64 longitude[], float64 latitude[])
10782 : {
10783 0 : intn status = 0; /* routine return status variable */
10784 0 : int32 errorcode = 0; /* GCTP error code */
10785 : int32(*inv_trans[100]) (double, double, double*, double*); /* GCTP function pointer */
10786 : int32 i;
10787 :
10788 0 : if(npnts <= 0)
10789 : {
10790 0 : HEpush(DFE_GENAPP, " GDmm2ll_cea", __FILE__, __LINE__);
10791 0 : HEreport("Improper npnts value\"%d\"... \n", npnts);
10792 0 : HEreport("npnts must be greater than zero.\n");
10793 0 : status = -1;
10794 0 : return (status);
10795 : }
10796 0 : if ( projcode == GCTP_BCEA)
10797 : {
10798 0 : inv_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
10799 : &errorcode, inv_trans);
10800 :
10801 : /* Convert from meters(or whatever unit is, i.e unit
10802 : of r_major and r_minor) to lat/lon using GCTP */
10803 : /* ----------------------------------------- */
10804 0 : for(i=0; i<npnts; i++)
10805 : {
10806 0 : errorcode =
10807 0 : inv_trans[projcode] (x[i], y[i],&longitude[i], &latitude[i]);
10808 : /* Report error if any */
10809 : /* ------------------- */
10810 0 : if (errorcode != 0)
10811 : {
10812 0 : status = -1;
10813 0 : HEpush(DFE_GENAPP, "GDmm2ll_cea", __FILE__, __LINE__);
10814 0 : HEreport("GCTP Error: %d\n", errorcode);
10815 0 : return (status);
10816 : }
10817 0 : longitude[i] = EHconvAng(longitude[i], HDFE_RAD_DMS);
10818 0 : latitude[i] = EHconvAng(latitude[i], HDFE_RAD_DMS);
10819 : }
10820 : }
10821 : else
10822 : {
10823 : /* Wrong projection code; this function is only for EASE grid */
10824 : }
10825 0 : return(status);
10826 : }
10827 :
10828 : /*----------------------------------------------------------------------------|
10829 : | BEGIN_PROLOG |
10830 : | |
10831 : | FUNCTION: GDsdid |
10832 : | |
10833 : | DESCRIPTION: Returns SD element ID for grid field |
10834 : | |
10835 : | |
10836 : | Return Value Type Units Description |
10837 : | ============ ====== ========= ===================================== |
10838 : | status intn return status (0) SUCCEED, (-1) FAIL |
10839 : | |
10840 : | INPUTS: |
10841 : | gridID int32 grid structure ID |
10842 : | fieldname const char field name |
10843 : | |
10844 : | |
10845 : | OUTPUTS: |
10846 : | sdid int32 SD element ID |
10847 : | |
10848 : | NOTES: |
10849 : | |
10850 : | |
10851 : | Date Programmer Description |
10852 : | ====== ============ ================================================= |
10853 : | Oct 07 Andrey Kiselev Original Programmer |
10854 : | |
10855 : | END_PROLOG |
10856 : -----------------------------------------------------------------------------*/
10857 : intn
10858 0 : GDsdid(int32 gridID, const char *fieldname, int32 *sdid)
10859 : {
10860 : intn status; /* routine return status variable */
10861 : int32 fid; /* HDF-EOS file ID */
10862 : int32 sdInterfaceID; /* HDF SDS interface ID */
10863 : int32 dum; /* Dummy variable */
10864 : int32 dims[H4_MAX_VAR_DIMS]; /* Field/SDS dimensions */
10865 :
10866 0 : status = GDchkgdid(gridID, "GDsdid", &fid, &sdInterfaceID, &dum);
10867 0 : if (status != -1)
10868 : {
10869 0 : status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
10870 : sdid, &dum, &dum, &dum, dims, &dum);
10871 : }
10872 :
10873 0 : return (status);
10874 : }
|