Example #1
0
        private Band[] TryCreateRasterDataBands(AbstractWarpDataset srcRaster, NPP_PrjSetting prjSettings,
                                                Action <int, string> progressCallback)
        {
            List <Band> rasterBands = new List <Band>();

            _factors = new float[_prjBands.Length * 2];
            for (int i = 0; i < _prjBands.Length; i++)
            {
                progressCallback?.Invoke(_readyProgress++, "准备第" + i + "个输入数据通道");
                PrjBand bandMap = _prjBands[i];
                int     index   = Convert.ToInt32(bandMap.BandName);
                float[] factor  = new float[] { 1, 0 };
                if (prjSettings.IsRad || prjSettings.IsRadRef)
                {
                    Band[] latBands = bandDatasetList[index].GetBands("BrightnessTemperature");
                    if (latBands == null || latBands.Length == 0)
                    {
                        latBands = bandDatasetList[index].GetBands("Reflectance");
                        var     factorDic = bandDatasetList[index].GetDatasetAttributes("ReflectanceFactors");
                        float[] temp      = TryReadFactor(bandDatasetList[index], "ReflectanceFactors");
                        if (temp != null)
                        {
                            factor[0] = temp[0];
                            factor[1] = temp[1];
                        }
                        Console.WriteLine("Reflectance");
                    }
                    else
                    {
                        Console.WriteLine("BrightnessTemperature");
                        float[] temp = TryReadFactor(bandDatasetList[index], "BrightnessTemperatureFactors");
                        if (temp != null)
                        {
                            factor[0] = temp[0];
                            factor[1] = temp[1];
                        }
                    }

                    Band band = latBands[0];
                    rasterBands.Add(band);
                }
                else
                {
                    Band[] latBands = bandDatasetList[index].GetBands("Radiance");
                    bandDatasetList[index].GetBands("RadianceFactors")?.FirstOrDefault()
                    ?.ReadRaster(0, 0, 1, 2, factor, 1, 2, 0, 0);
                    Band band = latBands[0];
                    rasterBands.Add(band);
                }

                Array.Copy(factor, 0, _factors, i * 2, 2);
            }

            return(rasterBands.ToArray());
        }
Example #2
0
        private void TryCreateDefaultArgs(AbstractWarpDataset srcRaster, NPP_PrjSetting prjSettings,
                                          ref SpatialReference dstSpatialRef)
        {
            if (dstSpatialRef == null)
            {
                dstSpatialRef = _srcSpatialRef;
            }
            if (string.IsNullOrWhiteSpace(prjSettings.OutFormat))
            {
                prjSettings.OutFormat = "LDF";
            }
            if (dstSpatialRef.IsGeographic() == 1)
            {
                _srcImgResolution = 0.01F;
            }
            else
            {
                _srcImgResolution = 1000f;
            }

            if (prjSettings.OutResolutionX <= 0 || prjSettings.OutResolutionY <= 0)
            {
                if (dstSpatialRef.IsGeographic() == 1)
                {
                    prjSettings.OutResolutionX = 0.0075F;
                    prjSettings.OutResolutionY = 0.0075F;
                }
                else
                {
                    prjSettings.OutResolutionX = 750F;
                    prjSettings.OutResolutionY = 750F;
                }
            }

            if (prjSettings.OutBandNos == null || prjSettings.OutBandNos.Length == 0)
            {
                _prjBands = PrjBand.NPP_Oribt;
            }
            else
            {
                List <PrjBand> bands    = new List <PrjBand>();
                PrjBand[]      defbands = PrjBand.NPP_Oribt;
                foreach (int bandNo in prjSettings.OutBandNos)
                {
                    bands.Add(defbands[bandNo - 1]);
                }

                _prjBands = bands.ToArray();
            }
        }
Example #3
0
        private void DoSession(AbstractWarpDataset srcRaster, AbstractWarpDataset geoRaster,
                               SpatialReference dstSpatialRef, NPP_PrjSetting prjSettings, Action <int, string> progressCallback)
        {
            if (_curSession == null || _curSession != srcRaster || _isBeginSession)
            {
                progressCallback?.Invoke(_readyProgress++, "读取及预处理经纬度数据集");
                ReadyLocations(_geoDataProvider, SpatialReferenceFactory.CreateSpatialReference(4326), dstSpatialRef,
                               out _srcLocationSize, out _xs, out _ys, out _maxPrjEnvelope, progressCallback);
                progressCallback?.Invoke(_readyProgress++, "准备其他参数");
                if (prjSettings.IsRadRef || prjSettings.IsRad)
                {
                    //ReadyRadiationArgs(srcRaster);
                }

                if (prjSettings.IsSolarZenith && prjSettings.IsRadRef)
                {
                    _solarZenithCacheFilename = GetSolarZenithCacheFilename(geoRaster.fileName); //太阳天顶角数据
                    if (!File.Exists(_solarZenithCacheFilename))
                    {
                        ReadySolarZenithArgsToFile(geoRaster);
                    }
                    else
                    {
                        _solarZenithCacheRaster = WarpDataset.Open(_solarZenithCacheFilename);
                    }

                    if (prjSettings.IsSensorZenith)
                    {
                        ReadySensorZenith(geoRaster);
                    }
                }

                _rasterDataBands = TryCreateRasterDataBands(srcRaster, prjSettings, progressCallback);
                _isBeginSession  = false;
            }
        }
