10 #ifdef USE_HDFEOS2_LIB
12 #include "HDFEOS2ArraySwathGeoMultiDimMapField.h"
17 #include "InternalErr.h"
19 #include "HDF4RequestHandler.h"
23 #define SIGNED_BYTE_TO_INT32 1
26 HDFEOS2ArraySwathGeoMultiDimMapField::read ()
29 BESDEBUG(
"h4",
"Coming to HDFEOS2ArraySwathGeoMultiDimMapField read "<<endl);
35 throw InternalErr (__FILE__, __LINE__,
"The field rank must be 2 for swath multi-dimension map reading.");
38 string check_pass_fileid_key_str=
"H4.EnablePassFileID";
39 bool check_pass_fileid_key =
false;
40 check_pass_fileid_key = HDFCFUtil::check_beskeys(check_pass_fileid_key_str);
43 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
54 int nelms = format_constraint (&offset[0], &step[0], &count[0]);
57 vector<int32>offset32;
58 offset32.resize(rank);
65 for (
int i = 0; i < rank; i++) {
66 offset32[i] = (int32) offset[i];
67 count32[i] = (int32) count[i];
68 step32[i] = (int32) step[i];
71 int32 (*openfunc) (
char *, intn);
72 int32 (*attachfunc) (int32,
char *);
73 intn (*detachfunc) (int32);
74 intn (*fieldinfofunc) (int32,
char *, int32 *, int32 *, int32 *,
char *);
75 intn (*readfieldfunc) (int32,
char *, int32 *, int32 *, int32 *,
void *);
80 attachfunc = SWattach;
81 detachfunc = SWdetach;
82 fieldinfofunc = SWfieldinfo;
83 readfieldfunc = SWreadfield;
84 datasetname = swathname;
87 vector<int>dm_dimsizes;
88 dm_dimsizes.resize(rank);
89 vector<int>dm_offsets;
90 dm_offsets.resize(rank);
93 bool no_interpolation =
true;
95 if(dim0inc != 0 || dim1inc !=0 || dim0offset != 0 || dim1offset != 0) {
96 dm_dimsizes[0] = dim0size;
97 dm_dimsizes[1] = dim1size;
98 dm_offsets[0] = dim0offset;
99 dm_offsets[1] = dim1offset;
100 dm_incs[0] = dim0inc;
101 dm_incs[1] = dim1inc;
102 no_interpolation =
false;
111 if(
false == check_pass_fileid_key) {
112 sfid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
115 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
116 throw InternalErr (__FILE__, __LINE__, eherr.str ());
123 cerr<<
"swath name is "<<datasetname <<endl;
124 cerr<<
"swath rank is "<<rank <<endl;
125 cerr<<
"swath field name is "<<fieldname <<endl;
126 cerr<<
"swath field new name is "<<name() <<endl;
128 cerr<<
"datadim0size "<<dim0size <<endl;
129 cerr<<
"datadim1size "<<dim1size <<endl;
130 cerr<<
"datadim0offset "<<dim0offset <<endl;
131 cerr<<
"datadim1offset "<<dim1offset <<endl;
132 cerr<<
"datadim0inc "<<dim0inc <<endl;
133 cerr<<
"datadim1inc "<<dim1inc <<endl;
136 swathid = attachfunc (sfid,
const_cast < char *
>(datasetname.c_str ()));
141 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be attached.";
142 throw InternalErr (__FILE__, __LINE__, eherr.str ());
147 vector<int32>tmp_dims;
148 tmp_dims.resize(rank);
149 char tmp_dimlist[1024];
152 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
153 &tmp_rank, &tmp_dims[0], &type, tmp_dimlist);
155 detachfunc (swathid);
158 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
159 throw InternalErr (__FILE__, __LINE__, eherr.str ());
162 vector<int32> newdims;
163 newdims.resize(tmp_rank);
169 if(
true == no_interpolation) {
172 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
174 detachfunc (swathid);
177 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
178 throw InternalErr (__FILE__, __LINE__, eherr.str ());
180 #ifndef SIGNED_BYTE_TO_INT32
181 set_value ((dods_byte *) &val[0], nelms);
184 newval.resize(nelms);
186 for (
int counter = 0; counter < nelms; counter++)
187 newval[counter] = (int32) (val[counter]);
188 set_value ((dods_int32 *) &newval[0], nelms);
194 vector <int8> total_val8;
195 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val8, newdims);
198 detachfunc (swathid);
201 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
202 throw InternalErr (__FILE__, __LINE__, eherr.str ());
207 Field2DSubset (&val8[0], newdims[0], newdims[1],&total_val8[0],
208 &offset32[0], &count32[0], &step32[0]);
210 #ifndef SIGNED_BYTE_TO_INT32
211 set_value ((dods_byte *) &val8[0], nelms);
214 newval.resize(nelms);
216 for (
int counter = 0; counter < nelms; counter++)
217 newval[counter] = (int32) (val8[counter]);
218 set_value ((dods_int32 *) &newval[0], nelms);
226 if(no_interpolation ==
false) {
227 vector <uint8> total_val_uint8;
228 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint8, newdims);
231 detachfunc (swathid);
234 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
235 throw InternalErr (__FILE__, __LINE__, eherr.str ());
238 vector<uint8>val_uint8;
239 val_uint8.resize(nelms);
240 Field2DSubset (&val_uint8[0], newdims[0], newdims[1],&total_val_uint8[0],
241 &offset32[0], &count32[0], &step32[0]);
243 set_value ((dods_byte *) &val_uint8[0], nelms);
249 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
251 detachfunc (swathid);
254 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
255 throw InternalErr (__FILE__, __LINE__, eherr.str ());
258 set_value ((dods_byte *) &val[0], nelms);
265 if(no_interpolation ==
false) {
266 vector <int16> total_val_int16;
267 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int16, newdims);
270 detachfunc (swathid);
273 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
274 throw InternalErr (__FILE__, __LINE__, eherr.str ());
277 vector<int16>val_int16;
278 val_int16.resize(nelms);
279 Field2DSubset (&val_int16[0], newdims[0], newdims[1],&total_val_int16[0],
280 &offset32[0], &count32[0], &step32[0]);
282 set_value ((dods_int16 *) &val_int16[0], nelms);
288 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
290 detachfunc (swathid);
293 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
294 throw InternalErr (__FILE__, __LINE__, eherr.str ());
296 set_value ((dods_int16 *) &val[0], nelms);
303 if(no_interpolation ==
false) {
304 vector <uint16> total_val_uint16;
305 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint16, newdims);
308 detachfunc (swathid);
311 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
312 throw InternalErr (__FILE__, __LINE__, eherr.str ());
315 vector<uint16>val_uint16;
316 val_uint16.resize(nelms);
317 Field2DSubset (&val_uint16[0], newdims[0], newdims[1],&total_val_uint16[0],
318 &offset32[0], &count32[0], &step32[0]);
320 set_value ((dods_uint16 *) &val_uint16[0], nelms);
326 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
328 detachfunc (swathid);
331 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
332 throw InternalErr (__FILE__, __LINE__, eherr.str ());
335 set_value ((dods_uint16 *) &val[0], nelms);
342 if(no_interpolation ==
false) {
343 vector <int32> total_val_int32;
344 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int32, newdims);
347 detachfunc (swathid);
350 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
351 throw InternalErr (__FILE__, __LINE__, eherr.str ());
354 vector<int32>val_int32;
355 val_int32.resize(nelms);
356 Field2DSubset (&val_int32[0], newdims[0], newdims[1],&total_val_int32[0],
357 &offset32[0], &count32[0], &step32[0]);
359 set_value ((dods_int32 *) &val_int32[0], nelms);
364 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
366 detachfunc (swathid);
369 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
370 throw InternalErr (__FILE__, __LINE__, eherr.str ());
373 set_value ((dods_int32 *) &val[0], nelms);
380 if(no_interpolation ==
false) {
381 vector <uint32> total_val_uint32;
382 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint32, newdims);
385 detachfunc (swathid);
388 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
389 throw InternalErr (__FILE__, __LINE__, eherr.str ());
392 vector<uint32>val_uint32;
393 val_uint32.resize(nelms);
394 Field2DSubset (&val_uint32[0], newdims[0], newdims[1],&total_val_uint32[0],
395 &offset32[0], &count32[0], &step32[0]);
397 set_value ((dods_uint32 *) &val_uint32[0], nelms);
402 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
404 detachfunc (swathid);
407 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
408 throw InternalErr (__FILE__, __LINE__, eherr.str ());
411 set_value ((dods_uint32 *) &val[0], nelms);
417 if(no_interpolation ==
false) {
418 vector <float32> total_val_f32;
419 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f32, newdims);
422 detachfunc (swathid);
425 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
426 throw InternalErr (__FILE__, __LINE__, eherr.str ());
429 vector<float32>val_f32;
430 val_f32.resize(nelms);
431 Field2DSubset (&val_f32[0], newdims[0], newdims[1],&total_val_f32[0],
432 &offset32[0], &count32[0], &step32[0]);
434 set_value ((dods_float32 *) &val_f32[0], nelms);
439 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
441 detachfunc (swathid);
444 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
445 throw InternalErr (__FILE__, __LINE__, eherr.str ());
447 set_value ((dods_float32 *) &val[0], nelms);
453 if(no_interpolation ==
false) {
454 vector <float64> total_val_f64;
455 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f64, newdims);
458 detachfunc (swathid);
461 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
462 throw InternalErr (__FILE__, __LINE__, eherr.str ());
465 vector<float64>val_f64;
466 val_f64.resize(nelms);
467 Field2DSubset (&val_f64[0], newdims[0], newdims[1],&total_val_f64[0],
468 &offset32[0], &count32[0], &step32[0]);
470 set_value ((dods_float64 *) &val_f64[0], nelms);
475 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), &offset32[0], &step32[0], &count32[0], &val[0]);
477 detachfunc (swathid);
480 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
481 throw InternalErr (__FILE__, __LINE__, eherr.str ());
484 set_value ((dods_float64 *) &val[0], nelms);
489 detachfunc (swathid);
491 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
494 r = detachfunc (swathid);
498 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be detached.";
499 throw InternalErr (__FILE__, __LINE__, eherr.str ());
505 r = closefunc (sfid);
508 eherr <<
"Swath " << filename.c_str () <<
" cannot be closed.";
509 throw InternalErr (__FILE__, __LINE__, eherr.str ());
519 HDFEOS2ArraySwathGeoMultiDimMapField::format_constraint (
int *offset,
int *step,
int *count)
524 Dim_iter p = dim_begin ();
525 while (p != dim_end ()) {
527 int start = dimension_start (p,
true);
528 int stride = dimension_stride (p,
true);
529 int stop = dimension_stop (p,
true);
534 oss <<
"Array/Grid hyperslab start point "<< start <<
535 " is greater than stop point " << stop <<
".";
536 throw Error(malformed_expr, oss.str());
541 count[id] = ((stop - start) / stride) + 1;
545 "=format_constraint():"
546 <<
"id=" <<
id <<
" offset=" << offset[
id]
547 <<
" step=" << step[
id]
548 <<
" count=" << count[
id]
561 bool HDFEOS2ArraySwathGeoMultiDimMapField::Field2DSubset (T * outlatlon,
570 T (*templatlonptr)[majordim][minordim] = (T *[][]) latlon;
577 int dim0count = count[0];
578 int dim1count = count[1];
580 int dim0index[dim0count];
581 int dim1index[dim1count];
583 for (i = 0; i < count[0]; i++)
584 dim0index[i] = offset[0] + i * step[0];
587 for (j = 0; j < count[1]; j++)
588 dim1index[j] = offset[1] + j * step[1];
593 for (i = 0; i < count[0]; i++) {
594 for (j = 0; j < count[1]; j++) {
596 outlatlon[k] = (*templatlonptr)[dim0index[i]][dim1index[j]];
598 outlatlon[k] = *(latlon + (dim0index[i] * minordim) + dim1index[j]);
607 template <
class T >
int
608 HDFEOS2ArraySwathGeoMultiDimMapField::
609 GetFieldValue (int32 swathid,
const string & geofieldname,
610 const vector <int>&dimsizes,
const vector<int>&offset,
const vector<int>&inc,
611 vector < T > &vals, vector<int32>&newdims)
623 ret = SWfieldinfo (swathid,
const_cast < char *
>(geofieldname.c_str ()),
624 &sw_rank, dims, &type, dimlist);
632 for (
int i = 0; i <sw_rank; i++)
637 ret = SWreadfield (swathid,
const_cast < char *
>(geofieldname.c_str ()),
638 NULL, NULL, NULL, (
void *) &vals[0]);
642 vector < string > dimname;
645 for (
int i = 0; i < sw_rank; i++) {
648 cerr<<
"dimsizes["<<i<<
"]: " <<dimsizes[i]<<endl;
649 cerr<<
"offset["<<i<<
"]: " <<offset[i]<<endl;
650 cerr<<
"inc["<<i<<
"]: " <<inc[i]<<endl;
653 r = _expand_dimmap_field (&vals, sw_rank, dims, i, dimsizes[i], offset[i], inc[i]);
659 for (
int i = 0; i < sw_rank; i++) {
663 newdims[i] = dims[i];
670 template <
class T >
int
671 HDFEOS2ArraySwathGeoMultiDimMapField::_expand_dimmap_field (vector < T >
672 *pvals, int32 sw_rank,
679 vector < T > orig = *pvals;
680 vector < int32 > pos;
681 vector < int32 > dims;
682 vector < int32 > newdims;
683 pos.resize (sw_rank);
684 dims.resize (sw_rank);
686 for (
int i = 0; i < sw_rank; i++) {
691 newdims[dimindex] = ddimsize;
692 dimsa[dimindex] = ddimsize;
696 for (
int i = 0; i < sw_rank; i++) {
697 newsize *= newdims[i];
700 pvals->resize (newsize);
704 if (pos[0] == dims[0]) {
708 else if (pos[dimindex] == 0) {
711 for (
int i = 0; i < dims[dimindex]; i++) {
713 v.push_back (orig[INDEX_nD_TO_1D (dims, pos)]);
718 for (int32 j = 0; j < ddimsize; j++) {
719 int32 i = (j - offset) / inc;
722 if (i * inc + offset == j)
728 int32 i2 = (i<=0)?1:0;
738 if ((
unsigned int) i + 1 >= v.size ()) {
746 j1 = i1 * inc + offset;
747 j2 = i2 * inc + offset;
748 f = (((j - j1) * v[i2] + (j2 - j) * v[i1]) / (j2 - j1));
752 (*pvals)[INDEX_nD_TO_1D (newdims, pos)] = f;
758 for (
int i = sw_rank - 1; i > 0; i--) {
759 if (pos[i] == dims[i]) {
static void Split(const char *s, int len, char sep, std::vector< std::string > &names)
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)