11#include "HDFSPArrayGeoField.h"
15#include <libdap/debug.h>
18#include <libdap/InternalErr.h>
21#include "HDF4RequestHandler.h"
25#define SIGNED_BYTE_TO_INT32 1
28#define NUM_PIXEL_NAME "Pixels per Scan Line"
29#define NUM_POINTS_LINE_NAME "Number of Pixel Control Points"
30#define NUM_SCAN_LINE_NAME "Number of Scan Lines"
31#define NUM_LAT_NAME "Number of Lines"
32#define NUM_LON_NAME "Number of Columns"
33#define LAT_STEP_NAME "Latitude Step"
34#define LON_STEP_NAME "Longitude Step"
35#define SWP_LAT_NAME "SW Point Latitude"
36#define SWP_LON_NAME "SW Point Longitude"
39bool HDFSPArrayGeoField::read ()
42 BESDEBUG(
"h4",
"Coming to HDFSPArrayGeoField read "<<endl);
57 nelms = format_constraint (offset.data(), step.data(), count.data());
60 vector<int32>offset32;
61 offset32.resize(rank);
69 for (
int i = 0; i < rank; i++) {
70 offset32[i] = (int32) offset[i];
71 count32[i] = (int32) count[i];
72 step32[i] = (int32) step[i];
82 readtrmml2_v6 (offset32.data(), count32.data(), step32.data(), nelms);
89 readtrmml3a_v6 (offset32.data(), count32.data(), step32.data(), nelms);
95 readtrmml3b_v6 (offset32.data(), count32.data(), step32.data(), nelms);
101 readtrmml3c_v6 (offset32.data(), count32.data(), step32.data(), nelms);
110 readtrmml3_v7 (offset32.data(), step32.data(), nelms);
116 readceravgsyn (offset32.data(), count32.data(), step32.data(), nelms);
123 readceres4ig (offset32.data(), count32.data(), step32.data(), nelms);
130 readcersavgid2 (offset.data(), count.data(), step.data(), nelms);
137 readceres4ig (offset32.data(), count32.data(), step32.data(), nelms);
146 readcersavgid1 (offset.data(), count.data(), step.data(), nelms);
149 else if (rank == 2) {
150 readcersavgid2 (offset.data(), count.data(), step.data(), nelms);
158 readceravgsyn (offset32.data(), count32.data(), step32.data(), nelms);
165 readcerzavg (offset32.data(), count32.data(), step32.data(), nelms);
172 readobpgl2 (offset32.data(), count32.data(), step32.data(), nelms);
179 readobpgl3 (offset.data(), step.data(), nelms);
186 throw InternalErr (__FILE__, __LINE__,
"Unsupported HDF files");
192 throw InternalErr (__FILE__, __LINE__,
"Unsupported HDF files");
207HDFSPArrayGeoField::readtrmml2_v6 (
const int32 * offset32,
const int32 * count32,
208 const int32 * step32,
int nelms)
211 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
215 if(
false == check_pass_fileid_key) {
216 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
219 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
220 throw InternalErr (__FILE__, __LINE__, eherr.str ());
228 vector<int32>geooffset32;
229 geooffset32.resize(rank+1);
231 vector<int32>geocount32;
232 geocount32.resize(rank+1);
234 vector<int32>geostep32;
235 geostep32.resize(rank+1);
237 for (
int i = 0; i < rank; i++) {
238 geooffset32[i] = offset32[i];
239 geocount32[i] = count32[i];
240 geostep32[i] = step32[i];
243 if (fieldtype == 1) {
244 geooffset32[rank] = 0;
245 geocount32[rank] = 1;
249 if (fieldtype == 2) {
250 geooffset32[rank] = 1;
251 geocount32[rank] = 1;
255 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
257 if (sdsindex == -1) {
260 eherr <<
"SDS index " << sdsindex <<
" is not right.";
261 throw InternalErr (__FILE__, __LINE__, eherr.str ());
264 sdsid = SDselect (sdid, sdsindex);
268 eherr <<
"SDselect failed.";
269 throw InternalErr (__FILE__, __LINE__, eherr.str ());
280 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
285 eherr <<
"SDreaddata failed.";
286 throw InternalErr (__FILE__, __LINE__, eherr.str ());
289#ifndef SIGNED_BYTE_TO_INT32
290 set_value ((dods_byte *) val.data(), nelms);
293 newval.resize(nelms);
295 for (
int counter = 0; counter < nelms; counter++)
296 newval[counter] = (int32) (val[counter]);
297 set_value ((dods_int32 *) newval.data(), nelms);
307 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
312 eherr <<
"SDreaddata failed";
313 throw InternalErr (__FILE__, __LINE__, eherr.str ());
316 set_value ((dods_byte *) val.data(), nelms);
324 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
329 eherr <<
"SDreaddata failed";
330 throw InternalErr (__FILE__, __LINE__, eherr.str ());
333 set_value ((dods_int16 *) val.data(), nelms);
341 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
346 eherr <<
"SDreaddata failed";
347 throw InternalErr (__FILE__, __LINE__, eherr.str ());
350 set_value ((dods_uint16 *) val.data(), nelms);
357 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
362 eherr <<
"SDreaddata failed";
363 throw InternalErr (__FILE__, __LINE__, eherr.str ());
366 set_value ((dods_int32 *) val.data(), nelms);
373 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
378 eherr <<
"SDreaddata failed";
379 throw InternalErr (__FILE__, __LINE__, eherr.str ());
381 set_value ((dods_uint32 *) val.data(), nelms);
388 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
393 eherr <<
"SDreaddata failed";
394 throw InternalErr (__FILE__, __LINE__, eherr.str ());
397 set_value ((dods_float32 *) val.data(), nelms);
404 r = SDreaddata (sdsid, geooffset32.data(), geostep32.data(), geocount32.data(), (
void*)(val.data()));
409 eherr <<
"SDreaddata failed";
410 throw InternalErr (__FILE__, __LINE__, eherr.str ());
413 set_value ((dods_float64 *) val.data(), nelms);
419 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
422 r = SDendaccess (sdsid);
426 eherr <<
"SDendaccess failed.";
427 throw InternalErr (__FILE__, __LINE__, eherr.str ());
437HDFSPArrayGeoField::readtrmml3a_v6 (
const int32 * offset32,
const int32 * count32,
438 const int32 * step32,
int nelms)
441 const float slat = 89.5;
442 const float slon = 0.5;
446 if (fieldtype == 1) {
449 float sval = slat - offset32[0];
451 while (icount < (
int) (count32[0])) {
452 val[icount] = sval - step32[0] * icount;
457 if (fieldtype == 2) {
459 float sval = slon + offset32[0];
461 while (icount < (
int) (count32[0])) {
462 val[icount] = sval + step32[0] * icount;
466 set_value ((dods_float32 *) val.data(), nelms);
473HDFSPArrayGeoField::readtrmml3b_v6 (
const int32 * offset32,
const int32 * count32,
474 const int32 * step32,
int nelms)
477 const float slat = -49.875;
478 const float slon = -179.875;
482 if (fieldtype == 1) {
485 float sval = slat + 0.25 * (int) (offset32[0]);
487 while (icount < (
int) (count32[0])) {
488 val[icount] = sval + 0.25 * (int) (step32[0]) * icount;
493 if (fieldtype == 2) {
495 float sval = slon + 0.25 * (int) (offset32[0]);
497 while (icount < (
int) (count32[0])) {
498 val[icount] = sval + 0.25 * (int) (step32[0]) * icount;
502 set_value ((dods_float32 *) val.data(), nelms);
508HDFSPArrayGeoField::readtrmml3c_v6 (
const int32 * offset32,
const int32 * count32,
509 const int32 * step32,
int nelms)
512 const float slat = -36.75;
513 const float slon = -179.75;
517 if (fieldtype == 1) {
520 float sval = slat + 0.5 * (int) (offset32[0]);
522 while (icount < (
int) (count32[0])) {
523 val[icount] = sval + 0.5 * (int) (step32[0]) * icount;
528 if (fieldtype == 2) {
530 float sval = slon + 0.5 * (int) (offset32[0]);
532 while (icount < (
int) (count32[0])) {
533 val[icount] = sval + 0.5 * (int) (step32[0]) * icount;
537 set_value ((dods_float32 *) val.data(), nelms);
542HDFSPArrayGeoField::readtrmml3_v7 (
const int32 * offset32,
543 const int32 * step32,
int nelms)
546 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
550 if(
false == check_pass_fileid_key) {
551 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
554 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
555 throw InternalErr (__FILE__, __LINE__, eherr.str ());
562 string gridinfo_name =
"GridHeader";
568 throw InternalErr (__FILE__,__LINE__,
569 "The maximum number of grids to be supported in the current implementation is 9.");
573 ostringstream fieldref_str;
574 fieldref_str << fieldref;
575 gridinfo_name = gridinfo_name + fieldref_str.str();
579 int32 attr_index = 0;
580 attr_index = SDfindattr (sdid, gridinfo_name.c_str());
581 if (attr_index == FAIL) {
583 string err_mesg =
"SDfindattr failed,should find attribute "+gridinfo_name+
" .";
584 throw InternalErr (__FILE__, __LINE__, err_mesg);
587 int32 attr_dtype = 0;
590 char attr_name[H4_MAX_NC_NAME];
592 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
593 if (status == FAIL) {
595 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
598 vector<char> attr_value;
599 attr_value.resize(n_values * DFKNTsize(attr_dtype));
601 status = SDreadattr (sdid, attr_index, attr_value.data());
602 if (status == FAIL) {
604 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
607 float lat_start = 0.;
608 float lon_start = 0.;
615 HDFCFUtil::parser_trmm_v7_gridheader(attr_value,latsize,lonsize,
616 lat_start,lon_start,lat_res,lon_res,
false);
618 if(0 == latsize || 0 == lonsize) {
620 throw InternalErr (__FILE__, __LINE__,
"Either latitude or longitude size is 0. ");
628 for (
int i = 0; i < nelms; ++i)
629 val[i] = lat_start+offset32[0]*lat_res+lat_res/2 + i*lat_res*step32[0];
631 else if(fieldtype == 2) {
632 for (
int i = 0; i < nelms; ++i)
633 val[i] = lon_start+offset32[0]*lon_res+lon_res/2 + i*lon_res*step32[0];
636 set_value ((dods_float32 *) val.data(), nelms);
652HDFSPArrayGeoField::readobpgl2 (int32 * offset32, int32 * count32,
653 int32 * step32,
int nelms)
656 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
660 if(
false == check_pass_fileid_key) {
661 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
664 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
665 throw InternalErr (__FILE__, __LINE__, eherr.str ());
675 int32 attr_index = 0;
676 int32 attr_dtype = 0;
678 int32 num_pixel_data = 0;
679 int32 num_point_data = 0;
680 int32 num_scan_data = 0;
682 attr_index = SDfindattr (sdid, NUM_PIXEL_NAME);
683 if (attr_index == FAIL) {
685 string attr_name(NUM_PIXEL_NAME);
686 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
687 throw InternalErr (__FILE__, __LINE__, err_mesg);
690 char attr_name[H4_MAX_NC_NAME];
692 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
693 if (status == FAIL) {
695 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
700 throw InternalErr (__FILE__, __LINE__,
701 "Only one value of number of scan line ");
704 status = SDreadattr (sdid, attr_index, &num_pixel_data);
705 if (status == FAIL) {
707 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
710 attr_index = SDfindattr (sdid, NUM_POINTS_LINE_NAME);
711 if (attr_index == FAIL) {
713 string attr_name(NUM_POINTS_LINE_NAME);
714 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
715 throw InternalErr (__FILE__, __LINE__, err_mesg);
720 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
721 if (status == FAIL) {
723 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
728 throw InternalErr (__FILE__, __LINE__,
729 "Only one value of number of point ");
732 status = SDreadattr (sdid, attr_index, &num_point_data);
733 if (status == FAIL) {
735 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
738 attr_index = SDfindattr (sdid, NUM_SCAN_LINE_NAME);
739 if (attr_index == FAIL) {
741 string attr_name(NUM_SCAN_LINE_NAME);
742 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
743 throw InternalErr (__FILE__, __LINE__, err_mesg);
748 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
749 if (status == FAIL) {
751 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
756 throw InternalErr (__FILE__, __LINE__,
"Only one value of number of point ");
759 status = SDreadattr (sdid, attr_index, &num_scan_data);
760 if (status == FAIL) {
762 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
766 if ( 0 == num_scan_data || 0 == num_point_data || 0 == num_pixel_data) {
768 throw InternalErr (__FILE__, __LINE__,
"num_scan or num_point or num_pixel should not be zero. ");
771 if ( 1 == num_point_data && num_pixel_data != 1) {
773 throw InternalErr (__FILE__, __LINE__,
774 "num_point is 1 and num_pixel is not 1, interpolation cannot be done ");
777 bool compmapflag =
false;
778 if (num_pixel_data == num_point_data)
781 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
782 if (sdsindex == -1) {
785 eherr <<
"SDS index " << sdsindex <<
" is not right.";
786 throw InternalErr (__FILE__, __LINE__, eherr.str ());
789 sdsid = SDselect (sdid, sdsindex);
793 eherr <<
"SDselect failed.";
794 throw InternalErr (__FILE__, __LINE__, eherr.str ());
811 throw InternalErr (__FILE__, __LINE__,
"datatype is not float, unsupported.");
817 r = SDreaddata (sdsid, offset32, step32, count32, val.data());
822 eherr <<
"SDreaddata failed";
823 throw InternalErr (__FILE__, __LINE__, eherr.str ());
828 int total_elm = num_scan_data * num_point_data;
829 vector<float32>orival;
830 orival.resize(total_elm);
836 all_edges[0] = num_scan_data;
837 all_edges[1] = num_point_data;
839 r = SDreaddata (sdsid, all_start,
nullptr, all_edges,
845 eherr <<
"SDreaddata failed";
846 throw InternalErr (__FILE__, __LINE__, eherr.str ());
848 int interpolate_elm = num_scan_data *num_pixel_data;
850 vector<float32> interp_val;
851 interp_val.resize(interpolate_elm);
857 if (num_pixel_data % num_point_data == 0)
858 tempseg = num_pixel_data / num_point_data;
860 tempseg = num_pixel_data / num_point_data + 1;
863 (num_pixel_data%num_point_data)?(num_pixel_data-1-(tempseg*(num_point_data-2))):tempseg;
865 if ( 0 == last_tempseg || 0 == tempseg) {
868 throw InternalErr(__FILE__,__LINE__,
"Segments cannot be zero");
871 int interp_val_index = 0;
873 for (
int i = 0; i <num_scan_data; i++) {
876 for(
int j =0; j <num_point_data -2; j ++) {
877 tempdiff = orival[i*num_point_data+j+1] - orival[i*num_point_data+j];
878 for (
int k = 0; k <tempseg; k++) {
879 interp_val[interp_val_index] = orival[i*num_point_data+j] +
886 tempdiff = orival[i*num_point_data+num_point_data-1]
887 -orival[i*num_point_data+num_point_data-2];
888 for (
int k = 0; k <last_tempseg; k++) {
889 interp_val[interp_val_index] = orival[i*num_point_data+num_point_data-2] +
890 tempdiff/last_tempseg *k;
894 interp_val[interp_val_index] = orival[i*num_point_data+num_point_data-1];
899 LatLon2DSubset(val.data(),num_pixel_data,interp_val.data(),
900 offset32,count32,step32);
911 int32 realcount2 = oricount32[1] - 1;
913 for (i = 0; i < (int) count32[0]; i++) {
914 for (j = 0; j < (int) realcount2 - 1; j++) {
916 orival[i * (int) oricount32[1] + j + 1] -
917 orival[i * (
int) oricount32[1] + j];
918 for (k = 0; k < tempnewseg; k++) {
919 val[i * (int) count32[1] + j * tempnewseg + k] =
920 orival[i * (
int) oricount32[1] + j] +
921 tempdiff / tempnewseg * k;
925 orival[i * (int) oricount32[1] + j + 1] -
926 orival[i * (
int) oricount32[1] + j];
932 tempnewseg * (
int) (realcount2 - 1));
933 for (k2 = 0; k2 <= lastseg; k2++)
934 val[i * (
int) count32[1] + j * tempnewseg + k2] =
935 orival[i * (int) oricount32[1] + j] +
936 tempdiff / lastseg * k2;
939 delete[](float32 *) orival;
943 set_value ((dods_float32 *) val.data(), nelms);
949 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
952 r = SDendaccess (sdsid);
956 eherr <<
"SDendaccess failed.";
957 throw InternalErr (__FILE__, __LINE__, eherr.str ());
967HDFSPArrayGeoField::readobpgl3 (
const int *offset,
const int *step,
const int nelms)
970 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
974 if(
false == check_pass_fileid_key) {
975 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
978 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
979 throw InternalErr (__FILE__, __LINE__, eherr.str ());
988 int32 attr_index = 0;
989 int32 attr_dtype = 0;
991 int32 num_lat_data = 0;
992 int32 num_lon_data = 0;
993 float32 lat_step = 0.;
994 float32 lon_step = 0.;
995 float32 swp_lat = 0.;
996 float32 swp_lon = 0.;
999 attr_index = SDfindattr (sdid, NUM_LAT_NAME);
1000 if (attr_index == FAIL) {
1002 string attr_name(NUM_LAT_NAME);
1003 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name+
" .";
1004 throw InternalErr (__FILE__, __LINE__, err_mesg);
1007 char attr_name[H4_MAX_NC_NAME];
1009 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1010 if (status == FAIL) {
1012 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1015 if (n_values != 1) {
1017 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1020 status = SDreadattr (sdid, attr_index, &num_lat_data);
1021 if (status == FAIL) {
1023 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1027 attr_index = SDfindattr (sdid, NUM_LON_NAME);
1028 if (attr_index == FAIL) {
1030 string attr_name2(NUM_LON_NAME);
1031 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name2+
" .";
1032 throw InternalErr (__FILE__, __LINE__, err_mesg);
1036 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1037 if (status == FAIL) {
1039 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1042 if (n_values != 1) {
1044 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1047 status = SDreadattr (sdid, attr_index, &num_lon_data);
1048 if (status == FAIL) {
1050 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1054 attr_index = SDfindattr (sdid, LAT_STEP_NAME);
1055 if (attr_index == FAIL) {
1057 string attr_name2(LAT_STEP_NAME);
1058 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name2+
" .";
1059 throw InternalErr (__FILE__, __LINE__, err_mesg);
1063 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1064 if (status == FAIL) {
1066 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1069 if (n_values != 1) {
1071 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1074 status = SDreadattr (sdid, attr_index, &lat_step);
1075 if (status == FAIL) {
1077 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1081 attr_index = SDfindattr (sdid, LON_STEP_NAME);
1082 if (attr_index == FAIL) {
1084 string attr_name2(LON_STEP_NAME);
1085 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name2+
" .";
1086 throw InternalErr (__FILE__, __LINE__, err_mesg);
1090 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1091 if (status == FAIL) {
1093 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1096 if (n_values != 1) {
1098 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1101 status = SDreadattr (sdid, attr_index, &lon_step);
1102 if (status == FAIL) {
1104 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1108 attr_index = SDfindattr (sdid, SWP_LAT_NAME);
1109 if (attr_index == FAIL) {
1111 string attr_name2(SWP_LAT_NAME);
1112 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name2+
" .";
1113 throw InternalErr (__FILE__, __LINE__, err_mesg);
1117 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1118 if (status == FAIL) {
1120 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1123 if (n_values != 1) {
1125 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1128 status = SDreadattr (sdid, attr_index, &swp_lat);
1129 if (status == FAIL) {
1131 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1135 attr_index = SDfindattr (sdid, SWP_LON_NAME);
1136 if (attr_index == FAIL) {
1138 string attr_name2(SWP_LON_NAME);
1139 string err_mesg =
"SDfindattr failed,should find attribute "+attr_name2+
" .";
1140 throw InternalErr (__FILE__, __LINE__, err_mesg);
1144 SDattrinfo (sdid, attr_index, attr_name, &attr_dtype, &n_values);
1145 if (status == FAIL) {
1147 throw InternalErr (__FILE__, __LINE__,
"SDattrinfo failed ");
1150 if (n_values != 1) {
1152 throw InternalErr (__FILE__, __LINE__,
"Only should have one value ");
1155 status = SDreadattr (sdid, attr_index, &swp_lon);
1156 if (status == FAIL) {
1158 throw InternalErr (__FILE__, __LINE__,
"SDreadattr failed ");
1162 if (fieldtype == 1) {
1164 vector<float32> allval;
1165 allval.resize(num_lat_data);
1169 for (
int j = 0; j < num_lat_data; j++)
1170 allval[j] = (num_lat_data - j - 1) * lat_step + swp_lat;
1175 for (
int k = 0; k < nelms; k++)
1176 val[k] = allval[(
int) (offset[0] + step[0] * k)];
1178 set_value ((dods_float32 *) val.data(), nelms);
1181 if (fieldtype == 2) {
1183 vector<float32>allval;
1184 allval.resize(num_lon_data);
1185 for (
int j = 0; j < num_lon_data; j++)
1186 allval[j] = swp_lon + j * lon_step;
1190 for (
int k = 0; k < nelms; k++)
1191 val[k] = allval[(
int) (offset[0] + step[0] * k)];
1193 set_value ((dods_float32 *) val.data(), nelms);
1207HDFSPArrayGeoField::readcersavgid2 (
const int *offset,
const int *count,
const int *step,
1211 const int dimsize0 = 180;
1212 const int dimsize1 = 360;
1213 float32 val[count[0]][count[1]];
1214 float32 orival[dimsize0][dimsize1];
1219 if (fieldtype == 1) {
1220 for (
int i = 0; i < dimsize0; i++)
1221 for (
int j = 0; j < dimsize1; j++)
1222 orival[i][j] = 89.5 - i;
1224 for (
int i = 0; i < count[0]; i++) {
1225 for (
int j = 0; j < count[1]; j++) {
1227 orival[offset[0] + step[0] * i][offset[1] + step[1] * j];
1232 if (fieldtype == 2) {
1252 for (j = 0; j < dimsize1; j++) {
1253 orival[0][j] = -179.5;
1254 orival[dimsize0 - 1][j] = -179.5;
1263 for (i = 0; i < latrange; i++)
1264 for (j = 0; j < (dimsize1 / lonextent); j++)
1265 for (k = 0; k < lonextent; k++)
1266 orival[i + latindex_north][j * lonextent + k] =
1267 -179.5 + lonextent * j;
1270 latindex_south = dimsize0 - 1 - latrange;
1271 for (i = 0; i < latrange; i++)
1272 for (j = 0; j < (dimsize1 / lonextent); j++)
1273 for (k = 0; k < lonextent; k++)
1274 orival[i + latindex_south][j * lonextent + k] =
1275 -179.5 + lonextent * j;
1278 latindex_north = latindex_north + latrange;
1282 for (i = 0; i < latrange; i++)
1283 for (j = 0; j < (dimsize1 / lonextent); j++)
1284 for (k = 0; k < lonextent; k++)
1285 orival[i + latindex_north][j * lonextent + k] =
1286 -179.5 + lonextent * j;
1289 latindex_south = latindex_south - latrange;
1290 for (i = 0; i < latrange; i++)
1291 for (j = 0; j < (dimsize1 / lonextent); j++)
1292 for (k = 0; k < lonextent; k++)
1293 orival[i + latindex_south][j * lonextent + k] =
1294 -179.5 + lonextent * j;
1297 latindex_north = latindex_north + latrange;
1301 for (i = 0; i < latrange; i++)
1302 for (j = 0; j < (dimsize1 / lonextent); j++)
1303 for (k = 0; k < lonextent; k++)
1304 orival[i + latindex_north][j * lonextent + k] =
1305 -179.5 + lonextent * j;
1308 latindex_south = latindex_south - latrange;
1310 for (i = 0; i < latrange; i++)
1311 for (j = 0; j < (dimsize1 / lonextent); j++)
1312 for (k = 0; k < lonextent; k++)
1313 orival[i + latindex_south][j * lonextent + k] =
1314 -179.5 + lonextent * j;
1317 latindex_north = latindex_north + latrange;
1321 for (i = 0; i < latrange; i++)
1322 for (j = 0; j < (dimsize1 / lonextent); j++)
1323 for (k = 0; k < lonextent; k++)
1324 orival[i + latindex_north][j * lonextent + k] =
1325 -179.5 + lonextent * j;
1328 latindex_south = latindex_south - latrange;
1329 for (i = 0; i < latrange; i++)
1330 for (j = 0; j < (dimsize1 / lonextent); j++)
1331 for (k = 0; k < lonextent; k++)
1332 orival[i + latindex_south][j * lonextent + k] =
1333 -179.5 + lonextent * j;
1335 for (i = 0; i < count[0]; i++) {
1336 for (j = 0; j < count[1]; j++) {
1338 orival[offset[0] + step[0] * i][offset[1] + step[1] * j];
1342 set_value ((dods_float32 *) (&val[0][0]), nelms);
1348HDFSPArrayGeoField::readcersavgid1 (
const int *offset,
const int *count,
const int *step,
int nelms)
1354 if (fieldtype == 1) {
1356 const int dimsize0 = 180;
1357 vector<float32> val(count[0]);
1358 vector<float32> orival(dimsize0);
1360 for (
int i = 0; i < dimsize0; i++)
1361 orival[i] = 89.5 - i;
1363 for (
int i = 0; i < count[0]; i++) {
1364 val[i] = orival[offset[0] + step[0] * i];
1366 set_value ((dods_float32 *)(val.data()), nelms);
1370 if (fieldtype == 2) {
1375 throw InternalErr (__FILE__, __LINE__,
1376 "the number of element must be 1");
1377 set_value ((dods_float32 *) (&val), nelms);
1386HDFSPArrayGeoField::readceravgsyn (int32 * offset32, int32 * count32,
1387 int32 * step32,
int nelms)
1390 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
1394 if(
false == check_pass_fileid_key) {
1395 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
1397 ostringstream eherr;
1398 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
1399 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1408 int32 sdsindex = SDreftoindex (sdid, fieldref);
1410 if (sdsindex == -1) {
1412 ostringstream eherr;
1413 eherr <<
"SDS index " << sdsindex <<
" is not right.";
1414 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1417 sdsid = SDselect (sdid, sdsindex);
1420 ostringstream eherr;
1421 eherr <<
"SDselect failed.";
1422 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1436 SDendaccess (sdsid);
1438 throw InternalErr (__FILE__, __LINE__,
1439 "datatype is not float, unsupported.");
1444 r = SDreaddata (sdsid, offset32, step32, count32, val.data());
1446 SDendaccess (sdsid);
1448 ostringstream eherr;
1449 eherr <<
"SDreaddata failed";
1450 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1453 if (fieldtype == 1) {
1454 for (i = 0; i < nelms; i++)
1455 val[i] = 90 - val[i];
1457 if (fieldtype == 2) {
1458 for (i = 0; i < nelms; i++)
1460 val[i] = val[i] - 360.0;
1463 set_value ((dods_float32 *) val.data(), nelms);
1471 r = SDreaddata (sdsid, offset32, step32, count32, val.data());
1473 SDendaccess (sdsid);
1475 ostringstream eherr;
1476 eherr <<
"SDreaddata failed";
1477 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1480 if (fieldtype == 1) {
1481 for (i = 0; i < nelms; i++)
1482 val[i] = 90 - val[i];
1484 if (fieldtype == 2) {
1485 for (i = 0; i < nelms; i++)
1487 val[i] = val[i] - 360.0;
1489 set_value ((dods_float64 *) val.data(), nelms);
1493 SDendaccess (sdsid);
1495 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
1498 r = SDendaccess (sdsid);
1500 ostringstream eherr;
1501 eherr <<
"SDendaccess failed.";
1502 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1511HDFSPArrayGeoField::readceres4ig (
const int32 * offset32,
const int32 * count32,
1512 const int32 * step32,
int nelms)
1515 bool check_pass_fileid_key = HDF4RequestHandler::get_pass_fileid();
1519 if(
false == check_pass_fileid_key) {
1520 sdid = SDstart (
const_cast < char *
>(filename.c_str ()), DFACC_READ);
1522 ostringstream eherr;
1523 eherr <<
"File " << filename.c_str () <<
" cannot be open.";
1524 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1534 int32 sdsindex = SDreftoindex (sdid, (int32) fieldref);
1535 if (sdsindex == -1) {
1537 ostringstream eherr;
1538 eherr <<
"SDS index " << sdsindex <<
" is not right.";
1539 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1542 sdsid = SDselect (sdid, sdsindex);
1545 ostringstream eherr;
1546 eherr <<
"SDselect failed.";
1547 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1551 int32 sds_dtype = 0;
1553 char sdsname[H4_MAX_NC_NAME];
1554 int32 dim_sizes[H4_MAX_VAR_DIMS];
1557 SDgetinfo (sdsid, sdsname, &sdsrank, dim_sizes, &sds_dtype, &n_attrs);
1559 SDendaccess (sdsid);
1561 ostringstream eherr;
1562 eherr <<
"SDgetinfo failed.";
1563 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1566 vector<int32> orioffset32;
1567 vector<int32> oricount32;
1568 vector<int32> oristep32;
1569 orioffset32.resize(sdsrank);
1570 oricount32.resize(sdsrank);
1571 oristep32.resize(sdsrank);
1575 switch (sds_dtype) {
1585 SDendaccess (sdsid);
1587 throw InternalErr (__FILE__, __LINE__,
1588 "datatype is not float, unsupported.");
1591 vector<float32> val;
1593 if (fieldtype == 1) {
1594 if (sptype == CER_CGEO) {
1596 SDendaccess (sdsid);
1598 throw InternalErr (__FILE__, __LINE__,
1599 "For CER_ISCCP-D2like-GEO case, lat/lon must be 3-D");
1604 orioffset32[1] = offset32[0];
1607 oricount32[1] = count32[0];
1610 oristep32[1] = step32[0];
1613 if (sptype == CER_ES4) {
1615 SDendaccess (sdsid);
1617 throw InternalErr (__FILE__, __LINE__,
1618 "For CER_ES4 case, lat/lon must be 2-D");
1621 orioffset32[0] = offset32[0];
1623 oricount32[0] = count32[0];
1625 oristep32[0] = step32[0];
1630 if (fieldtype == 2) {
1631 if (sptype == CER_CGEO) {
1633 SDendaccess (sdsid);
1635 throw InternalErr (__FILE__, __LINE__,
1636 "For CER_ISCCP-D2like-GEO case, lat/lon must be 3-D");
1639 orioffset32[2] = offset32[0];
1642 oricount32[2] = count32[0];
1645 oristep32[2] = step32[0];
1648 if (sptype == CER_ES4) {
1650 SDendaccess (sdsid);
1652 throw InternalErr (__FILE__, __LINE__,
1653 "For CER_ES4 case, lat/lon must be 2-D");
1655 orioffset32[1] = offset32[0];
1657 oricount32[1] = count32[0];
1659 oristep32[1] = step32[0];
1664 r = SDreaddata (sdsid, orioffset32.data(), oristep32.data(), oricount32.data(), val.data());
1666 SDendaccess (sdsid);
1668 ostringstream eherr;
1669 eherr <<
"SDreaddata failed";
1670 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1674 for (
int i = 0; i < nelms; i++)
1675 val[i] = 90 - val[i];
1676 if (fieldtype == 2) {
1681 for (
int i = 0; i < nelms; i++)
1683 val[i] = val[i] - 360.0;
1686 set_value ((dods_float32 *) val.data(), nelms);
1690 SDendaccess (sdsid);
1692 throw InternalErr (__FILE__, __LINE__,
"unsupported data type.");
1695 r = SDendaccess (sdsid);
1697 ostringstream eherr;
1698 eherr <<
"SDendaccess failed.";
1699 throw InternalErr (__FILE__, __LINE__, eherr.str ());
1707HDFSPArrayGeoField::readcerzavg (
const int32 * offset32,
const int32 * count32,
1708 const int32 * step32,
int nelms)
1710 if (fieldtype == 1) {
1715 float32 latstep = 1.0;
1717 for (
int i = 0; i < nelms; i++)
1719 89.5 - ((
int) (offset32[0]) +
1720 ((
int) (step32[0])) * i) * latstep;
1721 set_value ((dods_float32 *) val.data(), nelms);
1724 if (fieldtype == 2) {
1725 if (count32[0] != 1 || nelms != 1)
1726 throw InternalErr (__FILE__, __LINE__,
1727 "Longitude should only have one value for zonal mean");
1731 set_value ((dods_float32 *) & val, nelms);
1739HDFSPArrayGeoField::format_constraint (
int *offset,
int *step,
int *count)
1744 Dim_iter p = dim_begin ();
1745 while (p != dim_end ()) {
1747 int start = dimension_start (p,
true);
1748 int stride = dimension_stride (p,
true);
1749 int stop = dimension_stop (p,
true);
1754 oss <<
"Array/Grid hyperslab start point "<< start <<
1755 " is greater than stop point " << stop <<
".";
1756 throw Error(malformed_expr, oss.str());
1761 count[id] = ((stop - start) / stride) + 1;
1765 "=format_constraint():"
1766 <<
"id=" <<
id <<
" offset=" << offset[
id]
1767 <<
" step=" << step[
id]
1768 <<
" count=" << count[
id]
1781template <
typename T >
1782void HDFSPArrayGeoField::LatLon2DSubset (T * outlatlon,
1785 const int32 * offset,
1786 const int32 * count,
1796 const int dim0count = count[0];
1797 const int dim1count = count[1];
1798 vector <int> dim0index(dim0count);
1799 vector <int> dim1index(dim1count);
1801 for (i = 0; i < count[0]; i++)
1802 dim0index[i] = offset[0] + i * step[0];
1804 for (j = 0; j < count[1]; j++)
1805 dim1index[j] = offset[1] + j * step[1];
1810 for (i = 0; i < count[0]; i++) {
1811 for (j = 0; j < count[1]; j++) {
1812 outlatlon[k] = *(latlon + (dim0index[i] * minordim) + dim1index[j]);
static void close_fileid(int32 sdfd, int32 file_id, int32 gridfd, int32 swathfd, bool pass_fileid_key)