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());
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;
82 dm_dimsizes.resize(rank);
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 ());
116 swathid = attachfunc (sfid,
const_cast < char *
>(datasetname.c_str ()));
121 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be attached.";
122 throw InternalErr (__FILE__, __LINE__, eherr.str ());
128 tmp_dims.resize(rank);
129 char tmp_dimlist[1024];
132 r = fieldinfofunc (swathid,
const_cast < char *
>(fieldname.c_str ()),
133 &tmp_rank, tmp_dims.data(), &type, tmp_dimlist);
135 detachfunc (swathid);
138 eherr <<
"Field " << fieldname.c_str () <<
" information cannot be obtained.";
139 throw InternalErr (__FILE__, __LINE__, eherr.str ());
143 newdims.resize(tmp_rank);
149 if (
true == no_interpolation) {
152 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
154 detachfunc (swathid);
157 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
158 throw InternalErr (__FILE__, __LINE__, eherr.str ());
160#ifndef SIGNED_BYTE_TO_INT32
161 set_value ((dods_byte *) val.data(), nelms);
164 newval.resize(nelms);
166 for (
int counter = 0; counter < nelms; counter++)
167 newval[counter] = (int32) (val[counter]);
168 set_value ((dods_int32 *) newval.data(), nelms);
174 vector <int8> total_val8;
175 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val8, newdims);
178 detachfunc (swathid);
181 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
182 throw InternalErr (__FILE__, __LINE__, eherr.str ());
187 Field2DSubset (val8.data(), newdims[0], newdims[1],total_val8.data(),
188 offset32.data(), count32.data(), step32.data());
190#ifndef SIGNED_BYTE_TO_INT32
191 set_value ((dods_byte *) val8.data(), nelms);
194 newval.resize(nelms);
196 for (
int counter = 0; counter < nelms; counter++)
197 newval[counter] = (int32) (val8[counter]);
198 set_value ((dods_int32 *) newval.data(), nelms);
206 if (no_interpolation ==
false) {
207 vector <uint8> total_val_uint8;
208 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint8, newdims);
211 detachfunc (swathid);
214 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
215 throw InternalErr (__FILE__, __LINE__, eherr.str ());
219 val_uint8.resize(nelms);
220 Field2DSubset (val_uint8.data(), newdims[0], newdims[1],total_val_uint8.data(),
221 offset32.data(), count32.data(), step32.data());
223 set_value ((dods_byte *) val_uint8.data(), nelms);
229 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
231 detachfunc (swathid);
234 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
235 throw InternalErr (__FILE__, __LINE__, eherr.str ());
238 set_value ((dods_byte *) val.data(), nelms);
245 if (no_interpolation ==
false) {
246 vector <int16> total_val_int16;
247 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int16, newdims);
250 detachfunc (swathid);
253 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
254 throw InternalErr (__FILE__, __LINE__, eherr.str ());
258 val_int16.resize(nelms);
259 Field2DSubset (val_int16.data(), newdims[0], newdims[1],total_val_int16.data(),
260 offset32.data(), count32.data(), step32.data());
262 set_value ((dods_int16 *) val_int16.data(), nelms);
268 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
270 detachfunc (swathid);
273 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
274 throw InternalErr (__FILE__, __LINE__, eherr.str ());
276 set_value ((dods_int16 *) val.data(), nelms);
283 if (no_interpolation ==
false) {
284 vector <uint16> total_val_uint16;
285 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint16, newdims);
288 detachfunc (swathid);
291 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
292 throw InternalErr (__FILE__, __LINE__, eherr.str ());
296 val_uint16.resize(nelms);
297 Field2DSubset (val_uint16.data(), newdims[0], newdims[1],total_val_uint16.data(),
298 offset32.data(), count32.data(), step32.data());
300 set_value ((dods_uint16 *) val_uint16.data(), nelms);
306 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
308 detachfunc (swathid);
311 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
312 throw InternalErr (__FILE__, __LINE__, eherr.str ());
315 set_value ((dods_uint16 *) val.data(), nelms);
322 if (no_interpolation ==
false) {
323 vector <int32> total_val_int32;
324 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_int32, newdims);
327 detachfunc (swathid);
330 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
331 throw InternalErr (__FILE__, __LINE__, eherr.str ());
335 val_int32.resize(nelms);
336 Field2DSubset (val_int32.data(), newdims[0], newdims[1],total_val_int32.data(),
337 offset32.data(), count32.data(), step32.data());
339 set_value ((dods_int32 *) val_int32.data(), nelms);
344 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
346 detachfunc (swathid);
349 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
350 throw InternalErr (__FILE__, __LINE__, eherr.str ());
353 set_value ((dods_int32 *) val.data(), nelms);
360 if (no_interpolation ==
false) {
361 vector <uint32> total_val_uint32;
362 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_uint32, newdims);
365 detachfunc (swathid);
368 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
369 throw InternalErr (__FILE__, __LINE__, eherr.str ());
373 val_uint32.resize(nelms);
374 Field2DSubset (val_uint32.data(), newdims[0], newdims[1],total_val_uint32.data(),
375 offset32.data(), count32.data(), step32.data());
377 set_value ((dods_uint32 *) val_uint32.data(), nelms);
382 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
384 detachfunc (swathid);
387 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
388 throw InternalErr (__FILE__, __LINE__, eherr.str ());
391 set_value ((dods_uint32 *) val.data(), nelms);
397 if (no_interpolation ==
false) {
398 vector <float32> total_val_f32;
399 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f32, newdims);
402 detachfunc (swathid);
405 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
406 throw InternalErr (__FILE__, __LINE__, eherr.str ());
410 val_f32.resize(nelms);
411 Field2DSubset (val_f32.data(), newdims[0], newdims[1],total_val_f32.data(),
412 offset32.data(), count32.data(), step32.data());
414 set_value ((dods_float32 *) val_f32.data(), nelms);
419 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
421 detachfunc (swathid);
424 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
425 throw InternalErr (__FILE__, __LINE__, eherr.str ());
427 set_value ((dods_float32 *) val.data(), nelms);
433 if (no_interpolation ==
false) {
434 vector <float64> total_val_f64;
435 r = GetFieldValue (swathid, fieldname, dm_dimsizes,dm_offsets,dm_incs, total_val_f64, newdims);
438 detachfunc (swathid);
441 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
442 throw InternalErr (__FILE__, __LINE__, eherr.str ());
446 val_f64.resize(nelms);
447 Field2DSubset (val_f64.data(), newdims[0], newdims[1],total_val_f64.data(),
448 offset32.data(), count32.data(), step32.data());
450 set_value ((dods_float64 *) val_f64.data(), nelms);
455 r = readfieldfunc (swathid,
const_cast < char *
>(fieldname.c_str ()), offset32.data(), step32.data(), count32.data(), val.data());
457 detachfunc (swathid);
460 eherr <<
"field " << fieldname.c_str () <<
"cannot be read.";
461 throw InternalErr (__FILE__, __LINE__, eherr.str ());
464 set_value ((dods_float64 *) val.data(), nelms);
469 detachfunc (swathid);
471 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
474 r = detachfunc (swathid);
478 eherr <<
"Swath " << datasetname.c_str () <<
" cannot be detached.";
479 throw InternalErr (__FILE__, __LINE__, eherr.str ());
490HDFEOS2ArraySwathGeoMultiDimMapField::format_constraint (
int *offset,
int *step,
int *count)
495 Dim_iter p = dim_begin ();
496 while (p != dim_end ()) {
498 int start = dimension_start (p,
true);
499 int stride = dimension_stride (p,
true);
500 int stop = dimension_stop (p,
true);
505 oss <<
"Array/Grid hyperslab start point "<< start <<
506 " is greater than stop point " << stop <<
".";
507 throw Error(malformed_expr, oss.str());
512 count[id] = ((stop - start) / stride) + 1;
516 "=format_constraint():"
517 <<
"id=" <<
id <<
" offset=" << offset[
id]
518 <<
" step=" << step[
id]
519 <<
" count=" << count[
id]
532bool HDFEOS2ArraySwathGeoMultiDimMapField::Field2DSubset (T * outlatlon,
536 const int32 * offset,
538 const int32 * step)
const
546 int dim0count = count[0];
547 int dim1count = count[1];
549 int dim0index[dim0count];
550 int dim1index[dim1count];
552 for (i = 0; i < count[0]; i++)
553 dim0index[i] = offset[0] + i * step[0];
556 for (j = 0; j < count[1]; j++)
557 dim1index[j] = offset[1] + j * step[1];
562 for (i = 0; i < count[0]; i++) {
563 for (j = 0; j < count[1]; j++) {
564 outlatlon[k] = *(latlon + (dim0index[i] * minordim) + dim1index[j]);
573template <
class T >
int
574HDFEOS2ArraySwathGeoMultiDimMapField::
575GetFieldValue (int32 swathid,
const string & geofieldname,
589 ret = SWfieldinfo (swathid,
const_cast < char *
>(geofieldname.c_str ()),
590 &sw_rank, dims, &type, dimlist);
598 for (
int i = 0; i <sw_rank; i++)
603 ret = SWreadfield (swathid,
const_cast < char *
>(geofieldname.c_str ()),
604 NULL, NULL, NULL, (
void *) vals.data());
608 vector < string > dimname;
611 for (
int i = 0; i < sw_rank; i++) {
614 r = _expand_dimmap_field (&vals, sw_rank, dims, i, dimsizes[i], offset[i], inc[i]);
620 for (
int i = 0; i < sw_rank; i++) {
624 newdims[i] = dims[i];
631template <
class T >
int
632HDFEOS2ArraySwathGeoMultiDimMapField::_expand_dimmap_field (vector < T >
633 *pvals, int32 sw_rank,
640 vector < T > orig = *pvals;
641 vector < int32 > pos;
642 vector < int32 > dims;
643 vector < int32 > newdims;
644 pos.resize (sw_rank);
645 dims.resize (sw_rank);
647 for (
int i = 0; i < sw_rank; i++) {
652 newdims[dimindex] = ddimsize;
653 dimsa[dimindex] = ddimsize;
657 for (
int i = 0; i < sw_rank; i++) {
658 newsize *= newdims[i];
661 pvals->resize (newsize);
665 if (pos[0] == dims[0]) {
669 else if (pos[dimindex] == 0) {
672 for (
int i = 0; i < dims[dimindex]; i++) {
674 v.push_back (orig[INDEX_nD_TO_1D (dims, pos)]);
679 for (int32 j = 0; j < ddimsize; j++) {
680 int32 i = (j - offset) / inc;
683 if (i * inc + offset == j)
689 int32 i2 = (i<=0)?1:0;
693 if ((
unsigned int) i + 1 >= v.size ()) {
701 j1 = i1 * inc + offset;
702 j2 = i2 * inc + offset;
703 f = (((j - j1) * v[i2] + (j2 - j) * v[i1]) / (j2 - j1));
707 (*pvals)[INDEX_nD_TO_1D (newdims, pos)] = f;
713 for (
int i = sw_rank - 1; i > 0; i--) {
714 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)