14 #ifdef USE_HDFEOS2_LIB
15 #include "HDFEOS2ArraySwathGeoDimMapExtraField.h"
21 #include "HDFCFUtil.h"
22 #include "InternalErr.h"
28 #define SIGNED_BYTE_TO_INT32 1
32 HDFEOS2ArraySwathGeoDimMapExtraField::read ()
35 BESDEBUG(
"h4",
"Coming to HDFEOS2ArraySwathGeoDimMapExtraField read "<<endl);
49 int nelms = format_constraint(&offset[0],&step[0],&count[0]);
52 vector<int32>offset32;
53 offset32.resize(rank);
60 for (
int i = 0; i < rank; i++) {
61 offset32[i] = (int32) offset[i];
62 count32[i] = (int32) count[i];
63 step32[i] = (int32) step[i];
66 int32 (*openfunc) (
char *, intn);
67 intn (*closefunc) (int32);
68 int32 (*attachfunc) (int32,
char *);
69 intn (*detachfunc) (int32);
70 intn (*fieldinfofunc) (int32,
char *, int32 *, int32 *, int32 *,
char *);
71 intn (*readfieldfunc) (int32,
char *, int32 *, int32 *, int32 *,
void *);
72 int32 (*inqfunc) (
char *,
char *, int32 *);
78 attachfunc = SWattach;
79 detachfunc = SWdetach;
80 fieldinfofunc = SWfieldinfo;
81 readfieldfunc = SWreadfield;
90 fileid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
93 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
94 throw InternalErr (__FILE__, __LINE__, eherr.str ());
99 int32 swathnamesize = 0;
100 numswath = inqfunc (
const_cast < char *
>(filename.c_str ()), NULL,
103 if (numswath == -1) {
106 eherr <<
"File " << filename.c_str () <<
" cannot obtain the swath list.";
107 throw InternalErr (__FILE__, __LINE__, eherr.str ());
113 eherr <<
" Currently we only support reading geo-location fields from one swath."
114 <<
" This file has more than one swath. ";
115 throw InternalErr (__FILE__, __LINE__, eherr.str ());
118 char *swathname =
new char[swathnamesize + 1];
119 numswath = inqfunc (
const_cast < char *
>(filename.c_str ()), swathname,
121 if (numswath == -1) {
125 eherr <<
"File " << filename.c_str () <<
" cannot obtain the swath list.";
126 throw InternalErr (__FILE__, __LINE__, eherr.str ());
129 swathid = attachfunc (fileid, swathname);
133 eherr <<
"Grid/Swath " << swathname <<
" cannot be attached.";
135 throw InternalErr (__FILE__, __LINE__, eherr.str ());
141 int32 tmp_dims[rank];
142 char tmp_dimlist[1024];
145 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
146 &tmp_rank, tmp_dims, &type, tmp_dimlist);
148 detachfunc (swathid);
151 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
152 throw InternalErr (__FILE__, __LINE__, eherr.str ());
162 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
163 &offset32[0], &step32[0], &count32[0], &val[0]);
165 detachfunc (swathid);
168 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
169 throw InternalErr (__FILE__, __LINE__, eherr.str ());
172 #ifndef SIGNED_BYTE_TO_INT32
173 set_value ((dods_byte *) &val[0], nelms);
177 newval.resize(nelms);
178 for (
int counter = 0; counter < nelms; counter++)
179 newval[counter] = (int32) (val[counter]);
181 set_value ((dods_int32 *) &newval[0], nelms);
192 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
193 &offset32[0], &step32[0], &count32[0], &val[0]);
195 detachfunc (swathid);
198 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
199 throw InternalErr (__FILE__, __LINE__, eherr.str ());
202 set_value ((dods_byte *) &val[0], nelms);
210 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
211 &offset32[0], &step32[0], &count32[0], &val[0]);
213 detachfunc (swathid);
216 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
217 throw InternalErr (__FILE__, __LINE__, eherr.str ());
220 set_value ((dods_int16 *) &val[0], nelms);
227 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
228 &offset32[0], &step32[0], &count32[0], &val[0]);
230 detachfunc (swathid);
233 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
234 throw InternalErr (__FILE__, __LINE__, eherr.str ());
237 set_value ((dods_uint16 *) &val[0], nelms);
244 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
245 &offset32[0], &step32[0], &count32[0], &val[0]);
247 detachfunc (swathid);
250 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
251 throw InternalErr (__FILE__, __LINE__, eherr.str ());
254 set_value ((dods_int32 *) &val[0], nelms);
261 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
262 &offset32[0], &step32[0], &count32[0], &val[0]);
264 detachfunc (swathid);
267 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
268 throw InternalErr (__FILE__, __LINE__, eherr.str ());
271 set_value ((dods_uint32 *) &val[0], nelms);
278 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
279 &offset32[0], &step32[0], &count32[0], &val[0]);
281 detachfunc (swathid);
284 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
285 throw InternalErr (__FILE__, __LINE__, eherr.str ());
288 set_value ((dods_float32 *) &val[0], nelms);
295 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
296 &offset32[0], &step32[0], &count32[0], &val[0]);
298 detachfunc (swathid);
301 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
302 throw InternalErr (__FILE__, __LINE__, eherr.str ());
304 set_value ((dods_float64 *) &val[0], nelms);
311 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
315 r = detachfunc (swathid);
318 throw InternalErr (__FILE__, __LINE__,
"The swath cannot be detached.");
322 r = closefunc (fileid);
326 eherr <<
"Grid/Swath " << filename.c_str () <<
" cannot be closed.";
327 throw InternalErr (__FILE__, __LINE__, eherr.str ());
336 HDFEOS2ArraySwathGeoDimMapExtraField::format_constraint (
int *offset,
int *step,
int *count)
341 Dim_iter p = dim_begin ();
342 while (p != dim_end ()) {
344 int start = dimension_start (p,
true);
345 int stride = dimension_stride (p,
true);
346 int stop = dimension_stop (p,
true);
351 oss <<
"Array/Grid hyperslab start point "<< start <<
352 " is greater than stop point " << stop <<
".";
353 throw Error(malformed_expr, oss.str());
358 count[id] = ((stop - start) / stride) + 1;
362 "=format_constraint():"
363 <<
"id=" <<
id <<
" offset=" << offset[
id]
364 <<
" step=" << step[
id]
365 <<
" count=" << count[
id]