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;
                }
                }
            }
        }