예제 #1
0
 private void SetAttributes(Grib1GridDefinitionSection gds, Grib1ProductDefinitionSection pds)
 {
     if (gds != null)
     {
         _definition  = new GRIB_Definition((float)gds.LonFirstPoint, (float)gds.LatEndPoint, (float)gds.Dy, gds.Nx, gds.Ny, pds.Level.Name, float.NaN);
         _height      = gds.Ny;
         _resolutionX = (float)gds.Dx;
         _resolutionY = (float)gds.Dy;
         _width       = gds.Nx;
     }
     _decscale      = pds.DecimalScale;
     _referenceTime = pds.ReferenceTime;
     _timeUnit      = pds.TimeUnit;
     _isBmsExist    = pds.BmsExists();
     _coordEnvelope = _definition.GetCoordEnvelope();
     _dataType      = enumDataType.Float;
 }
예제 #2
0
        private void ReadToDataProvider()
        {
            if (string.IsNullOrEmpty(_fileName) || !File.Exists(_fileName))
            {
                return;
            }
            long startOffset = -1;
            GribIndicatorSection          iSection;
            Grib1ProductDefinitionSection pds;
            Grib1GridDefinitionSection    gds = null;

            _fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read);
            if (SeekHeader(_fs, _fs.Length, out startOffset))
            {
                iSection = new GribIndicatorSection(_fs);
                long EOR = _fs.Position + iSection.GribLength - iSection.SectionLength;
                pds = new Grib1ProductDefinitionSection(_fs);
                if (pds.GdsExists())
                {
                    gds       = new Grib1GridDefinitionSection(_fs);
                    _scanMode = gds.ScanMode;
                }
                if (pds.Center == 98)
                {
                    int length = (int)GribNumberHelper.Uint3(_fs);
                    if ((length + _fs.Position) < EOR)
                    {
                        _dataOffset = _fs.Position - 3;
                    }
                    else
                    {
                        _dataOffset = _fs.Position - 2;
                    }
                }
                else
                {
                    _dataOffset = _fs.Position;
                }
                SetAttributes(gds, pds);
                _edition = iSection.GribEdition;
            }
        }
예제 #3
0
 private void SetAttributes(Grib1GridDefinitionSection gds, Grib1ProductDefinitionSection pds)
 {
     if (gds != null)
     {
         _definition = new GRIB_Definition((float)gds.LonFirstPoint, (float)gds.LatFirstPoint, (float)gds.LonEndPoint, (float)gds.LatEndPoint,
                                           (float)gds.Dx, (float)gds.Dy, gds.Nx, gds.Ny, pds.Level.Name, pds.Level.Value1);
         _level    = pds.Level.Value1;
         _firstlat = gds.LatFirstPoint;
         _firstlon = gds.LonFirstPoint;
         _lastlat  = gds.LatEndPoint;
         _lastlon  = gds.LonEndPoint;
         //日本的J区域网格为“瘦网格”,即每行格点数不同,
         //已通过GDS中的_thinnedGrid值计算dx和Nx
         //if (pds.Center == 34 && _firstlat == 0 && _firstlon == 60 && _lastlat == 90 && _lastlon == 150) //日本J区域
         //{
         //    _resolutionX = (float)gds.Dy;
         //    _resolutionY = (float)gds.Dy;
         //    _height = gds.Ny;
         //    _width = gds.Ny;
         //}
         //else
         {
             _resolutionX = (float)gds.Dx;
             _resolutionY = (float)gds.Dy;
             _height      = gds.Ny;
             _width       = gds.Nx;
         }
         _resolution     = gds.Resolution;
         _coordEnvelope  = _definition.GetCoordEnvelope();
         _gridtype       = gds.GridType;
         _thinnedGrid    = gds.ThinnedGrid;
         _thinnedGridNum = gds.ThinnedGridNum;
         _thinnedXNums   = gds.ThinnedXNums;
         _xReverse       = gds.XReverse;
         _yReverse       = gds.YReverse;
     }
     else if (pds.Center == 7)//美国KWBC,
     {
         _resolutionX = 5.0f;
         _gridtype    = 0;
         if (pds.Grid_Id == 21)//A区域
         {
             _definition    = new GRIB_Definition(180f, 0f, 0f, 90f, 5f, 2.5f, 37, 36, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = 0;
             _firstlon      = 0;
             _lastlat       = 90;
             _resolutionY   = 2.5f;
             _coordEnvelope = new CoordEnvelope(0, 180, 0, 90);
         }
         else if (pds.Grid_Id == 22)//B区域
         {
             _definition    = new GRIB_Definition(-180f, 0f, 0f, 90f, 5f, 2.5f, 37, 36, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = 0;
             _firstlon      = -180;
             _lastlat       = 90;
             _resolutionY   = 2.5f;
             _coordEnvelope = new CoordEnvelope(-180, 0, 0, 90);
         }
         else if (pds.Grid_Id == 23)//C区域
         {
             _definition    = new GRIB_Definition(0f, -90f, 180f, 0f, 5f, 2.5f, 37, 36, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = -90;
             _firstlon      = 0;
             _lastlat       = 0;
             _resolutionY   = 2.5f;
             _coordEnvelope = new CoordEnvelope(0, 180, -90, 0);
         }
         else if (pds.Grid_Id == 24)//D区域
         {
             _definition    = new GRIB_Definition(-180f, -90f, -90f, 0f, 5f, 2.5f, 37, 36, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = -90;
             _firstlon      = -180;
             _lastlat       = 0;
             _resolutionY   = 2.5f;
             _coordEnvelope = new CoordEnvelope(-180, 0, -90, 0);
         }
         else if (pds.Grid_Id == 25)//北半球
         {
             _definition    = new GRIB_Definition(-180f, 0f, 180f, 90f, 5f, 5f, 72, 18, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = 0;
             _firstlon      = -180;
             _lastlat       = 90;
             _resolutionY   = 5.0f;
             _coordEnvelope = new CoordEnvelope(-180, 180, 0, 90);
         }
         else if (pds.Grid_Id == 26)//南半球
         {
             _definition    = new GRIB_Definition(-180f, -90f, 180f, 0f, 5f, 5f, 72, 18, null, -9999);
             _width         = _definition.Width;
             _height        = _definition.Height;
             _firstlat      = -90;
             _firstlon      = -180;
             _lastlat       = 0;
             _resolutionY   = 5.0f;
             _coordEnvelope = new CoordEnvelope(-180, 180, -90, 0);
         }
     }
     _decscale      = pds.DecimalScale;
     _referenceTime = pds.ReferenceTime;
     _timeUnit      = pds.TimeUnit;
     _isBmsExist    = pds.BmsExists();
     _dataType      = enumDataType.Float;
     using (SpatialReferenceBuilder builder = new SpatialReferenceBuilder())
     {
         int prjType = GetPrjTypeByGridType(_gridtype);
         _spatialReff = builder.GetSpatialRef(prjType, _firstlat, _lastlat, 0);
     }
 }