private static FY3_MERSI_PrjSettings ArgsCheck(IRasterDataProvider srcRaster, FilePrjSettings prjSettings) { if (srcRaster == null) { throw new ArgumentNullException("srcRaster"); } if (prjSettings == null) { throw new ArgumentNullException("prjSettings"); } FY3_MERSI_PrjSettings fy3prjSettings = prjSettings as FY3_MERSI_PrjSettings; return(fy3prjSettings); }
private void TryCreate0250DefaultArgs(IRasterDataProvider srcRaster, FY3_MERSI_PrjSettings prjSettings, ref ISpatialReference dstSpatialRef) { if (prjSettings.SecondaryOrbitRaster == null && prjSettings.IsSolarZenith) { prjSettings.IsSolarZenith = false; //throw new Exception("无法获取相应1KM轨道数据文件,无法做太阳天顶角订正"); } if (dstSpatialRef == null) { dstSpatialRef = _srcSpatialRef; } if (string.IsNullOrWhiteSpace(prjSettings.OutFormat)) { prjSettings.OutFormat = "LDF"; } if (dstSpatialRef.ProjectionCoordSystem == null) { _srcImgResolution = 0.0025f; } else { _srcImgResolution = 250f; } if (prjSettings.OutResolutionX == 0 || prjSettings.OutResolutionY == 0) { if (dstSpatialRef.ProjectionCoordSystem == null) { prjSettings.OutResolutionX = 0.0025F;//地理坐标系 prjSettings.OutResolutionY = 0.0025F; } else { prjSettings.OutResolutionX = 250F;//投影坐标系 prjSettings.OutResolutionY = 250F; } } if (prjSettings.OutBandNos == null || prjSettings.OutBandNos.Length == 0) { _prjBands = OrbitBandDefCollection.MERSI_0250_OrbitDefCollecges(); } else { List <PrjBand> bands = new List <PrjBand>(); PrjBand[] defbands = OrbitBandDefCollection.MERSI_0250_OrbitDefCollecges(); foreach (int bandNo in prjSettings.OutBandNos) { bands.Add(defbands[bandNo - 1]); } _prjBands = bands.ToArray(); } }
//3、4、2 private string PrjMERSI_1KM_L1(IRasterDataProvider srcRaster, ISpatialReference projRef) { try { List <BandMap> bandmapList = new List <BandMap>(); //bandmapList.Add(new BandMap() { DatasetName = "EV_250_Aggr.1KM_RefSB", File = srcRaster, BandIndex = 0 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_Aggr.1KM_RefSB", File = srcRaster, BandIndex = 1 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_Aggr.1KM_RefSB", File = srcRaster, BandIndex = 2 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_Aggr.1KM_RefSB", File = srcRaster, BandIndex = 3 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_250_Aggr.1KM_Emissive", File = srcRaster, BandIndex = 0 });//5 //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 0 });//6 //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 1 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 2 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 3 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 4 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 5 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 6 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 7 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 8 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 9 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 10 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 11 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 12 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 13 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_1KM_RefSB", File = srcRaster, BandIndex = 14 }); IFileProjector projTor = FileProjector.GetFileProjectByName("FY3_MERSI"); FY3_MERSI_PrjSettings prjSetting = new FY3_MERSI_PrjSettings(); prjSetting.OutPathAndFileName = GetOutPutFile(srcRaster.fileName, projRef); prjSetting.BandMapTable = bandmapList; ISpatialReference dstSpatialRef = projRef; projTor.Project(srcRaster, prjSetting, dstSpatialRef, _progress); return(prjSetting.OutPathAndFileName); } finally { } }
private void TryCreateDefaultArgs(IRasterDataProvider srcRaster, FY3_MERSI_PrjSettings prjSettings, ref ISpatialReference dstSpatialRef) { if (dstSpatialRef == null) { dstSpatialRef = _srcSpatialRef; } if (string.IsNullOrWhiteSpace(prjSettings.OutFormat)) { prjSettings.OutFormat = "LDF"; } if (dstSpatialRef.ProjectionCoordSystem == null) { _srcImgResolution = 0.01F; } else { _srcImgResolution = 1000F; } if (prjSettings.OutResolutionX == 0 || prjSettings.OutResolutionY == 0) { if (dstSpatialRef.ProjectionCoordSystem == null) { prjSettings.OutResolutionX = 0.01F; prjSettings.OutResolutionY = 0.01F; } else { prjSettings.OutResolutionX = 1000F; prjSettings.OutResolutionY = 1000F; } } if (prjSettings.OutBandNos == null || prjSettings.OutBandNos.Length == 0) { _prjBands = OrbitBandDefCollection.MERSI_1000_OrbitDefCollecges(); } else { List <PrjBand> bands = new List <PrjBand>(); PrjBand[] defbands = OrbitBandDefCollection.MERSI_1000_OrbitDefCollecges(); foreach (int bandNo in prjSettings.OutBandNos) { bands.Add(defbands[bandNo - 1]); } _prjBands = bands.ToArray(); } }
private string PrjMERSI_QKM_L1(IRasterDataProvider fileName, ISpatialReference projRef) { IRasterDataProvider srcRaster = fileName; IRasterDataProvider locationRaster = null; try { List <BandMap> bandmapList = new List <BandMap>(); //bandmapList.Add(new BandMap() { DatasetName = "EV_250_RefSB_b1", File = srcRaster, BandIndex = 0 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_RefSB_b2", File = srcRaster, BandIndex = 0 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_RefSB_b3", File = srcRaster, BandIndex = 0 }); bandmapList.Add(new BandMap() { DatasetName = "EV_250_RefSB_b4", File = srcRaster, BandIndex = 0 }); //bandmapList.Add(new BandMap() { DatasetName = "EV_250_Emissive", File = srcRaster, BandIndex = 0 }); locationRaster = TryFindMERSI_1KM_L1FromQKM(fileName); IFileProjector projTor = FileProjector.GetFileProjectByName("FY3_MERSI"); FY3_MERSI_PrjSettings prjSetting = new FY3_MERSI_PrjSettings(); prjSetting.BandMapTable = bandmapList; prjSetting.SecondaryOrbitRaster = locationRaster; prjSetting.OutPathAndFileName = GetOutPutFile(fileName.fileName, projRef); ISpatialReference dstSpatialRef = projRef; projTor.Project(srcRaster, prjSetting, dstSpatialRef, _progress); return(prjSetting.OutPathAndFileName); } finally { if (locationRaster != null) { locationRaster.Dispose(); } } }
private void ReadyLocations(IRasterDataProvider srcRaster, ISpatialReference dstSpatialRef, FY3_MERSI_PrjSettings fy3prjSettings, out Size locationSize, out PrjEnvelope maxPrjEnvelope, Action <int, string> progressCallback) { if (progressCallback != null) { progressCallback(_readyProgress++, "读取经纬度数据集"); } Stopwatch sw = new Stopwatch(); sw.Start(); double[] xs = null; double[] ys = null; //Size locationSize; ReadLocations(srcRaster, out xs, out ys, out locationSize); TryResetLonlatForLeftRightInvalid(xs, ys, locationSize); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + "ms....1"); if (progressCallback != null) { progressCallback(_readyProgress++, "预处理经纬度数据集"); } sw.Restart(); _rasterProjector.ComputeDstEnvelope(_srcSpatialRef, xs, ys, locationSize, dstSpatialRef, out maxPrjEnvelope, progressCallback); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds + "ms....2"); _xs = xs; _ys = ys; }
private IRasterBand[] TryCreateRasterDataBands(IRasterDataProvider srcRaster, FY3_MERSI_PrjSettings fy3prjSettings, Action <int, string> progressCallback) { IBandProvider srcbandpro = srcRaster.BandProvider as IBandProvider; List <IRasterBand> rasterBands = new List <IRasterBand>(); for (int i = 0; i < _prjBands.Length; i++) { if (progressCallback != null) { progressCallback(_readyProgress++, "准备第" + i + "个输入数据通道"); } PrjBand bandMap = _prjBands[i]; IRasterBand[] latBands = srcbandpro.GetBands(bandMap.DataSetName); IRasterBand band = latBands[bandMap.DataSetIndex]; rasterBands.Add(band); } return(rasterBands.ToArray()); }
private void DoSession(IRasterDataProvider srcRaster, IRasterDataProvider locationRaster, ISpatialReference dstSpatialRef, FY3_MERSI_PrjSettings prjSettings, Action <int, string> progressCallback) { if (_curSession == null || _curSession != srcRaster || _isBeginSession) { Size srcImgSize = new Size(srcRaster.Width, srcRaster.Height); ReadyLocations(srcRaster, dstSpatialRef, prjSettings, out _srcLocationSize, out _maxPrjEnvelope, progressCallback); if (progressCallback != null) { progressCallback(4, "准备其他参数"); } if (prjSettings.IsRadiation) { ReadyRadiationArgs(srcRaster); } if (prjSettings.IsSolarZenith) //&& prjSettings.IsRadiation { _szDataFilename = GetSolarZenithCacheFilename(locationRaster.fileName); if (!File.Exists(_szDataFilename)) { ReadySolarZenithArgsToFile(locationRaster); } else { _solarZenithCacheRaster = GeoDataDriver.Open(_szDataFilename) as IRasterDataProvider; } if (prjSettings.IsSensorZenith) { ReadySensorZenith(locationRaster); } } _rasterDataBands = TryCreateRasterDataBands(srcRaster, prjSettings, progressCallback);//待投影的波段 _isBeginSession = false; } }
private void ReadyArgs(IRasterDataProvider srcRaster, FilePrjSettings prjSettings, ISpatialReference dstSpatialRef, Action <int, string> progressCallback) { if (srcRaster.DataIdentify != null) { string satellite = srcRaster.DataIdentify.Satellite; //if (satellite == "FY3A")//FY3A MERSI250米数据已经经过处理,不需要再执行去条带操作 //{ // _sacnLineWidth = 0; //} } float resolutionScale = 1f; _readyProgress = 0; if (progressCallback != null) { progressCallback(_readyProgress++, "准备相关参数"); } _prjSettings = ArgsCheck(srcRaster, prjSettings); CheckIs0250(srcRaster); _dstSpatialRef = dstSpatialRef; switch (_dataType) { case "1KM": //整轨投影时候去除左右锯齿,分块投影不需要 _left = 10; _right = 10; if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) //整轨投影 { MemoryHelper.MemoryNeed(500, 1536); } else { MemoryHelper.MemoryNeed(400, 1536); //剩余900MB,已使用1.2GB } TryCreateDefaultArgs(srcRaster, _prjSettings, ref _dstSpatialRef); DoSession(srcRaster, srcRaster, _dstSpatialRef, _prjSettings, progressCallback); _angleDataProvider = srcRaster; break; case "QKM": resolutionScale = 4f; _left = 20; _right = 20; if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) { MemoryHelper.MemoryNeed(800, 1280); //整幅投影对内存做限制,系统剩余内存不低于1.5GB,应用程序已使用内存不超过600MB } else { MemoryHelper.MemoryNeed(600, 1280); //剩余900MB,已使用1.2GB } TryCreate0250DefaultArgs(srcRaster, _prjSettings, ref _dstSpatialRef); DoSession(srcRaster, _prjSettings.SecondaryOrbitRaster, _dstSpatialRef, _prjSettings, progressCallback); _angleDataProvider = _prjSettings.SecondaryOrbitRaster; break; default: break; } TrySetLeftRightInvalidPixel(_prjSettings.ExtArgs); if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) { _prjSettings.OutEnvelope = _maxPrjEnvelope; _orbitBlock = new Block { xOffset = 0, yBegin = 0, xEnd = _srcLocationSize.Width - 1, yEnd = _srcLocationSize.Height - 1 }; } else { GetEnvelope(_xs, _ys, _srcLocationSize.Width, _srcLocationSize.Height, _prjSettings.OutEnvelope, out _orbitBlock); if (_orbitBlock == null || _orbitBlock.Width <= 0 || _orbitBlock.Height <= 0) { throw new Exception("数据不在目标区间内"); } float invalidPresent = (_orbitBlock.Width * _orbitBlock.Height * resolutionScale) / (_srcLocationSize.Width * _srcLocationSize.Height); if (invalidPresent < 0.0001f) { throw new Exception("数据占轨道数据比例太小,有效率" + invalidPresent * 100 + "%"); } if (invalidPresent > 0.60) { _orbitBlock = new Block { xOffset = 0, yBegin = 0, xEnd = _srcLocationSize.Width - 1, yEnd = _srcLocationSize.Height - 1 } } ; } //地理坐标投影,下面简单的对地理坐标投影的范围作了限制,不大严谨,仅适合目前的状况。 if (_dstSpatialRef.ProjectionCoordSystem == null && (prjSettings.OutEnvelope.MaxY > 80 || prjSettings.OutEnvelope.MaxY < -80)) { throw new Exception(string.Format("高纬度数据,不适合投影为等经纬度数据[{0}]", _maxPrjEnvelope)); } //以下参数用于投影 _dstEnvelope = _prjSettings.OutEnvelope; if (!_dstEnvelope.IntersectsWith(_maxPrjEnvelope)) { throw new Exception("数据不在目标区间内"); } _outResolutionX = _prjSettings.OutResolutionX; _outResolutionY = _prjSettings.OutResolutionY; _outFormat = _prjSettings.OutFormat; _outfilename = _prjSettings.OutPathAndFileName; _dstProj4 = _dstSpatialRef.ToProj4String(); _dstBandCount = _prjBands.Length; _dstSize = _prjSettings.OutSize; _isRadiation = _prjSettings.IsRadiation; _isSolarZenith = _prjSettings.IsSolarZenith; _isSensorZenith = _prjSettings.IsSensorZenith; }
/// <summary> /// 这里修改为获取经纬度IRasterBand,而不是存储到_xs,_ys中 /// 因为对于MERSI250米分辨率的经纬度数据集数据量太大了,无法一次放入内存中。 /// </summary> /// <param name="geoRaster"></param> /// <param name="dstSpatialRef"></param> /// <param name="fy3prjSettings"></param> /// <param name="srcLocationSize"></param> /// <param name="maxPrjEnvelope"></param> /// <param name="progressCallback"></param> private void ReadyLocations(IRasterDataProvider geoRaster, ISpatialReference dstSpatialRef, FY3_MERSI_PrjSettings fy3prjSettings, out Size srcLocationSize, out PrjEnvelope maxPrjEnvelope, Action <int, string> progressCallback) { if (progressCallback != null) { progressCallback(_readyProgress++, "读取经纬度数据集"); } double[] xs = null; double[] ys = null; Size geoSize; Size maxGeoSize = new Size(1024, 1024); //采样读取后的最大Size ReadLocations(geoRaster, out _longitudeBand, out _latitudeBand); //GetGeoBand srcLocationSize = new Size(_longitudeBand.Width, _longitudeBand.Height); ReadLocations(_longitudeBand, _latitudeBand, maxGeoSize, out xs, out ys, out geoSize); TryResetLonlatForLeftRightInvalid(xs, ys, geoSize, srcLocationSize); _rasterProjector.ComputeDstEnvelope(_srcSpatialRef, xs, ys, geoSize, dstSpatialRef, out maxPrjEnvelope, progressCallback); }
private void ReadyArgs(IRasterDataProvider srcRaster, FilePrjSettings prjSettings, ISpatialReference dstSpatialRef, Action <int, string> progressCallback) { float resolutionScale = 1f; _readyProgress = 0; if (progressCallback != null) { progressCallback(_readyProgress++, "准备相关参数"); } _prjSettings = ArgsCheck(srcRaster, prjSettings); _geoDataProvider = _prjSettings.GeoFile; CheckIs0250(srcRaster); _dstSpatialRef = dstSpatialRef; switch (_dataType) { case "1KM": //整轨投影时候去除左右锯齿,分块投影不需要 _left = 10; _right = 10; if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) //整轨投影时做限制 { MemoryHelper.MemoryNeed(500, 1536); } else { MemoryHelper.MemoryNeed(400, 1536); //剩余900MB,已使用1.2GB } //_angleDataProvider = srcRaster; TryCreateDefaultArgs(srcRaster, _prjSettings, ref _dstSpatialRef); TrySetLeftRightInvalidPixel(_prjSettings.ExtArgs); DoSession(srcRaster, _geoDataProvider, _dstSpatialRef, _prjSettings, progressCallback); break; case "QKM": resolutionScale = 4f; _left = 20; _right = 20; if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) { MemoryHelper.MemoryNeed(800, 1280); //整幅投影对内存做限制,系统剩余内存不低于A参数MB,应用程序已使用内存不超过B参数MB } else { MemoryHelper.MemoryNeed(600, 1280); //剩余900MB,最大已使用1.2GB } //_angleDataProvider = _prjSettings.SecondaryOrbitRaster; TryCreate0250DefaultArgs(srcRaster, _prjSettings, ref _dstSpatialRef); TrySetLeftRightInvalidPixel(_prjSettings.ExtArgs); DoSession(srcRaster, _geoDataProvider, _dstSpatialRef, _prjSettings, progressCallback); break; default: break; } if (_prjSettings.OutEnvelope == null || _prjSettings.OutEnvelope == PrjEnvelope.Empty) { _prjSettings.OutEnvelope = _maxPrjEnvelope; _orbitBlock = new Block { xOffset = 0, yBegin = 0, xEnd = _srcLocationSize.Width - 1, yEnd = _srcLocationSize.Height - 1 }; } else { if (_xs != null && _ys != null) { GetEnvelope(_xs, _ys, _srcLocationSize.Width, _srcLocationSize.Height, _prjSettings.OutEnvelope, out _orbitBlock); } else { int bC = 8; int tmpWidth = 0; int tmpHeight = 0; double[] tmpxs = null; double[] tmpys = null; //8024,8000 tmpWidth = _srcLocationSize.Width / bC; tmpHeight = _srcLocationSize.Height / bC; tmpxs = ReadSampleDatas(_longitudeBand, 0, 0, tmpWidth, tmpHeight); tmpys = ReadSampleDatas(_latitudeBand, 0, 0, tmpWidth, tmpHeight); _rasterProjector.Transform(SpatialReference.GetDefault(), tmpxs, tmpys, _dstSpatialRef); //计算偏移 GetEnvelope(tmpxs, tmpys, tmpWidth, tmpHeight, _prjSettings.OutEnvelope, out _orbitBlock); _orbitBlock = _orbitBlock.Zoom(bC, bC); } if (_orbitBlock == null || _orbitBlock.Width <= 0 || _orbitBlock.Height <= 0) { throw new Exception("数据不在目标区间内"); } float invalidPresent = (_orbitBlock.Width * _orbitBlock.Height * resolutionScale) / (_srcLocationSize.Width * _srcLocationSize.Height); if (invalidPresent < 0.0001f) { throw new Exception("数据占轨道数据比例太小,有效率" + invalidPresent * 100 + "%"); } if (invalidPresent > 0.60) { _orbitBlock = new Block { xOffset = 0, yBegin = 0, xEnd = _srcLocationSize.Width - 1, yEnd = _srcLocationSize.Height - 1 } } ; } //地理坐标投影,下面简单的对地理坐标投影的范围作了限制,不大严谨,仅适合目前的状况。 if (_dstSpatialRef.ProjectionCoordSystem == null && (prjSettings.OutEnvelope.MaxY > 80 || prjSettings.OutEnvelope.MaxY < -80)) { throw new Exception(string.Format("高纬度数据,不适合投影为等经纬度数据[{0}]", _maxPrjEnvelope)); } //以下参数用于投影 _dstEnvelope = _prjSettings.OutEnvelope; if (!_dstEnvelope.IntersectsWith(_maxPrjEnvelope)) { throw new Exception("数据不在目标区间内"); } _outResolutionX = _prjSettings.OutResolutionX; _outResolutionY = _prjSettings.OutResolutionY; _outFormat = _prjSettings.OutFormat; _outfilename = _prjSettings.OutPathAndFileName; _dstProj4 = _dstSpatialRef.ToProj4String(); _dstBandCount = _prjBands.Length; _dstSize = _prjSettings.OutSize; _isRadiation = _prjSettings.IsRadiation; _isSolarZenith = _prjSettings.IsSolarZenith; _isSensorZenith = _prjSettings.IsSensorZenith; }