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