Example #4
0
        private void ReadyArgs(AbstractWarpDataset srcRaster, FilePrjSettings prjSettings,
                               SpatialReference dstSpatialRef, Action <int, string> progressCallback)
        {
            if (srcRaster == null)
            {
                throw new ArgumentNullException("srcRaster");
            }
            if (prjSettings == null)
            {
                throw new ArgumentNullException("prjSettings");
            }
            _readyProgress    = 0;
            base._prjSettings = prjSettings;
            _prjSettings      = prjSettings as NPP_PrjSetting;
            _geoDataProvider  = iBandGeoDataset == null ? mBandGeoDataset : iBandGeoDataset;
            if (_geoDataProvider == null)
            {
                throw new ArgumentNullException("NPP数据投影,未加载到正确的GEO数据集");
            }

            _dstSpatialRef = dstSpatialRef;
            MemoryHelper.MemoryNeed(200, 1536); //剩余200MB,已使用1.2GB
            progressCallback?.Invoke(_readyProgress++, "准备相关参数");

            TryCreateDefaultArgs(srcRaster, _prjSettings, ref dstSpatialRef);
            //这里去除的是读取轨道数据时候的左右像元个数。
            _left  = 8;
            _right = 8;
            TrySetLeftRightInvalidPixel(_prjSettings.ExtArgs);
            DoSession(srcRaster, _geoDataProvider, dstSpatialRef, _prjSettings, progressCallback);
            if (prjSettings.OutEnvelope == null || prjSettings.OutEnvelope == PrjEnvelope.Empty)
            {
                prjSettings.OutEnvelope = _maxPrjEnvelope;
                _orbitBlock             = new Block
                {
                    xBegin = 0, yBegin = 0, xEnd = srcRaster.Width - 1, yEnd = srcRaster.Height - 1
                };
            }
            else
            {
                GetEnvelope(_xs, _ys, srcRaster.Width, srcRaster.Height, _prjSettings.OutEnvelope, out _orbitBlock);
                if (_orbitBlock == null || _orbitBlock.Width <= 0 || _orbitBlock.Height <= 0)
                {
                    throw new Exception("数据不在目标区间内");
                }
                float invalidPresent = (_orbitBlock.Width * _orbitBlock.Height * 1.0F) /
                                       (srcRaster.Width * srcRaster.Height);
                if (invalidPresent < 0.0001f)
                {
                    throw new Exception("数据占轨道数据比例太小,有效率" + invalidPresent * 100 + "%");
                }
                if (invalidPresent > 0.60)
                {
                    _orbitBlock = new Block
                    {
                        xBegin = 0, yBegin = 0, xEnd = srcRaster.Width - 1, yEnd = srcRaster.Height - 1
                    }
                }
                ;
            }

            //if (dstSpatialRef.Type == SpatialReferenceType.GeographicCS && (prjSettings.OutEnvelope.MaxY > 80 || prjSettings.OutEnvelope.MaxY < -80))
            //    throw new Exception(string.Format("高纬度数据,不适合投影为等经纬度数据[{0}]", _maxPrjEnvelope));
            _dstSpatialRef = dstSpatialRef;
            _dstEnvelope   = _prjSettings.OutEnvelope;
            if (!_dstEnvelope.IntersectsWith(_maxPrjEnvelope))
            {
                throw new Exception("数据不在目标区间内");
            }
            _outResolutionX = _prjSettings.OutResolutionX;
            _outResolutionY = _prjSettings.OutResolutionY;
            _outFormat      = _prjSettings.OutFormat;
            _outfilename    = _prjSettings.OutPathAndFileName;
            _dstProj4       = _dstSpatialRef.ExportToProj4();
            _dstBandCount   = _prjBands.Length;
            _dstSize        = _prjSettings.OutSize;
            _isRadRef       = _prjSettings.IsRadRef;
            _isSolarZenith  = _prjSettings.IsSolarZenith;
            _isSensorZenith = _prjSettings.IsSensorZenith;
            _isRad          = _prjSettings.IsRad;
        }