15#include "HDFEOS2ArraySwathGeoField.h"
19#include <libdap/debug.h>
20#include <libdap/InternalErr.h>
22#include "HDF4RequestHandler.h"
26#define SIGNED_BYTE_TO_INT32 1
29HDFEOS2ArraySwathGeoField::read ()
32 BESDEBUG(
"h4",
"Coming to HDFEOS2ArraySwathGeoField read "<<endl);
37 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
38 bool check_pass_fileid_key =
false;
39 check_pass_fileid_key = HDFCFUtil::check_beskeys(check_pass_fileid_key_str);
42 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
53 int nelms = format_constraint (offset.data(), step.data(), count.data());
56 vector<int32>offset32;
57 offset32.resize(rank);
64 for (
int i = 0; i < rank; i++) {
65 offset32[i] = (int32) offset[i];
66 count32[i] = (int32) count[i];
67 step32[i] = (int32) step[i];
70 int32 (*openfunc) (
char *, intn);
71 int32 (*attachfunc) (int32,
char *);
72 intn (*detachfunc) (int32);
73 intn (*fieldinfofunc) (int32,
char *, int32 *, int32 *, int32 *,
char *);
74 intn (*readfieldfunc) (int32,
char *, int32 *, int32 *, int32 *,
void *);
79 attachfunc = SWattach;
80 detachfunc = SWdetach;
81 fieldinfofunc = SWfieldinfo;
82 readfieldfunc = SWreadfield;
83 datasetname = swathname;
91 if(
false == check_pass_fileid_key) {
92 sfid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
95 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
96 throw InternalErr (__FILE__, __LINE__, eherr.str ());
102 swathid = attachfunc (sfid,
const_cast < char *
>(datasetname.c_str ()));
107 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be attached.";
108 throw InternalErr (__FILE__, __LINE__, eherr.str ());
113 vector<int32>tmp_dims;
114 tmp_dims.resize(rank);
115 char tmp_dimlist[1024];
118 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
119 &tmp_rank, tmp_dims.data(), &type, tmp_dimlist);
121 detachfunc (swathid);
124 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
125 throw InternalErr (__FILE__, __LINE__, eherr.str ());
134 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
136 detachfunc (swathid);
139 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
140 throw InternalErr (__FILE__, __LINE__, eherr.str ());
145#ifndef SIGNED_BYTE_TO_INT32
146 set_value ((dods_byte *) val.data(), nelms);
149 newval.resize(nelms);
151 for (
int counter = 0; counter < nelms; counter++)
152 newval[counter] = (int32) (val[counter]);
153 set_value ((dods_int32 *) newval.data(), nelms);
162 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
164 detachfunc (swathid);
167 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
168 throw InternalErr (__FILE__, __LINE__, eherr.str ());
171 set_value ((dods_byte *) val.data(), nelms);
179 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
181 detachfunc (swathid);
184 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
185 throw InternalErr (__FILE__, __LINE__, eherr.str ());
191 bool needadjust =
false;
193 if ((val[0] < -1000) || (val[0] > 1000))
196 if ((val[nelms / 2] < -1000)
197 || (val[nelms / 2] > 1000))
200 if ((val[nelms - 1] < -1000)
201 || (val[nelms - 1] > 1000))
203 if (
true == needadjust) {
204 vector<float32>newval;
205 newval.resize(nelms);
206 float scale_factor = 0.01f;
208 for (
int i = 0; i < nelms; i++)
209 newval[i] = scale_factor * (float32) val[i];
210 set_value ((dods_float32 *) newval.data(), nelms);
214 set_value ((dods_int16 *) val.data(), nelms);
223 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
225 detachfunc (swathid);
228 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
229 throw InternalErr (__FILE__, __LINE__, eherr.str ());
232 set_value ((dods_uint16 *) val.data(), nelms);
240 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
242 detachfunc (swathid);
245 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
246 throw InternalErr (__FILE__, __LINE__, eherr.str ());
249 set_value ((dods_int32 *) val.data(), nelms);
257 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
259 detachfunc (swathid);
262 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
263 throw InternalErr (__FILE__, __LINE__, eherr.str ());
266 set_value ((dods_uint32 *) val.data(), nelms);
274 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
276 detachfunc (swathid);
279 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
280 throw InternalErr (__FILE__, __LINE__, eherr.str ());
282 set_value ((dods_float32 *) val.data(), nelms);
289 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
291 detachfunc (swathid);
294 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
295 throw InternalErr (__FILE__, __LINE__, eherr.str ());
298 set_value ((dods_float64 *) val.data(), nelms);
302 detachfunc (swathid);
304 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
307 r = detachfunc (swathid);
311 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be detached.";
312 throw InternalErr (__FILE__, __LINE__, eherr.str ());
318 r = closefunc (sfid);
321 eherr <<
"Swath " << filename.c_str () <<
" cannot be closed.";
322 throw InternalErr (__FILE__, __LINE__, eherr.str ());
332HDFEOS2ArraySwathGeoField::format_constraint (
int *offset,
int *step,
int *count)
337 Dim_iter p = dim_begin ();
338 while (p != dim_end ()) {
340 int start = dimension_start (p,
true);
341 int stride = dimension_stride (p,
true);
342 int stop = dimension_stop (p,
true);
347 oss <<
"Array/Grid hyperslab start point "<< start <<
348 " is greater than stop point " << stop <<
".";
349 throw Error(malformed_expr, oss.str());
354 count[id] = ((stop - start) / stride) + 1;
358 "=format_constraint():"
359 <<
"id=" <<
id <<
" offset=" << offset[
id]
360 <<
" step=" << step[
id]
361 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)