gribgetgds.c
来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 617 行 · 第 1/2 页
C
617 行
#include <stdio.h>#include "grib.h"extern int debug; /* for DPRINT */void gbyte (char *inchar, unsigned long *iout, unsigned long *iskip, unsigned long nbits);/** ** ================================================================== * A. FUNCTION gribgetgds * PURPOSE: decode Grid Description Section (GDS) from entire * message block and store its info in GDS structures;** INPUT:* char *curr_ptr; pointer to current block * grid_desc_sec *gds; pointer to GDS structure** OUTPUT:* 0> success* num> unsupported projection number REVISION/MODIFICATION HISTORY: 03/07/94 written by Mugur Georgescu CSC, Monterey CA 02/01/96 modified by Steve Lowe SAIC, Monterey CA 06/19/96 modified by Alice Nakajima SAIC, Monterey CA DESCRIPTION: This subroutine is responsible for decoding the Grid Description Section in Gridded Binary (GRIB) format. The steps in the processing are as follows: - get the vertical & horizontal parameters. - get the data representation type - given the data representation type, write the information that follows to the right projection structure (defined in grib.h). - return error if another representation type is sent. RESTRICTIONS: NONE LANGUAGE: ANSI C INCLUDED FILES:* ================================================================== */int gribgetgds(char *curr_ptr, struct grid_desc_sec *gds){/* LOCAL VARIABLES*/char *in = curr_ptr; /* pointer to the message */long skip; /* bits to be skipped */unsigned long something; /* value extracted from message */int sign; /* sign + or - */int status;/*FILE *fp;*/extern void hdr_print(); DPRINT ("Entering gribgetgds()\n");/*** A.0 INIT status to good, skip to 0*/ status=0; skip=0;/*** A.1 FUNCTION gbyte !GDS length */ gbyte(in,&something,&skip,24); DPRINT ("gds->head.uslength\n"); gds->head.uslength = (unsigned short) something; /* ** A.2 FUNCTION gbyte !parm_nv*/ gbyte(in,&something,&skip,8); DPRINT ("gds->head.usNum_v\n"); gds->head.usNum_v =(short) something; /* get parm_nv *//* ** A.3 FUNCTION gbyte !parm_pv_pl*/ gbyte(in,&something,&skip,8); DPRINT ("gds->head.usPl_Pv\n"); gds->head.usPl_Pv = (short) something; /* ** A.4 FUNCTION gbyte !data representation type*/ gbyte(in,&something,&skip,8); DPRINT ("gds->head.usData_type\n"); gds->head.usData_type = (short) something; /* Remainder of GDS is projection dependent *//*** A.5 SWITCH (data type)*/ switch(gds->head.usData_type) { case 0: /* Latitude/Longitude Grid (Equidistant Cylindrical or Plate Carree ) */ case 4: /* Gaussian Latitude/Longitude grid */ case 10: /* Rotated Lat/Lon */ case 14: /* Rotated Gaussian */ case 20: /* Stretched Lat/Lon */ case 24: /* Stretched Gaussian */ case 30: /* Stretched and Rotated Lat/Lon */ case 34: /* Stretched and Rotated Gaussian *//** case latlon: * case gaussian_latlon:* case rotated gaussian:* case stretched latlon:* case stretched gaussian:* case stretched & rotated latlon:* case stretched & rotated gaussian:* FUNCTION gbyte !get Number of Columns*/ gbyte(in, &something, &skip, 16); DPRINT ("gds->llg.usNi\n"); gds->llg.usNi = (int) something; /* get Ni *//** FUNCTION gbyte !get Number of Rows*/ gbyte(in, &something, &skip, 16); DPRINT ("gds->llg.usNj\n"); gds->llg.usNj = (int) something; /* get Nj *//** FUNCTION gbyte !get Latitude of First point*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLat1 \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLat1 = (long) (something) & 8388607; /* get La1 */ if(sign) /* negative value */ gds->llg.lLat1 = - gds->llg.lLat1; /* multiply by -1 *//** FUNCTION gbyte !get Longitude of First point*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLon1 \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLon1 = (long) (something) & 8388607; /* get Lo1 */ if(sign) /* negative value */ gds->llg.lLon1 = - gds->llg.lLon1; /* multiply by -1 *//** FUNCTION gbyte !get resolution & comp flags*/ gbyte(in,&something,&skip,8); DPRINT ("gds->llg.usRes_flag\n"); gds->llg.usRes_flag = (short) something; /* get resolution & comp flags */ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLat2 \n");/** FUNCTION gbyte !get Latitude of Last point*/ sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLat2 = (long) (something) & 8388607; /* get La2 */ if(sign) /* negative value */ gds->llg.lLat2 = - gds->llg.lLat2; /* multiply by -1 *//** FUNCTION gbyte !get Longitude of Last point*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLon2 \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLon2 = (long) (something) & 8388607; /* get Lo2 */ if(sign) /* negative value */ gds->llg.lLon2 = - gds->llg.lLon2; /* multiply by -1 *//** FUNCTION gbyte !get Longitudinal Increment*/ gbyte(in,&something,&skip,16); DPRINT ("gds->llg.iDi\n"); gds->llg.iDi = (int) something; /* get Di *//** FUNCTION gbyte !get Latitudinal Increment*/ gbyte(in,&something,&skip,16); DPRINT ("gds->llg.iDj\n"); gds->llg.iDj = (int) something; /* get Dj *//** FUNCTION gbyte !get scanning mode*/ gbyte(in,&something,&skip,8); DPRINT ("gds->llg.usScan_mode\n"); gds->llg.usScan_mode = (short) something; /* get scaning mode flag *//** FUNCTION gbyte !get reserved octets 29-32*/ gbyte(in,&something,&skip,32); DPRINT ("gds->llg.usZero\n"); gds->llg.usZero = (long) something; /* get reserved octets 29 - 32 *//** FUNCTION gbyte !get south pole lat*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLat_southpole \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLat_southpole = (long) (something) & 8388607; /* get south pole lat */ if(sign) /* negative value */ gds->llg.lLat_southpole = - gds->llg.lLat_southpole; /* multiply by -1 *//** FUNCTION gbyte !get south pole lon*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lLon_southpole \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lLon_southpole = (long) (something) & 8388607; /* get south pole lon */ if(sign) /* negative value */ gds->llg.lLon_southpole = - gds->llg.lLon_southpole; /* multiply by -1 *//** FUNCTION gbyte !angle of rotation*/ gbyte(in,&something,&skip,24); DPRINT ("gds->llg.lRotate\n"); gds->llg.lRotate = (long) something; /* get angle of rotation *//** FUNCTION gbyte !get lat pole stretching*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lPole_lat \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lPole_lat = (long) (something) & 8388607; /* get lat pole stretching */ if(sign) /* negative value */ gds->llg.lPole_lat = - gds->llg.lPole_lat; /* multiply by -1 *//** FUNCTION gbyte !get lon pole stretching*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->llg.lPole_lon \n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->llg.lPole_lon = (long) (something) & 8388607; /* get lon pole stretching */ if(sign) /* negative value */ gds->llg.lPole_lon = - gds->llg.lPole_lon; /* multiply by -1 */ gbyte(in,&something,&skip,24); DPRINT ("gds->llg.lStretch\n"); gds->llg.lStretch = (long) something; break; case 1: /* Mercator Projection Grid *//** case Mercator Projection Grid:* FUNCTION gbyte !get Number of Columns*/ gbyte(in,&something,&skip,16); DPRINT ("gds->merc.cols\n"); gds->merc.cols = (int) something; /* get Ni *//** FUNCTION gbyte !get Number of Rows*/ gbyte(in,&something,&skip,16); DPRINT ("gds->merc.rows\n"); gds->merc.rows = (int) something; /* get Nj *//** FUNCTION gbyte !get Latitude of First Point*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->merc.first_lat\n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->merc.first_lat = (long) (something) & 8388607; /* get La1 */ if(sign) /* negative value */ gds->merc.first_lat = - gds->merc.first_lat; /* multiply by -1 *//** FUNCTION gbyte !get Longitude of First Point*/ gbyte(in,&something,&skip,24); DPRINT ("Sign & gds->merc.first_lon\n"); sign = (int)(something >> 23) & 1; /* get sign */ gds->merc.first_lon = (long) (something) & 8388607; /* get Lo1 */ if(sign) /* negative value */ gds->merc.first_lon = - gds->merc.first_lon; /* multiply by -1 *//** FUNCTION gbyte !get resolution & comp flag*/ gbyte(in,&something,&skip,8); DPRINT ("gds->merc.usRes_flag\n");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?