private void SetOtherAttributeByDataTemplateNo(FileStream fs) { _referenceValue = GribNumberHelper.IEEEfloat4(fs); _binaryScaleFactor = GribNumberHelper.Int2(fs); _decimalScaleFactor = GribNumberHelper.Int2(fs); _numberOfBits = fs.ReadByte(); _originalType = fs.ReadByte(); switch (_dataTemplate) { case 0: //0 - Grid point data - simple packing case 1: //1 - Matrix values - simple packing { break; } case 2: case 3: { _splittingMethod = fs.ReadByte(); // octet 23 _missingValueManagement = fs.ReadByte(); // octet 24 - 27 _primaryMissingValue = GribNumberHelper.IEEEfloat4(fs); // octet 28 - 31 _secondaryMissingValue = GribNumberHelper.IEEEfloat4(fs); // octet 32 - 35 _numberOfGroups = GribNumberHelper.Int4(fs); // octet 36 _referenceGroupWidths = fs.ReadByte(); // octet 37 _bitsGroupWidths = fs.ReadByte(); // according to documentation subtract referenceGroupWidths _bitsGroupWidths = _bitsGroupWidths - _referenceGroupWidths; // octet 38 - 41 _referenceGroupLength = GribNumberHelper.Int4(fs); // octet 42 _lengthIncrement = fs.ReadByte(); // octet 43 - 46 _lengthLastGroup = GribNumberHelper.Int4(fs); // octet 47 _bitsScaledGroupLength = fs.ReadByte(); if (_dataTemplate == 3) { // case 3 // complex packing & spatial differencing _orderSpatial = fs.ReadByte(); _descriptorSpatial = fs.ReadByte(); } break; } case 4: case 4000: { _compressionMethod = fs.ReadByte(); _compressionRatio = fs.ReadByte(); break; } } }
private void SetAttributeByGridTemplateNo(FileStream fs) { int scaleFactorRadius, scaleDvalueRadius, scaleFactorMajor, scaleDvalueMajor, scaleFactorMinor, scaleDvalueMinor; float ratio; if ((_gridTemplateNo >= 50 && _gridTemplateNo <= 53) || _gridTemplateNo == 100 || _gridTemplateNo == 120) { if (_gridTemplateNo >= 50 && _gridTemplateNo <= 53) { _j = GribNumberHelper.IEEEfloat4(fs); _k = GribNumberHelper.IEEEfloat4(fs); _m = GribNumberHelper.IEEEfloat4(fs); _method = fs.ReadByte(); _mode = fs.ReadByte(); if (_gridTemplateNo == 51) { _spLat = GribNumberHelper.Int4(fs) * TenToNegSix; _spLon = GribNumberHelper.Int4(fs) * TenToNegSix; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); } else if (_gridTemplateNo == 52) { _poleLat = GribNumberHelper.Int4(fs) * TenToNegSix; _poleLon = GribNumberHelper.Int4(fs) * TenToNegSix; _factor = GribNumberHelper.Int4(fs); } else if (_gridTemplateNo == 53) { _spLat = GribNumberHelper.Int4(fs) * TenToNegSix; _spLon = GribNumberHelper.Int4(fs) * TenToNegSix; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); _poleLat = GribNumberHelper.Int4(fs) * TenToNegSix; _poleLon = GribNumberHelper.Int4(fs) * TenToNegSix; _factor = GribNumberHelper.Int4(fs); } } else if (_gridTemplateNo == 100) { _n2 = fs.ReadByte(); _n3 = fs.ReadByte(); _ni = GribNumberHelper.Int2(fs); _nd = fs.ReadByte(); _poleLat = GribNumberHelper.Int4(fs) * TenToNegSix; _poleLon = GribNumberHelper.Int4(fs) * TenToNegSix; _lonofcenter = GribNumberHelper.Int4(fs); _position = fs.ReadByte(); _order = fs.ReadByte(); _scanMode = fs.ReadByte(); _nt = GribNumberHelper.Int4(fs); } else { _nb = GribNumberHelper.Int4(fs); _nr = GribNumberHelper.Int4(fs); _latFirstPoint = GribNumberHelper.Int4(fs); _lonFirstPoint = GribNumberHelper.Int4(fs); _dx = GribNumberHelper.Int4(fs); _dstart = GribNumberHelper.IEEEfloat4(fs); _scanMode = fs.ReadByte(); } } else { _shape = fs.ReadByte(); scaleFactorRadius = fs.ReadByte(); scaleDvalueRadius = GribNumberHelper.Int4(fs); scaleFactorMajor = fs.ReadByte(); scaleDvalueMajor = GribNumberHelper.Int4(fs); scaleFactorMinor = fs.ReadByte(); scaleDvalueMinor = GribNumberHelper.Int4(fs); _nx = GribNumberHelper.Int4(fs); _ny = GribNumberHelper.Int4(fs); switch (_gridTemplateNo) { // Latitude/Longitude Grid case 0: case 1: case 2: case 3: { _angle = GribNumberHelper.Int4(fs); _subDivisionsAngle = GribNumberHelper.Int4(fs); if (_angle == 0) { ratio = TenToNegSix; } else { ratio = _angle / _subDivisionsAngle; } _latFirstPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _lonFirstPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _resolutionFlag = fs.ReadByte(); _latEndPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _lonEndPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _dx = (float)(GribNumberHelper.Int4(fs) * ratio); _dy = (float)(GribNumberHelper.Int4(fs) * ratio); _scanMode = fs.ReadByte(); // 1, 2, and 3 needs checked if (_gridTemplateNo == 1) { //Rotated Latitude/longitude _spLat = GribNumberHelper.Int4(fs) * TenToNegSix; _spLon = GribNumberHelper.Int4(fs) * TenToNegSix; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); } else if (_gridTemplateNo == 2) { //Stretched Latitude/longitude _poleLat = GribNumberHelper.Int4(fs) * TenToNegSix; _poleLon = GribNumberHelper.Int4(fs) * TenToNegSix; _factor = GribNumberHelper.Int4(fs); } else if (_gridTemplateNo == 3) { //Stretched and Rotated Latitude/longitude _spLat = GribNumberHelper.Int4(fs) * TenToNegSix; _spLon = GribNumberHelper.Int4(fs) * TenToNegSix; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); _poleLat = GribNumberHelper.Int4(fs) * TenToNegSix; _poleLon = GribNumberHelper.Int4(fs) * TenToNegSix; _factor = GribNumberHelper.Int4(fs); } break; } case 10: // Mercator { _latFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _lonFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _resolutionFlag = fs.ReadByte(); _latD = GribNumberHelper.Int4(fs) * TenToNegSix; _latEndPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _lonEndPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _scanMode = fs.ReadByte(); _angle = GribNumberHelper.Int4(fs); _dx = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _dy = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); break; } case 20: // Polar stereographic projection { _latFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _lonFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _resolutionFlag = fs.ReadByte(); _latD = GribNumberHelper.Int4(fs) * TenToNegSix; _lov = GribNumberHelper.Int4(fs) * TenToNegSix; _dx = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _dy = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _projectionCenter = fs.ReadByte(); _scanMode = fs.ReadByte(); break; } case 30: // Lambert Conformal { _latFirstPoint = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _lonFirstPoint = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _resolutionFlag = fs.ReadByte(); _latD = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _lov = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _dx = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _dy = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _projectionCenter = fs.ReadByte(); _scanMode = fs.ReadByte(); _latin1 = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _latin2 = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _spLat = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); _spLon = (float)(GribNumberHelper.Int4(fs) * TenToNegSix); break; } case 31: // Albers Equal Area { _latFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _lonFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _resolutionFlag = fs.ReadByte(); _latD = GribNumberHelper.Int4(fs) * TenToNegSix; _lov = GribNumberHelper.Int4(fs) * TenToNegSix; _dx = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _dy = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _projectionCenter = fs.ReadByte(); _scanMode = fs.ReadByte(); _latin1 = GribNumberHelper.Int4(fs) * TenToNegSix; _latin2 = GribNumberHelper.Int4(fs) * TenToNegSix; _spLat = GribNumberHelper.Int4(fs) * TenToNegSix; _spLon = GribNumberHelper.Int4(fs) * TenToNegSix; break; } case 40: case 41: case 42: case 43: // Gaussian latitude/longitude { _angle = GribNumberHelper.Int4(fs); _subDivisionsAngle = GribNumberHelper.Int4(fs); if (_angle == 0) { ratio = TenToNegSix; } else { ratio = _angle / _subDivisionsAngle; } _latFirstPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _lonFirstPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _resolutionFlag = fs.ReadByte(); _latEndPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _lonEndPoint = (float)(GribNumberHelper.Int4(fs) * ratio); _dx = (float)(GribNumberHelper.Int4(fs) * ratio); _paralellNumber = fs.ReadByte(); _scanMode = fs.ReadByte(); if (_gridTemplateNo == 41) { _spLat = GribNumberHelper.Int4(fs) * ratio; _spLon = GribNumberHelper.Int4(fs) * ratio; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); } else if (_gridTemplateNo == 42) { _poleLat = GribNumberHelper.Int4(fs) * ratio; _poleLon = GribNumberHelper.Int4(fs) * ratio; _factor = GribNumberHelper.Int4(fs); } else if (_gridTemplateNo == 43) { _spLat = GribNumberHelper.Int4(fs) * ratio; _spLon = GribNumberHelper.Int4(fs) * ratio; _rotationAngle = GribNumberHelper.IEEEfloat4(fs); _poleLat = GribNumberHelper.Int4(fs) * ratio; _poleLon = GribNumberHelper.Int4(fs) * ratio; _factor = GribNumberHelper.Int4(fs); } break; } case 90: // Space view perspective or orthographic { _lap = GribNumberHelper.Int4(fs); _lop = GribNumberHelper.Int4(fs); _resolutionFlag = fs.ReadByte(); _dx = GribNumberHelper.Int4(fs); _dy = GribNumberHelper.Int4(fs); _xp = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _yp = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _scanMode = fs.ReadByte(); _angle = GribNumberHelper.Int4(fs); _altitude = GribNumberHelper.Int4(fs) * 1000000; _xo = GribNumberHelper.Int4(fs); _yo = GribNumberHelper.Int4(fs); break; } case 110: // Equatorial azimuthal equidistant projection { _latFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _lonFirstPoint = GribNumberHelper.Int4(fs) * TenToNegSix; _resolutionFlag = fs.ReadByte(); _dx = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _dy = (float)(GribNumberHelper.Int4(fs) * TenToNegThree); _projectionCenter = fs.ReadByte(); _scanMode = fs.ReadByte(); break; } } } }