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 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
48 int nelms = format_constraint (offset.data(), step.data(), count.data());
52 offset32.resize(rank);
59 for (
int i = 0; i < rank; i++) {
60 offset32[i] = (int32) offset[i];
61 count32[i] = (int32) count[i];
62 step32[i] = (int32) step[i];
65 int32 (*openfunc) (
char *, intn);
66 int32 (*attachfunc) (int32,
char *);
67 intn (*detachfunc) (int32);
68 intn (*fieldinfofunc) (int32,
char *, int32 *, int32 *, int32 *,
char *);
69 intn (*readfieldfunc) (int32,
char *, int32 *, int32 *, int32 *,
void *);
74 attachfunc = SWattach;
75 detachfunc = SWdetach;
76 fieldinfofunc = SWfieldinfo;
77 readfieldfunc = SWreadfield;
78 datasetname = swathname;
86 if (
false == check_pass_fileid_key) {
87 sfid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
90 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
91 throw InternalErr (__FILE__, __LINE__, eherr.str ());
97 swathid = attachfunc (sfid,
const_cast < char *
>(datasetname.c_str ()));
102 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be attached.";
103 throw InternalErr (__FILE__, __LINE__, eherr.str ());
109 tmp_dims.resize(rank);
110 char tmp_dimlist[1024];
113 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
114 &tmp_rank, tmp_dims.data(), &type, tmp_dimlist);
116 detachfunc (swathid);
119 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
120 throw InternalErr (__FILE__, __LINE__, eherr.str ());
129 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
131 detachfunc (swathid);
134 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
135 throw InternalErr (__FILE__, __LINE__, eherr.str ());
140#ifndef SIGNED_BYTE_TO_INT32
141 set_value ((dods_byte *) val.data(), nelms);
144 newval.resize(nelms);
146 for (
int counter = 0; counter < nelms; counter++)
147 newval[counter] = (int32) (val[counter]);
148 set_value ((dods_int32 *) newval.data(), nelms);
157 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
159 detachfunc (swathid);
162 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
163 throw InternalErr (__FILE__, __LINE__, eherr.str ());
166 set_value ((dods_byte *) val.data(), nelms);
174 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
176 detachfunc (swathid);
179 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
180 throw InternalErr (__FILE__, __LINE__, eherr.str ());
186 bool needadjust =
false;
188 if ((val[0] < -1000) || (val[0] > 1000))
191 if ((val[nelms / 2] < -1000)
192 || (val[nelms / 2] > 1000))
195 if ((val[nelms - 1] < -1000)
196 || (val[nelms - 1] > 1000))
198 if (
true == needadjust) {
200 newval.resize(nelms);
201 float scale_factor = 0.01f;
203 for (
int i = 0; i < nelms; i++)
204 newval[i] = scale_factor * (float32) val[i];
205 set_value ((dods_float32 *) newval.data(), nelms);
209 set_value ((dods_int16 *) val.data(), nelms);
218 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
220 detachfunc (swathid);
223 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
224 throw InternalErr (__FILE__, __LINE__, eherr.str ());
227 set_value ((dods_uint16 *) val.data(), nelms);
235 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
237 detachfunc (swathid);
240 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
241 throw InternalErr (__FILE__, __LINE__, eherr.str ());
244 set_value ((dods_int32 *) val.data(), nelms);
252 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
254 detachfunc (swathid);
257 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
258 throw InternalErr (__FILE__, __LINE__, eherr.str ());
261 set_value ((dods_uint32 *) val.data(), nelms);
269 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
271 detachfunc (swathid);
274 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
275 throw InternalErr (__FILE__, __LINE__, eherr.str ());
277 set_value ((dods_float32 *) val.data(), nelms);
284 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
286 detachfunc (swathid);
289 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
290 throw InternalErr (__FILE__, __LINE__, eherr.str ());
293 set_value ((dods_float64 *) val.data(), nelms);
297 detachfunc (swathid);
299 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
302 r = detachfunc (swathid);
306 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be detached.";
307 throw InternalErr (__FILE__, __LINE__, eherr.str ());
318HDFEOS2ArraySwathGeoField::format_constraint (
int *offset,
int *step,
int *count)
323 Dim_iter p = dim_begin ();
324 while (p != dim_end ()) {
326 int start = dimension_start (p,
true);
327 int stride = dimension_stride (p,
true);
328 int stop = dimension_stop (p,
true);
333 oss <<
"Array/Grid hyperslab start point "<< start <<
334 " is greater than stop point " << stop <<
".";
335 throw Error(malformed_expr, oss.str());
340 count[id] = ((stop - start) / stride) + 1;
344 "=format_constraint():"
345 <<
"id=" <<
id <<
" offset=" << offset[
id]
346 <<
" step=" << step[
id]
347 <<
" count=" << count[
id]
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)