87 int32 lonlatinterp = 1;
102 int32 sscan, escan,
nscan;
107 int32 seawifs_l1a = 0;
109 int32 startyear = 0, cenyear = 0, endyear = 0;
110 int32 startday = 0, cenday = 0, endday = 0;
111 int32 startmsec = 0, cenmsec = 0, endmsec = 0;
114 float32 northern_lat = -90.0;
115 float32 southern_lat = +90.0;
116 float32 western_lon = +180.0;
117 float32 eastern_lon = -180.0;
119 static char buffer[2048];
120 static char buf2[2048];
122 static char geophyslist[2048];
123 static char wavelist[2048];
125 static char fieldname[FIELDNAMELENMAX];
126 static char attrname[FIELDNAMELENMAX];
128 char *prodlist_str =
"";
129 char *waves_str =
"";
141 int32 numPositionOptions;
145 int32
start[8] = {0, 0, 0, 0, 0, 0, 0, 0};
146 int32 edge[8] = {0, 0, 0, 0, 0, 0, 0, 0};
147 int32 start_w[8] = {0, 0, 0, 0, 0, 0, 0, 0};
150 int32 pix_sub, sc_sub;
154 int16 old_tilt_flags[20];
155 int16 old_tilt_ranges[20][2];
156 int16 new_tilt_flags[20];
157 int16 new_tilt_ranges[20][2];
161 char *vgrpname[] = {
"Scan-Line Attributes",
"Geophysical Data",
"Navigation Data"};
163 float32 lllon, lllat, lrlon, lrlat, ullon, ullat, urlon, urlat;
164 float32 sclon, sclat, cclon, cclat, eclon, eclat;
167 char cntl_pt_cols_buf[4 * 4096];
172 float32 f32_buf[4096];
173 float32 spline_arr[4096];
175 uint8 datelinecross = 0;
177 printf(
"This is version %s of %s (compiled on %s %s)\n", ver,
"l2extract", __DATE__, __TIME__);
194 if (numPositionOptions == 0) {
212 }
else if (numPositionOptions == 8) {
221 }
else if (numPositionOptions == 9) {
232 printf(
"\nNote: Number of Positional Arguments should be 0, 8 or 9!\n");
236 if (pix_sub != 1 || sc_sub != 1) {
237 printf(
"Subsampling not yet implemented.\n");
242 if (prodlist_str[0] != 0) {
246 printf(
"product: %s\n", prodlist_str);
252 if (waves_str[0] != 0) {
253 strcat(wavelist, waves_str);
255 printf(
"Wavelength requested by the user: %s\n", waves_str);
262 HDFfid_r = Hopen(
infile, DFACC_READ, 0);
263 status = Vstart(HDFfid_r);
264 sd_id_r = SDstart(
infile, DFACC_RDONLY);
268 status = SDreadattr(sd_id_r, SDfindattr(sd_id_r,
"Number of Scan Lines"), (VOIDP)&i32);
272 status = SDreadattr(sd_id_r, SDfindattr(sd_id_r,
"Title"), (VOIDP)
title);
273 if (strncmp(
title,
"OCTS", 4) == 0)
275 if (strstr(
title,
"Level-2") != 0)
277 if (strcmp(
title,
"SeaWiFS Level-1A Data") == 0)
283 if ((sscan % 2) == 0)
285 if ((escan % 2) == 1)
287 printf(
"Actual OCTS sscan: %d\n", sscan);
288 printf(
"Actual OCTS escan: %d\n", escan);
292 SDfileinfo(sd_id_r, &ndatasets, &nglobal_attr);
294 if (sscan == -1 &&
spix == -1)
302 if (escan > i32 * (octs + 1)) {
303 printf(
"escan: %d greater than # of scan lines: %d\n", escan, i32);
307 status = SDreadattr(sd_id_r, SDfindattr(sd_id_r,
"Pixels per Scan Line"), (VOIDP)&i32);
315 printf(
"epix: %d greater than # of pixels per scan: %d\n",
epix, i32);
319 printf(
"sscan: %d escan: %d\n", sscan, escan);
320 nscan = escan - sscan + 1;
324 HDFfid_w = Hopen(
outfile, DFACC_CREATE, 0);
325 status = Vstart(HDFfid_w);
326 sd_id_w = SDstart(
outfile, DFACC_RDWR);
330 vg_ref = Vfind(HDFfid_r,
"Geophysical Data");
331 vgid_r = Vattach(HDFfid_r, vg_ref,
"r");
333 for (
i = 0;
i < Vntagrefs(vgid_r);
i++) {
335 sds_id = SDselect(sd_id_r, SDreftoindex(sd_id_r,
ref));
338 strcat(geophyslist, buffer);
339 strcat(geophyslist,
",");
343 for (jds = 0; jds < ndatasets; jds++) {
344 sds_id = SDselect(sd_id_r, jds);
347 printf(
"Name: %s rank: %d type: %d\n", fieldname,
rank,
dtype);
353 strcat(buffer, fieldname);
356 if (strstr(geophyslist, buffer) ==
NULL)
367 dim_id_r = SDgetdimid(sds_id,
i);
368 dim_id_w = SDgetdimid(sds_id_w,
i);
369 SDdiminfo(dim_id_r, buffer, &
count, &i32, &i32);
371 dims_w[jds][
i] = dims[
i];
376 if (strcmp(fieldname,
"samp_table") == 0)
379 if (strcmp(buffer,
"rec") == 0) {
380 dims_w[jds][
i] = (escan - sscan + 1) / 2;
383 if (strcmp(buffer,
"lines") == 0) {
384 dims_w[jds][
i] = escan - sscan + 1;
387 if (strcmp(buffer,
"blines") == 0) {
388 dims_w[jds][
i] = 5 * (escan - sscan + 1);
391 if (strcmp(buffer,
"nsamp") == 0) {
399 if (strcmp(buffer,
"Number of Scan Lines") == 0) {
400 dims_w[jds][
i] = escan - sscan + 1;
403 if (strcmp(buffer,
"Pixels per Scan Line") == 0) {
407 if (strcmp(buffer,
"Number of Pixel Control Points") == 0) {
416 for (
k = 0;
k <
rank;
k++) printf(
"%d\n", dims_w[jds][
k]);
417 printf(
"---------------\n");
421 sds_id_w = SDcreate(sd_id_w, fieldname,
dtype,
rank, dims_w[jds]);
422 if (sds_id_w == -1) {
423 printf(
"Field: %s cannot be created\n", fieldname);
430 dim_id_r = SDgetdimid(sds_id,
i);
431 dim_id_w = SDgetdimid(sds_id_w,
i);
432 SDdiminfo(dim_id_r, buffer, &
count, &i32, &i32);
433 SDsetdimname(dim_id_w, buffer);
438 for (
i = 0;
i < nattrs;
i++) {
439 status = SDreadattr(sds_id,
i, (VOIDP)buf2);
446 if (strcmp(fieldname,
"cntl_pt_cols") == 0 && lonlatinterp == 1) {
447 status = SDreaddata(sds_id,
start,
NULL, dims, (VOIDP)cntl_pt_cols_buf);
451 for (
i = 0;
i < n_cntl_pnts;
i++) {
452 memcpy(&i32, &cntl_pt_cols_buf[4 *
i],
sizeof(int32));
454 memcpy(&cntl_pt_cols_buf[4 *
i], &
f32,
sizeof(float32));
458 SDendaccess(sds_id_w);
465 for (
i = 0;
i < nglobal_attr;
i++) {
470 if (strcmp(buffer,
"Number of Scan Lines") == 0) {
471 memcpy(&nscans,
data, 4);
474 if (strcmp(buffer,
"Pixels per Scan Line") == 0) {
475 memcpy(&npixl,
data, 4);
484 for (jds = 0; jds < ndatasets; jds++) {
485 sds_id = SDselect(sd_id_r, jds);
492 strcat(buffer, fieldname);
495 if (strstr(geophyslist, buffer) ==
NULL)
503 printf(
"[Copy] %s\n", fieldname);
505 sds_id_w = SDselect(sd_id_w, n++);
512 dim_id_w = SDgetdimid(sds_id_w,
i);
513 SDdiminfo(dim_id_w, buffer, &
count, &i32, &nattrs);
514 SDsetdimname(dim_id_w, buffer);
518 if (strcmp(fieldname,
"samp_table_") != 0) {
519 if (strcmp(buffer,
"rec") == 0) {
520 start[
i] = (sscan - 1) / 2;
523 if (strcmp(buffer,
"lines") == 0) {
527 if (strcmp(buffer,
"blines") == 0) {
528 start[
i] = 5 * (sscan - 1);
531 if (strcmp(buffer,
"nsamp") == 0) {
540 if (strcmp(buffer,
"Number of Scan Lines") == 0) {
544 if (strcmp(buffer,
"Pixels per Scan Line") == 0) {
550 nelem = dims_w[jds][
i];
552 nelem *= dims_w[jds][
i];
555 if (seawifs_l1a == 0) {
556 if (strcmp(fieldname,
"slat") == 0 || strcmp(fieldname,
"slon") == 0 ||
557 strcmp(fieldname,
"elon") == 0 || strcmp(fieldname,
"elat") == 0 ||
558 strcmp(fieldname,
"clon") == 0 || strcmp(fieldname,
"clat") == 0) {
565 if (strcmp(fieldname,
"latitude") == 0 || strcmp(fieldname,
"longitude") == 0)
566 nelem = nscans * npixl;
568 data = (
char *)calloc(nelem, DFKNTsize(
dtype));
570 if (strcmp(fieldname,
"cntl_pt_cols") == 0 && lonlatinterp == 1) {
571 for (
i = 0;
i < dims_w[jds][0];
i++) {
573 memcpy(&
data[
i * 4], &i32, 4);
577 }
else if (strcmp(fieldname,
"latitude") == 0 && lonlatinterp == 1) {
578 dims_lonlat[0] = dims_w[jds][0];
579 dims_lonlat[1] = n_cntl_pnts;
581 for (
i = 0;
i < dims_w[jds][0];
i++) {
584 edge[1] = dims_lonlat[1];
590 for (
j = 0;
j < dims_w[jds][0];
j++) {
591 spline((
float *)cntl_pt_cols_buf, (
float *)&
data[
j * 4 * npixl], n_cntl_pnts, 1e30, 1e30,
594 splint((
float *)cntl_pt_cols_buf, (
float *)&
data[
j * 4 * npixl], spline_arr, n_cntl_pnts,
595 i + 1.0, &f32_buf[
i -
spix + 1]);
599 if (f32_buf[
i -
spix + 1] > northern_lat)
600 northern_lat = f32_buf[
i -
spix + 1];
601 if (f32_buf[
i -
spix + 1] < southern_lat)
602 southern_lat = f32_buf[
i -
spix + 1];
605 memcpy(&
data[
j * 4 * dims_w[jds][1]], f32_buf, 4 * dims_w[jds][1]);
610 }
else if (strcmp(fieldname,
"longitude") == 0 && lonlatinterp == 1) {
611 dims_lonlat[0] = dims_w[jds][0];
612 dims_lonlat[1] = n_cntl_pnts;
614 for (
i = 0;
i < dims_w[jds][0];
i++) {
617 edge[1] = dims_lonlat[1];
623 for (
j = 0;
j < dims_w[jds][0];
j++) {
626 for (
i = 1;
i < dims_lonlat[1];
i++) {
627 memcpy(&f32_buf[1], &
data[4 * (
j * npixl +
i)], 4);
628 memcpy(&f32_buf[0], &
data[4 * (
j * npixl +
i - 1)], 4);
629 delta = f32_buf[1] - f32_buf[0];
633 }
else if (
delta > 180) {
637 memcpy(&
data[4 * (
j * npixl +
i)], &f32_buf[1], 4);
640 spline((
float *)cntl_pt_cols_buf, (
float *)&
data[
j * 4 * npixl], n_cntl_pnts, 1e30, 1e30,
643 splint((
float *)cntl_pt_cols_buf, (
float *)&
data[
j * 4 * npixl], spline_arr, n_cntl_pnts,
644 i + 1.0, &f32_buf[
i -
spix + 1]);
645 if (f32_buf[
i -
spix + 1] > +180)
646 f32_buf[
i -
spix + 1] -= 360;
647 if (f32_buf[
i -
spix + 1] < -180)
648 f32_buf[
i -
spix + 1] += 360;
652 if (f32_buf[
i -
spix + 1] > eastern_lon)
653 eastern_lon = f32_buf[
i -
spix + 1];
654 if (f32_buf[
i -
spix + 1] < western_lon)
655 western_lon = f32_buf[
i -
spix + 1];
657 memcpy(&
data[
j * 4 * dims_w[jds][1]], f32_buf, 4 * dims_w[jds][1]);
662 printf(
"read status: %d for %s\n\n",
status, fieldname);
669 if (strcmp(fieldname,
"year") == 0) {
670 memcpy(&startyear, &
data[0], 4);
671 memcpy(&cenyear, &
data[4 * (dims_w[jds][0] / 2)], 4);
672 memcpy(&endyear, &
data[4 * (dims_w[jds][0] - 1)], 4);
675 if (strcmp(fieldname,
"day") == 0) {
676 memcpy(&startday, &
data[0], 4);
677 memcpy(&cenday, &
data[4 * (dims_w[jds][0] / 2)], 4);
678 memcpy(&endday, &
data[4 * (dims_w[jds][0] - 1)], 4);
681 if (strcmp(fieldname,
"msec") == 0) {
682 memcpy(&startmsec, &
data[0], 4);
683 memcpy(&cenmsec, &
data[4 * (dims_w[jds][0] / 2)], 4);
684 memcpy(&endmsec, &
data[4 * (dims_w[jds][0] - 1)], 4);
687 if (strcmp(fieldname,
"longitude") == 0) {
688 memcpy(&ullon, &
data[0], 4);
689 memcpy(&lllon, &
data[4 * (dims_w[jds][1] * (dims_w[jds][0] - 1))], 4);
691 memcpy(&urlon, &
data[4 * (dims_w[jds][1] - 1)], 4);
692 memcpy(&lrlon, &
data[4 * (dims_w[jds][0] * dims_w[jds][1] - 1)], 4);
694 memcpy(&cclon, &
data[4 * (dims_w[jds][1] * dims_w[jds][0] / 2 - dims_w[jds][1] / 2)], 4);
695 memcpy(&sclon, &
data[4 * (dims_w[jds][1] / 2)], 4);
696 memcpy(&eclon, &
data[4 * (dims_w[jds][1] * dims_w[jds][0] - dims_w[jds][1] / 2)], 4);
699 if (strcmp(fieldname,
"latitude") == 0) {
700 memcpy(&ullat, &
data[0], 4);
701 memcpy(&lllat, &
data[4 * (dims_w[jds][1] * (dims_w[jds][0] - 1))], 4);
703 memcpy(&urlat, &
data[4 * (dims_w[jds][1] - 1)], 4);
704 memcpy(&lrlat, &
data[4 * (dims_w[jds][0] * dims_w[jds][1] - 1)], 4);
706 memcpy(&cclat, &
data[4 * (dims_w[jds][1] * dims_w[jds][0] / 2 - dims_w[jds][1] / 2)], 4);
707 memcpy(&sclat, &
data[4 * (dims_w[jds][1] / 2)], 4);
708 memcpy(&eclat, &
data[4 * (dims_w[jds][1] * dims_w[jds][0] - dims_w[jds][1] / 2)], 4);
712 if (strcmp(fieldname,
"lon") == 0) {
713 memcpy(&ullon, &
data[0], 4);
714 memcpy(&lllon, &
data[4 * (dims_w[jds][0] - 1) * dims_w[jds][1]], 4);
716 memcpy(&urlon, &
data[4 * (dims_w[jds][1] - 1)], 4);
717 memcpy(&lrlon, &
data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1] + dims_w[jds][1] - 1)], 4);
719 memcpy(&cclon, &
data[4 * ((dims_w[jds][0] / 2) * dims_w[jds][1] + dims_w[jds][1] / 2)], 4);
720 memcpy(&sclon, &
data[4 * (dims_w[jds][1] / 2)], 4);
721 memcpy(&eclon, &
data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1] + dims_w[jds][1] / 2)], 4);
724 if (strcmp(fieldname,
"lat") == 0) {
725 memcpy(&ullat, &
data[0], 4);
726 memcpy(&lllat, &
data[4 * (dims_w[jds][0] - 1) * dims_w[jds][1]], 4);
728 memcpy(&urlat, &
data[4 * (dims_w[jds][1] - 1)], 4);
729 memcpy(&lrlat, &
data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1] + dims_w[jds][1] - 1)], 4);
731 memcpy(&cclat, &
data[4 * ((dims_w[jds][0] / 2) * dims_w[jds][1] + dims_w[jds][1] / 2)], 4);
732 memcpy(&sclat, &
data[4 * (dims_w[jds][1] / 2)], 4);
733 memcpy(&eclat, &
data[4 * ((dims_w[jds][0] - 1) * dims_w[jds][1] + dims_w[jds][1] / 2)], 4);
737 if (strcmp(fieldname,
"csol_z") == 0) {
738 memcpy(&csolz, &
data[4 * (dims_w[jds][0] / 2)], 4);
741 if (strcmp(fieldname,
"ntilts") == 0) {
742 memcpy(&ntilts,
data, 4);
745 if (strcmp(fieldname,
"tilt_flags") == 0) {
746 memcpy(old_tilt_flags,
data, 2 * 20);
749 if (strcmp(fieldname,
"tilt_ranges") == 0) {
750 memset(new_tilt_flags, 0, 2 * 20);
751 memset(new_tilt_ranges, 0, 2 * 2 * 20);
752 memcpy(old_tilt_ranges,
data, 2 * 2 * 20);
754 for (
i = 0;
i < ntilts;
i++) {
755 if (sscan >= old_tilt_ranges[
i][0] && sscan <= old_tilt_ranges[
i][1]) {
759 if (escan >= old_tilt_ranges[
i][0] && escan <= old_tilt_ranges[
i][1]) {
763 ntilts = etilt - stilt + 1;
765 for (
i = 0;
i < ntilts;
i++) {
766 new_tilt_ranges[
i][0] = old_tilt_ranges[stilt +
i][0] - sscan + 1;
767 new_tilt_ranges[
i][1] = old_tilt_ranges[stilt +
i][1] - sscan + 1;
769 if (new_tilt_ranges[
i][0] < 1)
770 new_tilt_ranges[
i][0] = 1;
771 if (new_tilt_ranges[
i][1] < 1)
772 new_tilt_ranges[
i][0] = 1;
774 if (new_tilt_ranges[
i][0] >
nscan)
775 new_tilt_ranges[
i][0] =
nscan;
776 if (new_tilt_ranges[
i][1] >
nscan)
777 new_tilt_ranges[
i][1] =
nscan;
779 new_tilt_flags[
i] = old_tilt_flags[stilt +
i];
780 new_tilt_flags[
i] = old_tilt_flags[stilt +
i];
783 memcpy(
data, new_tilt_ranges, 2 * 2 * 20);
788 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)
data);
790 printf(
"write status: %d\n\n",
status);
796 if (strcmp(fieldname,
"longitude") == 0) {
797 data2 = (
char *)calloc(dims_w[jds][0], DFKNTsize(
dtype));
800 for (
j = 0;
j < dims_w[jds][0];
j++) {
802 memcpy(&data2[
k *
j], &
data[
k *
j * dims_w[jds][1]], DFKNTsize(
dtype));
804 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"slon"));
805 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
807 printf(
"write status: %d\n\n",
status);
812 for (
j = 0;
j < dims_w[jds][0];
j++) {
814 memcpy(&data2[
k *
j], &
data[
k * (
j * dims_w[jds][1] + dims_w[jds][1] - 1)], DFKNTsize(
dtype));
816 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"elon"));
817 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
819 printf(
"write status: %d\n\n",
status);
824 for (
j = 0;
j < dims_w[jds][0];
j++) {
826 memcpy(&data2[
k *
j], &
data[
k * (
j * dims_w[jds][1] + dims_w[jds][1] / 2)], DFKNTsize(
dtype));
828 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"clon"));
829 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
831 printf(
"write status: %d\n\n",
status);
839 if (strcmp(fieldname,
"latitude") == 0) {
840 data2 = (
char *)calloc(dims_w[jds][0], DFKNTsize(
dtype));
843 for (
j = 0;
j < dims_w[jds][0];
j++) {
845 memcpy(&data2[
k *
j], &
data[
k *
j * dims_w[jds][1]], DFKNTsize(
dtype));
847 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"slat"));
848 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
850 printf(
"write status: %d\n\n",
status);
855 for (
j = 0;
j < dims_w[jds][0];
j++) {
857 memcpy(&data2[
k *
j], &
data[
k * (
j * dims_w[jds][1] + dims_w[jds][1] - 1)], DFKNTsize(
dtype));
859 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"elat"));
860 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
862 printf(
"write status: %d\n\n",
status);
867 for (
j = 0;
j < dims_w[jds][0];
j++) {
869 memcpy(&data2[
k *
j], &
data[
k * (
j * dims_w[jds][1] + dims_w[jds][1] / 2)], DFKNTsize(
dtype));
871 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"clat"));
872 status = SDwritedata(sds_id_w, start_w,
NULL, dims_w[jds], (VOIDP)data2);
874 printf(
"write status: %d\n\n",
status);
883 SDendaccess(sds_id_w);
889 sds_id = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"ntilts"));
892 status = SDwritedata(sds_id, &zero,
NULL, dims, (VOIDP)&ntilts);
894 printf(
"write ntilts status: %d\n\n",
status);
899 sds_id = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"tilt_flags"));
902 status = SDwritedata(sds_id, &zero,
NULL, dims, (VOIDP)new_tilt_flags);
904 printf(
"write tilt_flags status: %d for %d\n\n",
status, jds);
914 data2 = (
char *)calloc(dims_w[0][0],
sizeof(
float));
916 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"slon"));
917 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
919 memcpy(&ullon, &data2[0],
sizeof(
float));
920 memcpy(&lllon, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
922 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"clon"));
923 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
925 memcpy(&sclon, &data2[0],
sizeof(
float));
926 memcpy(&eclon, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
927 memcpy(&cclon, &data2[
sizeof(
float) * (
epix -
spix) / 2],
sizeof(
float));
929 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"elon"));
930 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
932 memcpy(&urlon, &data2[0],
sizeof(
float));
933 memcpy(&lrlon, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
935 eastern_lon = -180.0;
936 western_lon = +180.0;
937 if (ullon > eastern_lon)
939 if (lllon > eastern_lon)
941 if (sclon > eastern_lon)
943 if (eclon > eastern_lon)
945 if (urlon > eastern_lon)
947 if (lrlon > eastern_lon)
950 if (ullon < western_lon)
952 if (lllon < western_lon)
954 if (sclon < western_lon)
956 if (eclon < western_lon)
958 if (urlon < western_lon)
960 if (lrlon < western_lon)
963 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"slat"));
964 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
966 memcpy(&ullat, &data2[0],
sizeof(
float));
967 memcpy(&lllat, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
969 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"clat"));
970 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
972 memcpy(&sclat, &data2[0],
sizeof(
float));
973 memcpy(&eclat, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
974 memcpy(&cclat, &data2[
sizeof(
float) * (
epix -
spix) / 2],
sizeof(
float));
976 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w,
"elat"));
977 status = SDreaddata(sds_id_w, start_w,
NULL, dims_w[0], (VOIDP)data2);
979 memcpy(&urlat, &data2[0],
sizeof(
float));
980 memcpy(&lrlat, &data2[
sizeof(
float) * (
epix -
spix)],
sizeof(
float));
982 northern_lat = -90.0;
983 southern_lat = +90.0;
984 if (ullat > northern_lat)
985 northern_lat = ullat;
986 if (lllat > northern_lat)
987 northern_lat = lllat;
988 if (sclat > northern_lat)
989 northern_lat = sclat;
990 if (eclat > northern_lat)
991 northern_lat = eclat;
992 if (urlat > northern_lat)
993 northern_lat = urlat;
994 if (lrlat > northern_lat)
995 northern_lat = lrlat;
997 if (ullat < southern_lat)
998 southern_lat = ullat;
999 if (lllat < southern_lat)
1000 southern_lat = lllat;
1001 if (sclat < southern_lat)
1002 southern_lat = sclat;
1003 if (eclat < southern_lat)
1004 southern_lat = eclat;
1005 if (urlat < southern_lat)
1006 southern_lat = urlat;
1007 if (lrlat < southern_lat)
1008 southern_lat = lrlat;
1023 if (datelinecross == 1) {
1024 eastern_lon = lllon;
1025 western_lon = lrlon;
1031 for (
i = 0;
i < nglobal_attr;
i++) {
1038 if (strcmp(buffer,
"Number of Scan Lines") == 0) {
1040 i32 = (escan - sscan + 1) / 2;
1042 i32 = escan - sscan + 1;
1043 memcpy(
data, &i32, 4);
1046 if (strcmp(buffer,
"Pixels per Scan Line") == 0) {
1048 memcpy(
data, &i32, 4);
1051 if (strcmp(buffer,
"Number of Scan Control Points") == 0 && lonlatinterp == 1) {
1052 i32 = escan - sscan + 1;
1053 memcpy(
data, &i32, 4);
1056 if (strcmp(buffer,
"Number of Pixel Control Points") == 0 && lonlatinterp == 1) {
1058 memcpy(
data, &i32, 4);
1061 if (strcmp(buffer,
"Scene Center Scan Line") == 0) {
1062 i32 = (escan - sscan + 1) / 2 + 1;
1063 memcpy(
data, &i32, 4);
1066 if (strcmp(buffer,
"Start Time") == 0) {
1067 if (startyear != 0) {
1068 utime =
yds2unix(startyear, startday, startmsec / ((
double)1000.0));
1072 if (strcmp(buffer,
"Start Year") == 0) {
1074 memcpy(
data, &startyear, 4);
1076 if (strcmp(buffer,
"Start Day") == 0) {
1078 memcpy(
data, &startday, 4);
1080 if (strcmp(buffer,
"Start Millisec") == 0) {
1082 memcpy(
data, &startmsec, 4);
1085 if (strcmp(buffer,
"End Time") == 0) {
1087 utime =
yds2unix(endyear, endday, endmsec / ((
double)1000.0));
1091 if (strcmp(buffer,
"End Year") == 0) {
1093 memcpy(
data, &endyear, 4);
1095 if (strcmp(buffer,
"End Day") == 0) {
1097 memcpy(
data, &endday, 4);
1099 if (strcmp(buffer,
"End Millisec") == 0) {
1101 memcpy(
data, &endmsec, 4);
1104 if (strcmp(buffer,
"Scene Center Time") == 0) {
1106 utime =
yds2unix(cenyear, cenday, cenmsec / ((
double)1000.0));
1111 if (strcmp(buffer,
"Upper Left Longitude") == 0) {
1112 memcpy(
data, &ullon, 4);
1114 if (strcmp(buffer,
"Upper Right Longitude") == 0) {
1115 memcpy(
data, &urlon, 4);
1117 if (strcmp(buffer,
"Upper Left Latitude") == 0) {
1118 memcpy(
data, &ullat, 4);
1120 if (strcmp(buffer,
"Upper Right Latitude") == 0) {
1121 memcpy(
data, &urlat, 4);
1123 if (strcmp(buffer,
"Start Center Longitude") == 0) {
1124 memcpy(
data, &sclon, 4);
1126 if (strcmp(buffer,
"Start Center Latitude") == 0) {
1127 memcpy(
data, &sclat, 4);
1129 if (strcmp(buffer,
"Scene Center Longitude") == 0) {
1130 memcpy(
data, &cclon, 4);
1132 if (strcmp(buffer,
"Scene Center Latitude") == 0) {
1133 memcpy(
data, &cclat, 4);
1135 if (strcmp(buffer,
"Scene Center Solar Zenith") == 0) {
1136 memcpy(
data, &csolz, 4);
1138 if (strcmp(buffer,
"Lower Left Longitude") == 0) {
1139 memcpy(
data, &lllon, 4);
1141 if (strcmp(buffer,
"Lower Right Longitude") == 0) {
1142 memcpy(
data, &lrlon, 4);
1144 if (strcmp(buffer,
"Lower Left Latitude") == 0) {
1145 memcpy(
data, &lllat, 4);
1147 if (strcmp(buffer,
"Lower Right Latitude") == 0) {
1148 memcpy(
data, &lrlat, 4);
1150 if (strcmp(buffer,
"End Center Longitude") == 0) {
1151 memcpy(
data, &eclon, 4);
1153 if (strcmp(buffer,
"End Center Latitude") == 0) {
1154 memcpy(
data, &eclat, 4);
1157 if (strcmp(buffer,
"Northernmost Latitude") == 0 && lonlatinterp == 1) {
1158 memcpy(
data, &northern_lat, 4);
1160 if (strcmp(buffer,
"Southernmost Latitude") == 0 && lonlatinterp == 1) {
1161 memcpy(
data, &southern_lat, 4);
1163 if (strcmp(buffer,
"Easternmost Longitude") == 0 && lonlatinterp == 1) {
1164 memcpy(
data, &eastern_lon, 4);
1166 if (strcmp(buffer,
"Westernmost Longitude") == 0 && lonlatinterp == 1) {
1167 memcpy(
data, &western_lon, 4);
1170 if (strcmp(buffer,
"LAC Pixel Start Number") == 0) {
1171 status = SDreadattr(sd_id_r,
i + 1, (VOIDP)&i32);
1172 memcpy(&LAC_start,
data, 4);
1173 LAC_start += i32 * (
spix - 1);
1174 memcpy(
data, &LAC_start, 4);
1181 if (strcmp(buffer,
"Processing Time") == 0) {
1192 for (
i = 0;
i < nglobal_attr;
i++) {
1199 if (strcmp(buffer,
"Title") == 0) {
1200 if (strstr(
data,
"Level-1A") !=
NULL) {
1204 status = SDsetattr(sd_id_w,
"Extract Pixel Offset",
DFNT_INT32, 1, (VOIDP)&i32);
1209 status = SDsetattr(sd_id_w,
"Extract Pixel Count",
DFNT_INT32, 1, (VOIDP)&i32);
1214 status = SDsetattr(sd_id_w,
"Extract Line Offset",
DFNT_INT32, 1, (VOIDP)&i32);
1218 i32 = escan - sscan + 1;
1219 status = SDsetattr(sd_id_w,
"Extract Line Count",
DFNT_INT32, 1, (VOIDP)&i32);
1228 for (
j = 0;
j < nvgrp;
j++) {
1229 vg_ref = Vfind(HDFfid_r, vgrpname[
j]);
1230 vgid_r = Vattach(HDFfid_r, vg_ref,
"r");
1231 vgid_w = Vattach(HDFfid_w, -1,
"w");
1232 Vgetname(vgid_r, buffer);
1233 Vsetname(vgid_w, buffer);
1234 Vgetclass(vgid_r, buffer);
1235 Vsetclass(vgid_w, buffer);
1237 for (
i = 0;
i < Vntagrefs(vgid_r);
i++) {
1239 sds_id = SDselect(sd_id_r, SDreftoindex(sd_id_r,
ref));
1244 if (
prodlist[0] != 0 && strcmp(vgrpname[
j],
"Geophysical Data") == 0) {
1246 strcat(buf2, fieldname);
1253 sds_id_w = SDselect(sd_id_w, SDnametoindex(sd_id_w, fieldname));
1254 Vaddtagref(vgid_w, DFTAG_NDG, SDidtoref(sds_id_w));
1256 SDendaccess(sds_id_w);
1258 SDendaccess(sds_id);