12#include "HDFEOS2ArraySwathGeoMultiDimMapField.h"
16#include <libdap/debug.h>
17#include <libdap/InternalErr.h>
19#include "HDF4RequestHandler.h"
23#define SIGNED_BYTE_TO_INT32 1
26HDFEOS2ArraySwathGeoMultiDimMapField::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.");
37 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
48 int nelms = format_constraint (offset.data(), step.data(), count.data());
51 vector<int32>offset32;
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;
81 vector<int>dm_dimsizes;
82 dm_dimsizes.resize(rank);
83 vector<int>dm_offsets;
84 dm_offsets.resize(rank);
87 bool no_interpolation =
true;
89 if(dim0inc != 0 || dim1inc !=0 || dim0offset != 0 || dim1offset != 0) {
90 dm_dimsizes[0] = dim0size;
91 dm_dimsizes[1] = dim1size;
92 dm_offsets[0] = dim0offset;
93 dm_offsets[1] = dim1offset;
96 no_interpolation =
false;
105 if(
false == check_pass_fileid_key) {
106 sfid = openfunc (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
109 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
110 throw InternalErr (__FILE__, __LINE__, eherr.str ());
117cerr<<
"swath name is "<<datasetname <<endl;
118cerr<<
"swath rank is "<<rank <<endl;
119cerr<<
"swath field name is "<<fieldname <<endl;
120cerr<<
"swath field new name is "<<name() <<endl;
122cerr<<
"datadim0size "<<dim0size <<endl;
123cerr<<
"datadim1size "<<dim1size <<endl;
124cerr<<
"datadim0offset "<<dim0offset <<endl;
125cerr<<
"datadim1offset "<<dim1offset <<endl;
126cerr<<
"datadim0inc "<<dim0inc <<endl;
127cerr<<
"datadim1inc "<<dim1inc <<endl;
130 swathid = attachfunc (sfid,
const_cast < char *
>(datasetname.c_str ()));
135 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be attached.";
136 throw InternalErr (__FILE__, __LINE__, eherr.str ());
141 vector<int32>tmp_dims;
142 tmp_dims.resize(rank);
143 char tmp_dimlist[1024];
146 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
147 &tmp_rank, tmp_dims.data(), &type, tmp_dimlist);
149 detachfunc (swathid);
152 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
153 throw InternalErr (__FILE__, __LINE__, eherr.str ());
156 vector<int32> newdims;
157 newdims.resize(tmp_rank);
163 if(
true == no_interpolation) {
166 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
168 detachfunc (swathid);
171 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
172 throw InternalErr (__FILE__, __LINE__, eherr.str ());
174#ifndef SIGNED_BYTE_TO_INT32
175 set_value ((dods_byte *) val.data(), nelms);
178 newval.resize(nelms);
180 for (
int counter = 0; counter < nelms; counter++)
181 newval[counter] = (int32) (val[counter]);
182 set_value ((dods_int32 *) newval.data(), nelms);
188 vector <int8> total_val8;
189 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val8, newdims);
192 detachfunc (swathid);
195 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
196 throw InternalErr (__FILE__, __LINE__, eherr.str ());
201 Field2DSubset (val8.data(), newdims[0], newdims[1],total_val8.data(),
202 offset32.data(), count32.data(), step32.data());
204#ifndef SIGNED_BYTE_TO_INT32
205 set_value ((dods_byte *) val8.data(), nelms);
208 newval.resize(nelms);
210 for (
int counter = 0; counter < nelms; counter++)
211 newval[counter] = (int32) (val8[counter]);
212 set_value ((dods_int32 *) newval.data(), nelms);
220 if(no_interpolation ==
false) {
221 vector <uint8> total_val_uint8;
222 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint8, newdims);
225 detachfunc (swathid);
228 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
229 throw InternalErr (__FILE__, __LINE__, eherr.str ());
232 vector<uint8>val_uint8;
233 val_uint8.resize(nelms);
234 Field2DSubset (val_uint8.data(), newdims[0], newdims[1],total_val_uint8.data(),
235 offset32.data(), count32.data(), step32.data());
237 set_value ((dods_byte *) val_uint8.data(), nelms);
243 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
245 detachfunc (swathid);
248 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
249 throw InternalErr (__FILE__, __LINE__, eherr.str ());
252 set_value ((dods_byte *) val.data(), nelms);
259 if(no_interpolation ==
false) {
260 vector <int16> total_val_int16;
261 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int16, newdims);
264 detachfunc (swathid);
267 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
268 throw InternalErr (__FILE__, __LINE__, eherr.str ());
271 vector<int16>val_int16;
272 val_int16.resize(nelms);
273 Field2DSubset (val_int16.data(), newdims[0], newdims[1],total_val_int16.data(),
274 offset32.data(), count32.data(), step32.data());
276 set_value ((dods_int16 *) val_int16.data(), nelms);
282 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
284 detachfunc (swathid);
287 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
288 throw InternalErr (__FILE__, __LINE__, eherr.str ());
290 set_value ((dods_int16 *) val.data(), nelms);
297 if(no_interpolation ==
false) {
298 vector <uint16> total_val_uint16;
299 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint16, newdims);
302 detachfunc (swathid);
305 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
306 throw InternalErr (__FILE__, __LINE__, eherr.str ());
309 vector<uint16>val_uint16;
310 val_uint16.resize(nelms);
311 Field2DSubset (val_uint16.data(), newdims[0], newdims[1],total_val_uint16.data(),
312 offset32.data(), count32.data(), step32.data());
314 set_value ((dods_uint16 *) val_uint16.data(), nelms);
320 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
322 detachfunc (swathid);
325 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
326 throw InternalErr (__FILE__, __LINE__, eherr.str ());
329 set_value ((dods_uint16 *) val.data(), nelms);
336 if(no_interpolation ==
false) {
337 vector <int32> total_val_int32;
338 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int32, newdims);
341 detachfunc (swathid);
344 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
345 throw InternalErr (__FILE__, __LINE__, eherr.str ());
348 vector<int32>val_int32;
349 val_int32.resize(nelms);
350 Field2DSubset (val_int32.data(), newdims[0], newdims[1],total_val_int32.data(),
351 offset32.data(), count32.data(), step32.data());
353 set_value ((dods_int32 *) val_int32.data(), nelms);
358 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
360 detachfunc (swathid);
363 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
364 throw InternalErr (__FILE__, __LINE__, eherr.str ());
367 set_value ((dods_int32 *) val.data(), nelms);
374 if(no_interpolation ==
false) {
375 vector <uint32> total_val_uint32;
376 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint32, newdims);
379 detachfunc (swathid);
382 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
383 throw InternalErr (__FILE__, __LINE__, eherr.str ());
386 vector<uint32>val_uint32;
387 val_uint32.resize(nelms);
388 Field2DSubset (val_uint32.data(), newdims[0], newdims[1],total_val_uint32.data(),
389 offset32.data(), count32.data(), step32.data());
391 set_value ((dods_uint32 *) val_uint32.data(), nelms);
396 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
398 detachfunc (swathid);
401 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
402 throw InternalErr (__FILE__, __LINE__, eherr.str ());
405 set_value ((dods_uint32 *) val.data(), nelms);
411 if(no_interpolation ==
false) {
412 vector <float32> total_val_f32;
413 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f32, newdims);
416 detachfunc (swathid);
419 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
420 throw InternalErr (__FILE__, __LINE__, eherr.str ());
423 vector<float32>val_f32;
424 val_f32.resize(nelms);
425 Field2DSubset (val_f32.data(), newdims[0], newdims[1],total_val_f32.data(),
426 offset32.data(), count32.data(), step32.data());
428 set_value ((dods_float32 *) val_f32.data(), nelms);
433 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
435 detachfunc (swathid);
438 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
439 throw InternalErr (__FILE__, __LINE__, eherr.str ());
441 set_value ((dods_float32 *) val.data(), nelms);
447 if(no_interpolation ==
false) {
448 vector <float64> total_val_f64;
449 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f64, newdims);
452 detachfunc (swathid);
455 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
456 throw InternalErr (__FILE__, __LINE__, eherr.str ());
459 vector<float64>val_f64;
460 val_f64.resize(nelms);
461 Field2DSubset (val_f64.data(), newdims[0], newdims[1],total_val_f64.data(),
462 offset32.data(), count32.data(), step32.data());
464 set_value ((dods_float64 *) val_f64.data(), nelms);
469 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
471 detachfunc (swathid);
474 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
475 throw InternalErr (__FILE__, __LINE__, eherr.str ());
478 set_value ((dods_float64 *) val.data(), nelms);
483 detachfunc (swathid);
485 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
488 r = detachfunc (swathid);
492 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be detached.";
493 throw InternalErr (__FILE__, __LINE__, eherr.str ());
499 r = closefunc (sfid);
502 eherr <<
"Swath " << filename.c_str () <<
" cannot be closed.";
503 throw InternalErr (__FILE__, __LINE__, eherr.str ());
513HDFEOS2ArraySwathGeoMultiDimMapField::format_constraint (
int *offset,
int *step,
int *count)
518 Dim_iter p = dim_begin ();
519 while (p != dim_end ()) {
521 int start = dimension_start (p,
true);
522 int stride = dimension_stride (p,
true);
523 int stop = dimension_stop (p,
true);
528 oss <<
"Array/Grid hyperslab start point "<< start <<
529 " is greater than stop point " << stop <<
".";
530 throw Error(malformed_expr, oss.str());
535 count[id] = ((stop - start) / stride) + 1;
539 "=format_constraint():"
540 <<
"id=" <<
id <<
" offset=" << offset[
id]
541 <<
" step=" << step[
id]
542 <<
" count=" << count[
id]
555bool HDFEOS2ArraySwathGeoMultiDimMapField::Field2DSubset (T * outlatlon,
559 const int32 * offset,
561 const int32 * step)
const
564 T (*templatlonptr)[majordim][minordim] = (T *[][]) latlon;
571 int dim0count = count[0];
572 int dim1count = count[1];
574 int dim0index[dim0count];
575 int dim1index[dim1count];
577 for (i = 0; i < count[0]; i++)
578 dim0index[i] = offset[0] + i * step[0];
581 for (j = 0; j < count[1]; j++)
582 dim1index[j] = offset[1] + j * step[1];
587 for (i = 0; i < count[0]; i++) {
588 for (j = 0; j < count[1]; j++) {
590 outlatlon[k] = (*templatlonptr)[dim0index[i]][dim1index[j]];
592 outlatlon[k] = *(latlon + (dim0index[i] * minordim) + dim1index[j]);
601template <
class T >
int
602HDFEOS2ArraySwathGeoMultiDimMapField::
603GetFieldValue (int32 swathid,
const string & geofieldname,
604 const vector <int>&dimsizes,
const vector<int>&offset,
const vector<int>&inc,
605 vector < T > &vals, vector<int32>&newdims)
617 ret = SWfieldinfo (swathid,
const_cast < char *
>(geofieldname.c_str ()),
618 &sw_rank, dims, &type, dimlist);
626 for (
int i = 0; i <sw_rank; i++)
631 ret = SWreadfield (swathid,
const_cast < char *
>(geofieldname.c_str ()),
632 NULL, NULL, NULL, (
void *) vals.data());
636 vector < string > dimname;
639 for (
int i = 0; i < sw_rank; i++) {
642cerr<<
"dimsizes["<<i<<
"]: " <<dimsizes[i]<<endl;
643cerr<<
"offset["<<i<<
"]: " <<offset[i]<<endl;
644cerr<<
"inc["<<i<<
"]: " <<inc[i]<<endl;
647 r = _expand_dimmap_field (&vals, sw_rank, dims, i, dimsizes[i], offset[i], inc[i]);
653 for (
int i = 0; i < sw_rank; i++) {
657 newdims[i] = dims[i];
664template <
class T >
int
665HDFEOS2ArraySwathGeoMultiDimMapField::_expand_dimmap_field (vector < T >
666 *pvals, int32 sw_rank,
673 vector < T > orig = *pvals;
674 vector < int32 > pos;
675 vector < int32 > dims;
676 vector < int32 > newdims;
677 pos.resize (sw_rank);
678 dims.resize (sw_rank);
680 for (
int i = 0; i < sw_rank; i++) {
685 newdims[dimindex] = ddimsize;
686 dimsa[dimindex] = ddimsize;
690 for (
int i = 0; i < sw_rank; i++) {
691 newsize *= newdims[i];
694 pvals->resize (newsize);
698 if (pos[0] == dims[0]) {
702 else if (pos[dimindex] == 0) {
705 for (
int i = 0; i < dims[dimindex]; i++) {
707 v.push_back (orig[INDEX_nD_TO_1D (dims, pos)]);
712 for (int32 j = 0; j < ddimsize; j++) {
713 int32 i = (j - offset) / inc;
716 if (i * inc + offset == j)
722 int32 i2 = (i<=0)?1:0;
732 if ((
unsigned int) i + 1 >= v.size ()) {
740 j1 = i1 * inc + offset;
741 j2 = i2 * inc + offset;
742 f = (((j - j1) * v[i2] + (j2 - j) * v[i1]) / (j2 - j1));
746 (*pvals)[INDEX_nD_TO_1D (newdims, pos)] = f;
752 for (
int i = sw_rank - 1; i > 0; i--) {
753 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)