MISR Toolkit  1.5.1
MtkResampleGeom.c
Go to the documentation of this file.
1 /*===========================================================================
2 = =
3 = MtkResampleGeom =
4 = =
5 =============================================================================
6 
7  Jet Propulsion Laboratory
8  MISR
9 
10  MISR Toolkit
11 
12  Copyright 2005, California Institute of Technology.
13  ALL RIGHTS RESERVED.
14  U.S. Government Sponsorship acknowledged.
15 
16 ============================================================================*/
17 
18 #include "MisrToolkit.h"
19 #include "MisrError.h"
20 #include <stdio.h> /* for printf */
21 #include <getopt.h> /* for getopt_long */
22 #include <strings.h> /* for strncasecmp */
23 #include <HdfEosDef.h> /* Definition of GDopen */
24 
25 #define MAX_FILENAME 5000
26 #define MAX_FIELDNAME 1000
27 #define MAX_LENGTH 1000
28 #define GP_GMP_GRID_NAME "GeometricParameters"
29 #define OUTPUT_GRIDNAME "GeometricParameters"
30 #define NUMBER_FIELD 20
31 #define NUMBER_CAMERA 9
32 
33 /* -------------------------------------------------------------------------*/
34 /* Structure to contain command-line arguments. */
35 /* -------------------------------------------------------------------------*/
36 
37 typedef struct {
38  char *proj_map_file; /* Projection/map info file */
39  char *geom_file; /* AS_LAND file */
40  char *output_filename; /* Output filename*/
41 } argr_type; /* Argument parse result */
42 
43 #define ARGR_TYPE_INIT {NULL, NULL, NULL}
44 
45 /* -------------------------------------------------------------------------*/
46 /* Local function prototypes */
47 /* -------------------------------------------------------------------------*/
48 
49 int process_args(int argc, char *argv[], argr_type *argr);
50 
51 /* -------------------------------------------------------------------------*/
52 /* Main program. */
53 /* -------------------------------------------------------------------------*/
54 
55 int main( int argc, char *argv[] ) {
56  MTKt_status status; /* Return status */
57  MTKt_status status_code = MTK_FAILURE; /* Return code of this function */
58  argr_type argr = ARGR_TYPE_INIT; /* Command-line arguments */
60  /* Target map information. */
61  MTKt_GCTPProjInfo target_proj_info = MTKT_GCTPPROJINFO_INIT;
62  /* Target projection information. */
63  MTKt_Region region = MTKT_REGION_INIT; /* SOM region containing target map. */
65  /* Temporary latitude array for reprojection. */
67  /* Temporary longitude array for reprojection. */
69  /* Temporary line coord array for reprojection. */
70  MTKt_DataBuffer sample_coords = MTKT_DATABUFFER_INIT;
71  /* Temporary sample coord array for reprojection. */
73  /* Data for geometric parameters field. */
74  MTKt_DataBuffer geom_data_float64 = MTKT_DATABUFFER_INIT;
75  /* Data for geometric parameters field. */
76  MTKt_DataBuffer resampled_geom_data = MTKT_DATABUFFER_INIT;
77  /* Data for geometric parameters field. */
78  int path; /* Orbit path number. */
79  int iline; /* Loop iterator. */
80  int isample; /* Loop iterator. */
81  int32 fid = FAIL; /* HDF-EOS file identifier. */
82  int32 gid = FAIL; /* HDF-EOS grid identifier. */
83  int32 hstatus; /* HDF-EOS status code */
84  float64 upleft[2]; /* min X, max Y corner of target map. */
85  float64 lowright[2]; /* max X, min Y corner of target map. */
86  char *dimlist_ul_lr = "YDim,XDim";
87  /* HDF-EOS dimension list for origin UL or
88  origin LR maps.*/
89  char *dimlist_ur_ll = "XDim,YDim";
90  /* HDF-EOS dimension list for origin UR or
91  origin LL maps.*/
92  char *dimlist; /* HDF-EOS dimension list. */
93  int32 edge[2]; /* Size of HDF-EOS data to write. */
94  char *fieldnames[NUMBER_FIELD] = {"SolarAzimuth",
95  "SolarZenith",
96  "DfAzimuth",
97  "DfZenith",
98  "CfAzimuth",
99  "CfZenith",
100  "BfAzimuth",
101  "BfZenith",
102  "AfAzimuth",
103  "AfZenith",
104  "AnAzimuth",
105  "AnZenith",
106  "AaAzimuth",
107  "AaZenith",
108  "BaAzimuth",
109  "BaZenith",
110  "CaAzimuth",
111  "CaZenith",
112  "DaAzimuth",
113  "DaZenith"};
114  /* List of fields to copy. */
115  int ifield; /* Loop iterator. */
116  int size_x; /* Size of map along X axis. */
117  int size_y; /* Size of map along Y axis. */
118  int32 tile_rank = 2; /* HDF tile rank */
119  int32 tile_dims[2] = {64,64}; /* Tile dimensions. */
120  int32 comp_code = HDFE_COMP_DEFLATE; /* GZIP compression code. */
121  intn comp_parm[1] = {5}; /* GZIP compression level. */
122  float32 fill_float32 = -9999.0; /* Fill value for float32 fields. */
123 
124  /* ------------------------------------------------------------------ */
125  /* Parse command-line arguments. */
126  /* ------------------------------------------------------------------ */
127 
128  if (process_args(argc, argv, &argr))
130 
131  /* ------------------------------------------------------------------ */
132  /* Read projection / map information for target area. */
133  /* ------------------------------------------------------------------ */
134 
135  status = MtkGCTPProjInfoRead(argr.proj_map_file, &target_proj_info);
136  if (status != MTK_SUCCESS) {
137  MTK_ERR_MSG_JUMP("Trouble with MtkGCTPProjInfoRead\n");
138  }
139 
140  status = MtkGenericMapInfoRead(argr.proj_map_file, &target_map_info);
141  if (status != MTK_SUCCESS) {
142  MTK_ERR_MSG_JUMP("Trouble with MtkGenericMapInfoRead\n");
143  }
144 
145  /* ------------------------------------------------------------------ */
146  /* Get orbit path number of input file. */
147  /* ------------------------------------------------------------------ */
148 
149  MtkFileToPath(argr.geom_file, &path);
150 
151  /* ------------------------------------------------------------------ */
152  /* Setup SOM region containing the target map. */
153  /* ------------------------------------------------------------------ */
154 
155  status = MtkSetRegionByGenericMapInfo(&target_map_info,
156  &target_proj_info,
157  path,
158  &region);
159  if (status != MTK_SUCCESS) {
160  MTK_ERR_MSG_JUMP("Trouble with MtkSetRegionByGenericMapInfo\n");
161  }
162 
163  /* ------------------------------------------------------------------ */
164  /* Create HDF-EOS file for result. */
165  /* ------------------------------------------------------------------ */
166 
167  if (target_map_info.origin_code == MTKe_ORIGIN_UL ||
168  target_map_info.origin_code == MTKe_ORIGIN_LR) {
169  dimlist = dimlist_ul_lr;
170  } else {
171  dimlist = dimlist_ur_ll;
172  }
173 
174  edge[0] = target_map_info.size_line;
175  edge[1] = target_map_info.size_sample;
176 
177  upleft[0] = target_map_info.min_x;
178  upleft[1] = target_map_info.max_y;
179  lowright[0] = target_map_info.max_x;
180  lowright[1] = target_map_info.min_y;
181 
182  size_x = (int)floor((target_map_info.max_x - target_map_info.min_x) /
183  target_map_info.resolution_x + 0.5);
184  size_y = (int)floor((target_map_info.max_y - target_map_info.min_y) /
185  target_map_info.resolution_y + 0.5);
186 
187  fid = GDopen(argr.output_filename,DFACC_CREATE);
188  if (fid == FAIL) {
189  MTK_ERR_MSG_JUMP("Trouble with GDopen\n");
190  }
191 
192  hstatus = GDcreate(fid,OUTPUT_GRIDNAME,size_x, size_y,
193  upleft, lowright);
194 
195  gid = GDattach(fid, OUTPUT_GRIDNAME);
196  if (gid == FAIL) {
197  MTK_ERR_MSG_JUMP("Trouble with GDattach\n");
198  }
199 
200  hstatus = GDdeforigin(gid,target_map_info.origin_code);
201  if (hstatus == FAIL) {
202  MTK_ERR_MSG_JUMP("Trouble with GDdeforigin\n");
203  }
204 
205  hstatus = GDdefpixreg(gid,target_map_info.pix_reg_code);
206  if (hstatus == FAIL) {
207  MTK_ERR_MSG_JUMP("Trouble with GDdefpixreg\n");
208  }
209 
210  hstatus = GDdefproj(gid,target_proj_info.proj_code,
211  target_proj_info.zone_code, target_proj_info.sphere_code,
212  target_proj_info.proj_param);
213  if (hstatus == FAIL) {
214  MTK_ERR_MSG_JUMP("Trouble with GDdefproj\n");
215  }
216 
217  /* ------------------------------------------------------------------ */
218  /* Calculate pixel lat/lon locations for target map. */
219  /* ------------------------------------------------------------------ */
220 
221  status = MtkGCTPCreateLatLon(&target_map_info,
222  &target_proj_info,
223  &latitude,
224  &longitude);
225  if (status != MTK_SUCCESS) {
226  MTK_ERR_MSG_JUMP("Trouble with MtkGCTPCreateLatLon\n");
227  }
228 
229 
230  /* ------------------------------------------------------------------ */
231  /* For each field to copy... */
232  /* ------------------------------------------------------------------ */
233 
234  for (ifield = 0 ; ifield < NUMBER_FIELD; ifield++) {
235  MTKt_MapInfo map_info = MTKT_MAPINFO_INIT;
236  /* Map information for this field. */
237 
238  printf("Processing %s...\n",fieldnames[ifield]);
239 
240  /* ------------------------------------------------------------------ */
241  /* Read data for the target area. */
242  /* ------------------------------------------------------------------ */
243 
244  status = MtkReadData(argr.geom_file, GP_GMP_GRID_NAME, fieldnames[ifield],
245  region, &geom_data_float64, &map_info);
246  if (status != MTK_SUCCESS) {
247  MTK_ERR_MSG_JUMP("Trouble with MtkReadData(geom)\n");
248  }
249 
250  /* ------------------------------------------------------------------ */
251  /* Convert float64 to float32. */
252  /* ------------------------------------------------------------------ */
253 
254  status = MtkDataBufferAllocate(geom_data_float64.nline, geom_data_float64.nsample,
255  MTKe_float, &geom_data);
256  if (status != MTK_SUCCESS) {
257  MTK_ERR_MSG_JUMP("Trouble with MtkDataBufferAllocate(geom_data)\n");
258  }
259 
260  for (iline = 0; iline < geom_data.nline; iline++) {
261  for (isample = 0; isample < geom_data.nsample; isample++) {
262  geom_data.data.f[iline][isample] = geom_data_float64.data.d[iline][isample];
263  }
264  }
265 
266  /* ------------------------------------------------------------------ */
267  /* Reproject data to the target map. */
268  /* ------------------------------------------------------------------ */
269 
270  status = MtkTransformCoordinates(map_info,
271  latitude,
272  longitude,
273  &line_coords,
274  &sample_coords);
275  if (status != MTK_SUCCESS) {
276  MTK_ERR_MSG_JUMP("Trouble with MtkTransformCoordinates\n");
277  }
278 
279  status = MtkResampleNearestNeighbor(geom_data,
280  line_coords,
281  sample_coords,
282  &resampled_geom_data);
283  if (status != MTK_SUCCESS) {
284  MTK_ERR_MSG_JUMP("Trouble with MtkResampleNearestNeighbor\n");
285  }
286 
287  /* ------------------------------------------------------------------ */
288  /* Write reprojected data to HDF-EOS file. */
289  /* ------------------------------------------------------------------ */
290 
291  hstatus = GDdeffield(gid, fieldnames[ifield], dimlist, DFNT_FLOAT32, 0);
292  if (hstatus == FAIL) {
293  MTK_ERR_MSG_JUMP("Trouble with GDdeffield()\n");
294  }
295 
296  hstatus = GDsetfillvalue(gid, fieldnames[ifield], &fill_float32);
297  if (hstatus == FAIL) {
298  MTK_ERR_MSG_JUMP("Trouble with GDsetfillvalue()\n");
299  }
300 
301  hstatus = GDsettilecomp(gid, fieldnames[ifield], tile_rank,
302  tile_dims, comp_code, comp_parm);
303  if (hstatus == FAIL) {
304  MTK_ERR_MSG_JUMP("Trouble with GDsettilecomp()\n");
305  }
306 
307  hstatus = GDwritefield(gid, fieldnames[ifield], NULL, NULL, edge,
308  resampled_geom_data.dataptr);
309  if (hstatus == FAIL) {
310  MTK_ERR_MSG_JUMP("Trouble with GDwritefield()\n");
311  }
312 
313  /* ------------------------------------------------------------------ */
314  /* Free memory. */
315  /* ------------------------------------------------------------------ */
316 
317  MtkDataBufferFree(&line_coords);
318  MtkDataBufferFree(&sample_coords);
319  MtkDataBufferFree(&geom_data);
320  MtkDataBufferFree(&geom_data_float64);
321  MtkDataBufferFree(&resampled_geom_data);
322 
323  /* ------------------------------------------------------------------ */
324  /* End loop for each field to copy. */
325  /* ------------------------------------------------------------------ */
326 
327  }
328 
329  /* ------------------------------------------------------------------ */
330  /* Free memory. */
331  /* ------------------------------------------------------------------ */
332 
333  MtkDataBufferFree(&latitude);
334  MtkDataBufferFree(&longitude);
335 
336  /* ------------------------------------------------------------------ */
337  /* Close HDF-EOS file. */
338  /* ------------------------------------------------------------------ */
339 
340  hstatus = GDdetach(gid);
341  if (hstatus == FAIL) {
342  MTK_ERR_MSG_JUMP("Trouble with GDdetach\n");
343  }
344  gid = FAIL;
345 
346  hstatus = GDclose(fid);
347  if (hstatus == FAIL) {
348  MTK_ERR_MSG_JUMP("Trouble with GDclose\n");
349  }
350  fid = FAIL;
351 
352  printf("Wrote output to %s\n",argr.output_filename);
353  printf("Completed normally.\n");
354  return 0;
355 
356 ERROR_HANDLE:
357  if (gid != FAIL) {
358  hstatus = GDdetach(gid);
359  }
360  if (fid != FAIL) {
361  hstatus = GDclose(fid);
362  }
363 
364  MtkDataBufferFree(&geom_data);
365  MtkDataBufferFree(&geom_data_float64);
366  MtkDataBufferFree(&resampled_geom_data);
367  MtkDataBufferFree(&latitude);
368  MtkDataBufferFree(&longitude);
369  MtkDataBufferFree(&line_coords);
370  MtkDataBufferFree(&sample_coords);
371 
372  printf("Failed: status code = %d\n",status_code);
373 
374  return status_code;
375 }
376 
377 void usage(char *func) {
378  fprintf(stderr,
379 "\nUsage: %s [--help] <projection/map info file>\n"
380 " <GP_GMP file> <output filename>\n",
381  func);
382 
383  fprintf(stderr,
384 "\n"
385 "Reproject MISR geometric parameters to the given map projection.\n"
386 "Resampling is by nearest-neighbor.\n"
387 "\n"
388 "Result is written to an HDF-EOS file in the following fields:\n"
389 " SolarAzimuth Solar azimuth angle.\n"
390 " SolarZenith Solar zenith angle.\n"
391 " <cam>Azimuth View azimuth angle for this camera.\n"
392 " <cam>Zenith View zenith angle for this camera.\n"
393 "\n"
394 "All output fields have identical map projection and size.\n"
395 "\n"
396  );
397 
398  fprintf(stderr,
399 "COMMAND-LINE OPTIONS\n"
400 "\n"
401 "--help\n"
402 " Returns this usage info.\n"
403 "\n"
404  );
405 
406  fprintf(stderr,
407 "COMMAND-LINE ARGUMENTS\n"
408 "\n"
409 "<projection/map info file>\n"
410 " Text format file map projection for the output file. Parameters are\n"
411 " specified as name = value pairs. Parameter names are as follows:\n"
412 "\n"
413 " proj_code is the GCTP projection code.\n"
414 " utm_zone is the UTM zone number for UTM projections only.\n"
415 " sphere_code is GCTP spheroid code.\n"
416 " proj_param(n) is the nth GCTP projection parameter. (1 <= n <= 15)\n"
417 " min_corner_x is the minimum X coordinate at the edge of the map.\n"
418 " min_corner_y is the minimum Y coordinate at the edge of the map.\n"
419 " resolution_x is the size of a pixel along the X-axis.\n"
420 " resolution_y is the size of a pixel along the Y-axis.\n"
421 " number_pixel_x is the size of the map in pixels, along the X-axis.\n"
422 " number_pixel_y is the size of the map in pixels, along the Y-axis.\n"
423 " origin_code defines the corner of the map at which pixel 0,0 is located.\n"
424 " pix_reg_code defines whether a pixel value is related to the corner or\n"
425 " center of the corresponding area of that pixel on the map. If the\n"
426 " corner is used, then it is always the corner corresponding to the\n"
427 " corner of the origin.\n"
428 "\n"
429 " Possible values for origin_code are:\n"
430 " UL - Upper Left (min X, max Y)\n"
431 " UR - Upper Right (max X, max Y)\n"
432 " LL - Lower Left (min X, min Y)\n"
433 " LR - Lower Right (max X, min Y)\n"
434 "\n"
435 " Possible values are:\n"
436 " CENTER - Center\n"
437 " CORNER - Corner\n"
438 "\n"
439 " Unrecognized parameter names are ignored.\n"
440 " Lines starting with a '#' character are ignored.\n"
441 " Anything after the name = value pair on a line is ignored.\n"
442 "\n"
443 " Example projection/map info file:\n"
444 " # Albers equal-area conic projection parameters\n"
445 " proj_code = 3 # Albers equal-area conic\n"
446 " sphere_code = 8 # GRS80\n"
447 " proj_param(3) = 29030000.0 # Latitude of the first standard parallel\n"
448 " proj_param(4) = 45030000.0 # Latitude of the second standard parallel\n"
449 " proj_param(5) = -96000000.0 # Longitude of the central meridian\n"
450 " proj_param(6) = 23000000.0 # Latitude of the projection origin\n"
451 " # Map information\n"
452 " min_corner_x = 1930612.449614\n"
453 " min_corner_y = 2493633.488881\n"
454 " resolution_x = 250.0\n"
455 " resolution_y = 250.0\n"
456 " number_pixel_x = 1311\n"
457 " number_pixel_y = 2078\n"
458 " origin_code = UL # Min x, Max y; Line=Y, Sample=X\n"
459 " pix_reg_code = CENTER\n"
460 "\n"
461 "\n"
462 "<GP_GMP file>\n"
463 " MISR Geometric parameters (GP_GMP).\n"
464 "\n"
465 "<output filename>\n"
466 " Filename for output file.\n"
467 "\n"
468 "Example:\n"
469 "\n"
470 " MtkResampleGeom proj_map_info.txt \\\n"
471 " MISR_AM1_GP_GMP_P011_O013842_F03_0013.hdf \\\n"
472 " GEOM_O013824_maine.hdf\n"
473 "\n"
474  );
475 }
476 
477 int process_args(int argc, char *argv[], argr_type *argr) {
478 
479  MTKt_status status_code = MTK_FAILURE;
480  extern char *optarg;
481  extern int optind;
482  int ch;
483 
484  /* options descriptor */
485  static struct option longopts[] = {
486  { "help", no_argument, 0, 'h' },
487  { 0, 0, 0, 0 }
488  };
489 
490  while ((ch = getopt_long(argc, argv, "h", longopts, NULL)) != -1) {
491 
492  switch(ch) {
493  case 'h':
495  break;
496  default:
497  MTK_ERR_MSG_JUMP("Invalid arguments");
498  }
499  }
500 
501  if (argc-optind != 3) MTK_ERR_CODE_JUMP(MTK_OUTBOUNDS);
502 
503  argr->proj_map_file = argv[optind++];
504  argr->geom_file = argv[optind++];
505  argr->output_filename = argv[optind++];
506 
507  return MTK_SUCCESS;
508  ERROR_HANDLE:
509  usage(argv[0]);
510  return status_code;
511 }
512 
intn GDdefpixreg(int32, int32)
MTKt_double ** d
Definition: MisrUtil.h:94
MTKt_status MtkGCTPProjInfoRead(const char *Filename, MTKt_GCTPProjInfo *Proj_info)
Initialize a MTKt_GCTPProjInfo structure using data from an external file.
MTKt_PixRegCode pix_reg_code
Definition: MisrMapQuery.h:116
char * output_filename
MTKt_status MtkDataBufferAllocate(int nline, int nsample, MTKt_DataType datatype, MTKt_DataBuffer *databuf)
Allocate Data Buffer.
int32 GDattach(int32, char *)
MTKt_status MtkSetRegionByGenericMapInfo(const MTKt_GenericMapInfo *Map_info, const MTKt_GCTPProjInfo *Proj_info, int Path, MTKt_Region *Region)
Create an MtkRegion structure that contains the given map.
#define NUMBER_FIELD
MTKt_OriginCode origin_code
Definition: MisrMapQuery.h:115
Generic map information.
Definition: MisrMapQuery.h:98
MTKt_DataBufferType data
Definition: MisrUtil.h:104
intn GDclose(int32)
#define MTKT_MAPINFO_INIT
Definition: MisrMapQuery.h:79
GCTP projection information.
Definition: MisrMapQuery.h:123
MTKt_status MtkTransformCoordinates(MTKt_MapInfo mapinfo, MTKt_DataBuffer latbuf, MTKt_DataBuffer lonbuf, MTKt_DataBuffer *linebuf, MTKt_DataBuffer *samplebuf)
Transforms latitude/longitude coordinates into line/sample coordinates for a given mapinfo...
#define MTKT_REGION_INIT
Definition: MisrSetRegion.h:46
int main(int argc, char *argv[])
void usage(char *func)
#define MTK_ERR_CODE_JUMP(code)
Definition: MisrError.h:175
Map Information.
Definition: MisrMapQuery.h:65
intn GDdetach(int32)
intn GDdeforigin(int32, int32)
JCOPY_OPTION option
Definition: transupp.h:131
2-dimensional Data Buffer
Definition: MisrUtil.h:98
MTKt_float ** f
Definition: MisrUtil.h:93
#define MTKT_DATABUFFER_INIT
Definition: MisrUtil.h:109
int32 GDcreate(int32, char *, int32, int32, float64 [], float64 [])
void * dataptr
Definition: MisrUtil.h:106
MTKt_status MtkDataBufferFree(MTKt_DataBuffer *databuf)
Free data buffer.
MTKt_status MtkGCTPCreateLatLon(const MTKt_GenericMapInfo *Map_info, const MTKt_GCTPProjInfo *Proj_info, MTKt_DataBuffer *Latitude, MTKt_DataBuffer *Longitude)
Create an array of latitude and longitude values corresponding to each pixel in the given map...
char * geom_file
intn GDdefproj(int32, int32, int32, int32, float64 [])
char * proj_map_file
MTKt_status MtkReadData(const char *filename, const char *gridname, const char *fieldname, MTKt_Region region, MTKt_DataBuffer *databuf, MTKt_MapInfo *mapinfo)
Reads any grid/field from any MISR product file and performs unpacking or unscaling. It also reads any MISR conventional product file.
Definition: MtkReadData.c:62
double proj_param[15]
Definition: MisrMapQuery.h:127
int process_args(int argc, char *argv[], argr_type *argr)
intn GDsettilecomp(int32, char *, int32, int32 *, int32, intn *)
#define DFNT_FLOAT32
Definition: hntdefs.h:36
#define MTK_ERR_MSG_JUMP(msg)
Definition: MisrError.h:169
intn GDsetfillvalue(int32, char *, VOIDP)
#define GP_GMP_GRID_NAME
MTKt_status MtkGenericMapInfoRead(const char *Filename, MTKt_GenericMapInfo *Map_info)
Initialize a MTKt_GenericMapInfo structure using data from an external file.
intn GDdeffield(int32, char *, char *, int32, int32)
intn GDwritefield(int32, char *, int32 [], int32 [], int32 [], VOIDP)
#define HDFE_COMP_DEFLATE
Definition: HdfEosDef.h:78
#define OUTPUT_GRIDNAME
MTKt_status MtkResampleNearestNeighbor(MTKt_DataBuffer srcbuf, MTKt_DataBuffer linebuf, MTKt_DataBuffer samplebuf, MTKt_DataBuffer *resampbuf)
Perform nearest neighbor resampling.
#define ARGR_TYPE_INIT
MTKt_status
Definition: MisrError.h:11
#define MTKT_GENERICMAPINFO_INIT
Definition: MisrMapQuery.h:120
Region of interest.
Definition: MisrSetRegion.h:41
int32 GDopen(char *, intn)
#define DFACC_CREATE
Definition: hdf.h:46
#define MTKT_GCTPPROJINFO_INIT
Definition: MisrMapQuery.h:130
MTKt_status MtkFileToPath(const char *filename, int *path)
Read path number from file.
Definition: MtkFileToPath.c:35
#define FAIL
Definition: hdf.h:94

MISR Toolkit - Copyright © 2005 - 2020 Jet Propulsion Laboratory
Generated on Fri Jun 19 2020 22:49:51