private IExtractResult TFREAlgorithm(Action <int, string> progressTracker) { IRasterOperator <Int16> roper = new RasterOperator <Int16>(); IInterestedRaster <Int16> timeResult = null; string[] files = GetStringArray("SelectedPrimaryFiles"); if (files == null || files.Length == 0) { return(null); } RasterIdentify identify = new RasterIdentify(files); identify.SubProductIdentify = _subProductDef.Identify; timeResult = roper.Times(files, identify, progressTracker, (dstValue, srcValue) => { return((Int16)(dstValue + srcValue)); }); if (timeResult == null) { return(null); } timeResult.Dispose(); string workFilename = identify.ToWksFullFileName(".dat"); File.Copy(timeResult.FileName, workFilename, true); return(new FileExtractResult("FLD", workFilename, true)); }
private IExtractResult TFRQAlgorithm(Action <int, string> progressTracker) { IRasterOperator <Int16> roper = new RasterOperator <Int16>(); IInterestedRaster <Int16> timeResult = null; string[] files = GetStringArray("SelectedPrimaryFiles"); if (files == null || files.Length == 0) { return(null); } RasterIdentify identify = new RasterIdentify(files); identify.SubProductIdentify = _subProductDef.Identify; int maxNum = 0; timeResult = roper.Times(files, identify, progressTracker, (dstValue, srcValue) => { dstValue += srcValue; if (maxNum < dstValue) { maxNum = dstValue; } return(dstValue); }); if (timeResult == null || maxNum == 0) { return(null); } double zoom = (double)_argumentProvider.GetArg("Zoom"); return(CalcTreq(timeResult, identify, maxNum, zoom)); }
//public override void SetExtHeader(IExtHeaderSetter setter, object header) //{ // if (setter == null || header == null) // return; // setter.SetExtHeader<NDVISetValue>((NDVISetValue)header); //} private IPixelFeatureMapper <float> ComputeNDVIResult(IRasterDataProvider orbitDataProvider, IPixelIndexMapper result, int visiBandNo, int niBandNo) { //生成判识结果文件 IRasterDataProvider batDataProvider = null; IInterestedRaster <UInt16> iir = null; try { RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "BAG"; id.SubProductIdentify = "DBLV"; id.Sensor = orbitDataProvider.DataIdentify.Sensor; id.Satellite = orbitDataProvider.DataIdentify.Satellite; id.OrbitDateTime = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0, 0)); id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <UInt16>(id, new Size(orbitDataProvider.Width, orbitDataProvider.Height), orbitDataProvider.CoordEnvelope.Clone()); int[] idxs = result.Indexes.ToArray(); iir.Put(idxs, 1); batDataProvider = iir.HostDataProvider; //内存结果 IPixelFeatureMapper <float> memresult = new MemPixelFeatureMapper <float>("NDVI", 1000, new Size(batDataProvider.Width, batDataProvider.Height), batDataProvider.CoordEnvelope, batDataProvider.SpatialRef); //虚拟文件 //转换IRasterDataProvider!!!!! IVirtualRasterDataProvider vrd = new VirtualRasterDataProvider(new IRasterDataProvider[] { batDataProvider, orbitDataProvider }); ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); visitor.VisitPixel(new int[] { 1, visiBandNo + 1, niBandNo + 1 }, (index, values) => { if (values[0] == 0) { memresult.Put(index, -9999); } else { memresult.Put(index, GetOnePixelNDVI(values[1], values[2])); } }); iir.Dispose(); return(memresult); } finally { if (batDataProvider != null) { batDataProvider.Dispose(); } if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } } }
/// <summary> /// 差值运算 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="aoi">感兴趣区域</param> /// <param name="fristFileName">被减数文件</param> /// <param name="secondFileName">减数文件</param> /// <param name="rasterIdentify">产品标识</param> /// <returns></returns> public static IExtractResult ChaZhi <T>(int[] aoi, string fristFileName, string secondFileName, RasterIdentify rasterIdentify) { IRasterOperator <float> rasterOperator = new RasterOperator <float>(); IInterestedRaster <float> resultRaster = rasterOperator.Compare(aoi, fristFileName, secondFileName, (beiJianShu, jianShu) => { return(beiJianShu - jianShu); }, rasterIdentify ); return(resultRaster); }
public IExtractResult CycleTimeStatAnalysisByPixel <T>(string productName, string productIdentify, string extInfos, Func <int, T, T, T> function) { IRasterOperator <T> roper = new RasterOperator <T>(); IInterestedRaster <T> cycleIimeResult = null; string[] files = GetStringArray("SelectedPrimaryFiles"); if (files == null || files.Length == 0) { return(null); } if (string.IsNullOrEmpty(extInfos)) { extInfos = GetStringArugment("extinfo"); } DataIdentify di = GetDataIdentify(); string outFileIdentify = GetStringArugment("OutFileIdentify"); cycleIimeResult = roper.CycleTimes(files, CreatRasterIndetifyId(files, productIdentify, outFileIdentify, di, null, extInfos), function); if (cycleIimeResult == null) { return(null); } object obj = _argumentProvider.GetArg("ThemeGraphyGenerator"); if (obj == null) { return(cycleIimeResult); } IThemeGraphGenerator tgg = obj as IThemeGraphGenerator; if (tgg == null) { return(cycleIimeResult); } cycleIimeResult.Dispose(); string aoiTemplateName = string.Empty; Dictionary <string, int[]> aoi = null; GetAOI(out aoiTemplateName, out aoi); string templatName = GetStringArugment("ThemeGraphTemplateName"); string colorTabelName = GetColorTableName("colortablename"); string resultFilename = tgg.Generate(cycleIimeResult.FileName, templatName, MasicAOI(aoi, ref extInfos), extInfos, outFileIdentify, colorTabelName); if (string.IsNullOrEmpty(resultFilename)) { return(cycleIimeResult); } return(new FileExtractResult(outFileIdentify, resultFilename)); }
public static IExtractResult ComputeMinFile(string[] fnames, RasterIdentify rasterIdentify) { IRasterOperator <float> rasterOperator = new RasterOperator <float>(); IInterestedRaster <float> resultRaster = rasterOperator.Times(fnames, rasterIdentify, (value, valuei) => { if (valuei < value) { value = valuei; } return(value); } ); return(resultRaster); }
private string CombineCloudAndWater(string cloudFile, string waterFile) { IInterestedRaster <Int16> iir = null; IRasterDataProvider waterPrd = null; IRasterDataProvider cloudPrd = null; try { RasterIdentify id = new RasterIdentify(waterFile); waterPrd = GeoDataDriver.Open(waterFile) as IRasterDataProvider; cloudPrd = GeoDataDriver.Open(cloudFile) as IRasterDataProvider; iir = new InterestedRaster <Int16>(id, new Size(waterPrd.Width, waterPrd.Height), waterPrd.CoordEnvelope.Clone()); //虚拟文件 //转换IRasterDataProvider!!!!! IVirtualRasterDataProvider vrd = new VirtualRasterDataProvider(new IRasterDataProvider[] { waterPrd, cloudPrd }); ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); visitor.VisitPixel(new int[] { 1, 2 }, (index, values) => { if (values[0] == 1) { iir.Put(index, 1); } else if (values[1] == 1) { iir.Put(index, -9999); } }); return(iir.FileName); } finally { if (iir != null) { iir.Dispose(); } if (waterPrd != null) { waterPrd.Dispose(); } if (cloudPrd != null) { cloudPrd.Dispose(); } } }
private IExtractResult CalcTreq(IInterestedRaster <Int16> timeResult, RasterIdentify id, int maxNum, double zoom) { IPixelFeatureMapper <Int16> memresult = new MemPixelFeatureMapper <Int16>("TFRQ", 1000, timeResult.Size, timeResult.CoordEnvelope, timeResult.SpatialRef); ArgumentProvider ap = new ArgumentProvider(timeResult.HostDataProvider, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] == 0) { memresult.Put(index, 0); } else { memresult.Put(index, (Int16)(Math.Round(values[0] / (float)maxNum * zoom))); } }); timeResult.Dispose(); return(memresult); }
/// <summary> /// 当期区域像素点频次统计(基于判识二值数据进行计算) /// </summary> /// <param name="productIdentify">产品标识</param> /// <param name="subProIdentify">子产品标识</param> /// <param name="invaild">无效值</param> public static void TimesStatAnalysisByPixel(string productIdentify, string subProIdentify, Int16 invaild) { IRasterOperator <Int16> roper = new RasterOperator <Int16>(); RasterIdentify identify = GetIdentify(productIdentify, subProIdentify); IInterestedRaster <Int16> timeResult = null; string[] files = GetFiles(); //频次统计 timeResult = roper.Times(files, identify, (dstValue, srcValue) => { if (srcValue != invaild) { return((Int16)(dstValue++)); } else { return(dstValue); } }); if (timeResult == null) { return; } }
private IPixelFeatureMapper <float> CreatPixelCoverRate(IPixelFeatureMapper <float> ndviResult) { if (ndviResult == null) { return(null); } //生成NDVI结果文件 IRasterDataProvider ndviDataProvider = null; IInterestedRaster <float> iir = null; try { RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "BAG"; id.SubProductIdentify = "BPCD"; id.Sensor = _argumentProvider.DataProvider.DataIdentify.Sensor; id.Satellite = _argumentProvider.DataProvider.DataIdentify.Satellite; id.OrbitDateTime = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0, 0)); id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <float>(id, new Size(_argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height), _argumentProvider.DataProvider.CoordEnvelope.Clone()); iir.Put(ndviResult); ndviDataProvider = iir.HostDataProvider; double dst; dst = MaxNDVI - MinNDVI; //判断是否使用端元值计算 NDVISettingItem[] settings = _argumentProvider.GetArg("NDVISetting") as NDVISettingItem[]; if (settings != null) { ResetArgNDVIMaxMin(settings, ref MinNDVI, ref dst); } IPixelFeatureMapper <float> memresult = new MemPixelFeatureMapper <float>("BPCD", 1000, new Size(ndviDataProvider.Width, ndviDataProvider.Height), ndviDataProvider.CoordEnvelope, ndviDataProvider.SpatialRef); ArgumentProvider ap = new ArgumentProvider(ndviDataProvider, null); RasterPixelsVisitor <float> visitor = new RasterPixelsVisitor <float>(ap); visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] == -9999f) { memresult.Put(index, -9999); } else if (dst == 0) { memresult.Put(index, -9999); } else { memresult.Put(index, (float)((values[0] - MinNDVI) / dst)); } }); iir.Dispose(); return(memresult); } finally { if (ndviDataProvider != null) { ndviDataProvider.Dispose(); } if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } } }
public static bool DoElevationCorrections(TVDIUCArgs ucArgs, ref string error) { if (string.IsNullOrEmpty(ucArgs.LSTFile) || string.IsNullOrEmpty(ucArgs.DEMFile) || ucArgs.TVDIParas == null || ucArgs.TVDIParas.LstFile == null) { error = "陆表高温高程订正所需数据或参数设置不全."; return(false); } Dictionary <string, FilePrdMap> filePrdMap = new Dictionary <string, FilePrdMap>(); filePrdMap.Add("LSTFile", new FilePrdMap(ucArgs.LSTFile, ucArgs.TVDIParas.LstFile.Zoom, new VaildPra(ucArgs.TVDIParas.LstFile.Min, ucArgs.TVDIParas.LstFile.Max), new int[] { ucArgs.TVDIParas.LstFile.Band })); filePrdMap.Add("DemFile", new FilePrdMap(ucArgs.DEMFile, 1, new VaildPra(float.MinValue, float.MaxValue), new int[] { 1 })); ITryCreateVirtualPrd tryVPrd = new TryCreateVirtualPrdByMultiFile(); IVirtualRasterDataProvider vrd = null; IInterestedRaster <float> iir = null; try { vrd = tryVPrd.CreateVirtualRasterPRD(ref filePrdMap); if (vrd == null) { throw new Exception("数据间无相交部分,无法创建虚拟数据提供者!"); } ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <float> rpVisitor = new RasterPixelsVisitor <float>(ap); IPixelFeatureMapper <float> _result = new MemPixelFeatureMapper <float>("0LEC", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); ArgumentItem ai = ucArgs.TVDIParas.LstFile; rpVisitor.VisitPixel(new int[] { filePrdMap["LSTFile"].StartBand, filePrdMap["DemFile"].StartBand }, (index, values) => { if (values[1] == -9999) { _result.Put(index, 9999); //海洋 } else if (values[1] == -9000) { _result.Put(index, 9000); //非中国区域陆地 } else if (values[1] >= 6000) { _result.Put(index, 0); //6000之内的LST数据 } else if (values[0] == ucArgs.TVDIParas.LstFile.Cloudy) { _result.Put(index, 9998); //云区 } else if (values[0] == 12) { _result.Put(index, 9997); //无数据区域 } else if (values[0] == 0) { _result.Put(index, 0); } else if (values[1] == 0) { _result.Put(index, 0); } else { _result.Put(index, (float)(Math.Round((values[0] - 273f + 0.006f * values[1]) * ai.Zoom, 0))); } }); iir = new InterestedRaster <float>(CreateRID(ucArgs.LSTFile), new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); iir.Put(_result); ucArgs.ECLstFile = iir.FileName; return(true); } finally { if (iir != null) { iir.Dispose(); } vrd.Dispose(); } }
public override IExtractResult MakeExtProduct(IPixelIndexMapper piexd, Action <int, string> progressTracker) { if (piexd == null) { return(null); } Int16 levelNum = (Int16)_argumentProvider.GetArg("Level"); //生成判识结果文件 IInterestedRaster <Int16> iir = null; RasterIdentify id = new RasterIdentify(_argumentProvider.DataProvider.fileName); id.ThemeIdentify = "CMA"; id.ProductIdentify = "HAZ"; id.SubProductIdentify = _identify; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <Int16>(id, new Size(_argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height), _argumentProvider.DataProvider.CoordEnvelope.Clone()); int[] idxs = piexd.Indexes.ToArray(); iir.Put(idxs, 1); List <RasterMaper> rms = new List <RasterMaper>(); IRasterDataProvider LevelPrd = null; IRasterDataProvider CurrPrd = null; string lastLevelFile = null; string lastLevelTempFile = null; try { CurrPrd = iir.HostDataProvider; RasterMaper CurrRm = new RasterMaper(CurrPrd, new int[] { 1 }); rms.Add(CurrRm); bool lastLevelExist = false; lastLevelFile = id.ToWksFullFileName(".dat"); lastLevelTempFile = Path.Combine(Path.GetDirectoryName(lastLevelFile), Path.GetFileNameWithoutExtension(lastLevelFile) + "temp.dat"); if (File.Exists(lastLevelTempFile)) { LevelPrd = GeoDataDriver.Open(lastLevelTempFile) as IRasterDataProvider; if (LevelPrd != null) { lastLevelExist = true; RasterMaper lastLevelRm = new RasterMaper(LevelPrd, new int[] { 1 }); rms.Add(lastLevelRm); } } using (IRasterDataProvider outRaster = CreateOutRaster(lastLevelFile, rms.ToArray())) { RasterMaper[] fileIns = rms.ToArray(); RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, new int[] { 1 }) }; //创建处理模型 RasterProcessModel <Int16, Int16> rfr = null; rfr = new RasterProcessModel <Int16, Int16>(progressTracker); rfr.SetRaster(fileIns, fileOuts); rfr.RegisterCalcModel(new RasterCalcHandler <Int16, Int16>((rvInVistor, rvOutVistor, aoi) => { int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX; if (rvInVistor[0].RasterBandsData == null || (lastLevelExist && rvInVistor[1].RasterBandsData == null) || rvInVistor[0].RasterBandsData[0] == null || (lastLevelExist && rvInVistor[1].RasterBandsData[0] == null)) { return; } for (int index = 0; index < dataLength; index++) { if (rvInVistor[0].RasterBandsData[0][index] == 1) { rvOutVistor[0].RasterBandsData[0][index] = levelNum; } else if (lastLevelExist && rvInVistor[1].RasterBandsData[0] != null) { rvOutVistor[0].RasterBandsData[0][index] = rvInVistor[1].RasterBandsData[0][index]; } } })); //执行 rfr.Excute(); FileExtractResult res = new FileExtractResult(_identify, lastLevelFile, true); res.SetDispaly(false); return(res); } } finally { iir.Dispose(); if (File.Exists(iir.FileName)) { DelteAboutFile(iir.FileName); } if (LevelPrd != null) { LevelPrd.Dispose(); if (File.Exists(LevelPrd.fileName)) { DelteAboutFile(LevelPrd.fileName); } } if (File.Exists(lastLevelTempFile)) { DelteAboutFile(lastLevelTempFile); } } }
public override IExtractResult Make(Action <int, string> progressTracker) { if (_argumentProvider == null || _argumentProvider.GetArg("AlgorithmName") == null) { return(null); } if (_argumentProvider.GetArg("AlgorithmName").ToString() == "FLLS") { string[] files = GetStringArray("SelectedPrimaryFiles"); if (files == null || files.Count() == 0) { return(null); } foreach (string file in files) { if (!File.Exists(file)) { return(null); } } IRasterOperator <Int16> roper = new RasterOperator <Int16>(); IInterestedRaster <Int16> timeResult = null; DataIdentify di = GetDataIdentify(); timeResult = roper.Times(files, CreatRasterIndetifyId(files, "FLD", "FLLS", di, null, null), (dstValue, srcValue) => { //泛滥水体值==4 if (srcValue == 4) { return(++dstValue); } else { return(dstValue); } }); if (timeResult != null && !string.IsNullOrEmpty(timeResult.FileName) && File.Exists(timeResult.FileName)) { //发生[1,5)次 StatResultItem[] lowResults = null; //发生[5,10)次 StatResultItem[] midResults = null; //发生十次及十次以上 StatResultItem[] highResults = null; IStatAnalysisEngine <Int16> exe = new StatAnalysisEngine <Int16>(); using (IRasterDataProvider prd = timeResult.HostDataProvider) { lowResults = exe.StatArea(prd, "省级行政区+土地利用类型", (srcValue) => { if (srcValue >= 1 && srcValue < 5) { return(true); } else { return(false); } }); if (files.Count() >= 5) { midResults = exe.StatArea(prd, "省级行政区+土地利用类型", (srcValue) => { if (srcValue >= 5 && srcValue < 10) { return(true); } else { return(false); } }); } if (files.Count() >= 10) { highResults = exe.StatArea(prd, "省级行政区+土地利用类型", (srcValue) => { if (srcValue >= 10) { return(true); } else { return(false); } }); } } List <StatResultItem> resultList = new List <StatResultItem>(); if (lowResults != null && lowResults.Count() > 0) { foreach (StatResultItem item in lowResults) { item.Name += "_1-5次"; } resultList.AddRange(lowResults); } if (midResults != null && midResults.Count() > 0) { foreach (StatResultItem item in midResults) { item.Name += "_5-10次"; } resultList.AddRange(midResults); } if (highResults != null && highResults.Count() > 0) { foreach (StatResultItem item in midResults) { item.Name += "_10次以上"; } resultList.AddRange(highResults); } FileExtractResult fileResult = null; if (resultList != null && resultList.Count() > 0) { string filename = StatResultToFile(files, resultList.ToArray(), "FLD", "FLLS", "水情泛滥历时面积", null); fileResult = new FileExtractResult("FLLS", filename); } timeResult.Dispose(); File.Delete(timeResult.FileName); return(fileResult); } return(null); } return(null); }
public override IExtractResult MakeExtProduct(IPixelIndexMapper piexd, Action <int, string> progressTracker) { if (piexd == null) { return(null); } object obj = _argumentProvider.GetArg("isAppCloud"); if (obj == null || !(bool)obj) { return(null); } string cloudFile = GetClmFile(_argumentProvider.DataProvider.fileName); if (string.IsNullOrEmpty(cloudFile) || !File.Exists(cloudFile)) { return(null); } Int16 defCloudy = (Int16)_argumentProvider.GetArg("defCloudy"); //生成判识结果文件 IInterestedRaster <Int16> iir = null; RasterIdentify id = new RasterIdentify(_argumentProvider.DataProvider.fileName); id.ThemeIdentify = "CMA"; id.ProductIdentify = "SNW"; id.SubProductIdentify = _identify; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <Int16>(id, new Size(_argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height), _argumentProvider.DataProvider.CoordEnvelope.Clone()); int[] idxs = piexd.Indexes.ToArray(); iir.Put(idxs, 1); List <RasterMaper> rms = new List <RasterMaper>(); IRasterDataProvider snwPrd = null; IRasterDataProvider cloudPrd = GeoDataDriver.Open(cloudFile) as RasterDataProvider; try { snwPrd = iir.HostDataProvider; RasterMaper lakRm = new RasterMaper(snwPrd, new int[] { 1 }); rms.Add(lakRm); RasterMaper cloudRm = new RasterMaper(cloudPrd, new int[] { GetCloudCHNO() }); rms.Add(cloudRm); string outFileName = GetFileName(new string[] { _argumentProvider.DataProvider.fileName }, _subProductDef.ProductDef.Identify, _subProductDef.Identify, ".dat", null); using (IRasterDataProvider outRaster = CreateOutRaster(outFileName, rms.ToArray())) { RasterMaper[] fileIns = rms.ToArray(); RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, new int[] { 1 }) }; //创建处理模型 RasterProcessModel <Int16, Int16> rfr = null; rfr = new RasterProcessModel <Int16, Int16>(progressTracker); rfr.SetRaster(fileIns, fileOuts); rfr.SetFeatureAOI(_argumentProvider.AOIs); rfr.RegisterCalcModel(new RasterCalcHandler <Int16, Int16>((rvInVistor, rvOutVistor, aoi) => { int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX; if (rvInVistor[0].RasterBandsData == null || rvInVistor[1].RasterBandsData == null || rvInVistor[0].RasterBandsData[0] == null || rvInVistor[1].RasterBandsData[0] == null) { return; } for (int index = 0; index < dataLength; index++) { if (rvInVistor[1].RasterBandsData[0][index] == 1 && rvInVistor[0].RasterBandsData[0][index] == 0) { rvOutVistor[0].RasterBandsData[0][index] = defCloudy; } else { rvOutVistor[0].RasterBandsData[0][index] = rvInVistor[0].RasterBandsData[0][index]; } } })); //执行 rfr.Excute(); FileExtractResult res = new FileExtractResult("SNW", outFileName, true); res.SetDispaly(false); return(res); } } finally { iir.Dispose(); if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } cloudPrd.Dispose(); } }
/// <summary> /// 判识结果保存事件 /// </summary> /// <param name="piexd">判识结果</param> /// <param name="progressTracker"></param> /// <returns></returns> /// 原始影像和判识结果读取到一个结果集中,分为输入输出两个,输出的就是需要保存的结果 public override IExtractResult MakeExtProduct(IPixelIndexMapper piexd, Action <int, string> progressTracker) { //生成判识结果文件 IInterestedRaster <UInt16> iir = null; RasterIdentify id = new RasterIdentify(_argumentProvider.DataProvider.fileName); id.ThemeIdentify = "CMA"; id.ProductIdentify = "FOG"; id.SubProductIdentify = _identify; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <UInt16>(id, piexd.Size, piexd.CoordEnvelope); int[] idxs = piexd.Indexes.ToArray(); iir.Put(idxs, 1); //原始影像raster IRasterDataProvider sourceraster = _argumentProvider.DataProvider as IRasterDataProvider; List <RasterMaper> listRaster = new List <RasterMaper>(); RasterMaper rmsoure = new RasterMaper(sourceraster, GetBandArray(sourceraster.BandCount)); RasterMaper rmpiexd = new RasterMaper(iir.HostDataProvider, new int[] { 1 }); int totalbandcount = sourceraster.BandCount; listRaster.Add(rmpiexd); listRaster.Add(rmsoure); try { string outFileName = GetFileName(new string[] { _argumentProvider.DataProvider.fileName }, _subProductDef.ProductDef.Identify, "SRDA", ".ldf", null); using (IRasterDataProvider outRaster = CreateOutM_BandRaster(outFileName, listRaster.ToArray(), totalbandcount)) { //波段总数 RasterMaper[] fileIns = listRaster.ToArray(); RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, GetBandArray(totalbandcount)) }; //创建处理模型 RasterProcessModel <UInt16, UInt16> rfr = null; rfr = new RasterProcessModel <UInt16, UInt16>(progressTracker); rfr.SetRaster(fileIns, fileOuts); rfr.SetFeatureAOI(_argumentProvider.AOIs); rfr.RegisterCalcModel(new RasterCalcHandler <UInt16, UInt16>((rvInVistor, rvOutVistor, aoi) => { int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX; if (rvInVistor[0].RasterBandsData == null || rvInVistor[1].RasterBandsData == null || rvInVistor[0].RasterBandsData[0] == null || rvInVistor[1].RasterBandsData[0] == null) { return; } // if (_argumentProvider.AOIs == null) for (int index = 0; index < dataLength; index++) { if (rvInVistor[0].RasterBandsData[0][index] == 1) { for (int i = 0; i < totalbandcount; i++) { rvOutVistor[0].RasterBandsData[i][index] = rvInVistor[1].RasterBandsData[i][index]; } } } } )); //执行 rfr.Excute(0); } string dstfilename = outFileName.Replace(".ldf", ".dat"); if (File.Exists(dstfilename)) { File.Delete(dstfilename); } File.Move(outFileName, dstfilename); FileExtractResult res = new FileExtractResult("FOG", dstfilename, true); res.SetDispaly(false); return(res); } finally { iir.Dispose(); if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } } }
private string GetSNWDegree(string[] files) { double pixelArea = 0; IInterestedRaster <Int16> timeResult = null; IRasterOperator <Int16> roper = new RasterOperator <Int16>(); DataIdentify di = GetDataIdentify(); string outFileIdentify = GetStringArgument("OutFileIdentify"); string extinfo = GetStringArgument("extinfo"); timeResult = roper.Times(files, CreatRasterIndetifyId(files, "SNW", outFileIdentify, di, null, extinfo), (dstValue, srcValue) => { if (srcValue == 0) { return(dstValue); } else { return(++dstValue); } }); IRasterDataProvider dataProvider = timeResult.HostDataProvider; if (dataProvider != null) { ArgumentProvider ap = new ArgumentProvider(dataProvider, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); IPixelFeatureMapper <double> memresult = new MemPixelFeatureMapper <double>("0SDC", 1000, new Size(dataProvider.Width, dataProvider.Height), dataProvider.CoordEnvelope, dataProvider.SpatialRef); IInterestedRaster <double> iir = null; try { visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] == 0) { memresult.Put(index, 0); } else { pixelArea = RasterOperator <Int16> .ComputePixelArea(index / dataProvider.Width, dataProvider.CoordEnvelope.MaxY, dataProvider.ResolutionY); memresult.Put(index, pixelArea * values[0]); } }); RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "SNW"; id.SubProductIdentify = "0SDC"; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <double>(id, new Size(dataProvider.Width, dataProvider.Height), dataProvider.CoordEnvelope.Clone()); iir.Put(memresult); return(iir.FileName); } finally { if (iir != null) { iir.Dispose(); } if (visitor != null) { visitor.Dispose(); } if (timeResult != null) { timeResult.Dispose(); } if (File.Exists(timeResult.FileName)) { File.Delete(timeResult.FileName); } } } return(null); }
public IInterestedRaster <T> CycleTimes(IRasterDataProvider[] srcRasters, RasterIdentify rasterIdentify, Func <int, T, T, T> iTimesGetter, Action <int, string> progress) { ////修改不同区域生成结果文件大小不足问题 by chennan 20120806 //CoordEnvelope dstEnvelope = srcRasters[srcRasters.Length - 1].CoordEnvelope; CoordEnvelope dstEnvelope = GetEnvelopeBySize(srcRasters[srcRasters.Length - 1]); float minResolutionX = 0f; float minResolutionY = 0f; Size dstSize = Size.Empty;; for (int i = 0; i < srcRasters.Length - 1; i++) { if (srcRasters[i].DataType != srcRasters[i + 1].DataType) { throw new ArgumentException("数据类型不一致无法进行频次统计!"); } dstEnvelope = dstEnvelope.Union(GetEnvelopeBySize(srcRasters[i])); // by chennan 20120806 minResolutionX = Math.Min(srcRasters[i].ResolutionX, srcRasters[i + 1].ResolutionX); minResolutionY = Math.Min(srcRasters[i].ResolutionY, srcRasters[i + 1].ResolutionY); dstSize = new Size((int)Math.Floor(dstEnvelope.Width / minResolutionX), (int)Math.Floor(dstEnvelope.Height / minResolutionY)); } //by chennan 20121025 修改单文件无法进行周期统计 if (srcRasters.Length == 1) { minResolutionX = srcRasters[0].ResolutionX; minResolutionY = srcRasters[0].ResolutionY; dstEnvelope = srcRasters[0].CoordEnvelope.Clone(); dstSize = new Size(srcRasters[0].Width, srcRasters[0].Height); } IInterestedRaster <T> dstRaster = CreateDstRaster(srcRasters[0], dstEnvelope, rasterIdentify, dstSize); IArgumentProvider argprd = new ArgumentProvider(new AlgorithmDef()); int offsetX = 0, offsetY = 0; int dstIndex = 0; int index = 0; foreach (IRasterDataProvider rst in srcRasters) { if (progress != null) { progress((int)(index++ *100f / srcRasters.Length), "正在执行周期统计"); } CoordEnvelope inc = rst.CoordEnvelope.Intersect(dstEnvelope); if (inc == null || inc.IsEmpty()) { continue; } int iCycle = Array.IndexOf <IRasterDataProvider>(srcRasters, rst) + 1; offsetX = (int)((rst.CoordEnvelope.MinX - dstEnvelope.MinX) / rst.ResolutionX); offsetY = (int)((dstEnvelope.MaxY - rst.CoordEnvelope.MaxY) / rst.ResolutionY); //by chennan 20120806 IRasterDataProvider dstTempPrd = GetSubPrd <T>(dstRaster.HostDataProvider, rst, rasterIdentify, offsetX, offsetY); try { IVirtualRasterDataProvider virtualDataProvider = new VirtualRasterDataProvider(new IRasterDataProvider[] { dstTempPrd, rst }); argprd.DataProvider = virtualDataProvider; using (IRasterPixelsVisitor <T> visitor = new RasterPixelsVisitor <T>(argprd)) { visitor.VisitPixel(new int[] { 1, 2 }, (idx, values) => { dstIndex = (idx / dstTempPrd.Width + offsetY) * dstRaster.HostDataProvider.Width + (idx % dstTempPrd.Width + offsetX); dstRaster.Put(dstIndex, iTimesGetter(iCycle, values[0], values[1])); }); } } finally { dstTempPrd.Dispose(); if (File.Exists(dstTempPrd.fileName)) { File.Delete(dstTempPrd.fileName); } } } for (int i = 0; i < srcRasters.Length; i++) { srcRasters[i].Dispose(); } return(dstRaster); }
public IInterestedRaster <T> Times(IRasterDataProvider[] srcRasters, RasterIdentify rasterIdentify, Action <int, string> progressTracker, Func <T, T, T> timesAction) { CoordEnvelope dstEnvelope = GetEnvelopeBySize(srcRasters[srcRasters.Length - 1]); float minResolutionX = 0f; float minResolutionY = 0f; Size dstSize = Size.Empty; for (int i = 0; i < srcRasters.Length - 1; i++) { if (srcRasters[i].DataType != srcRasters[i + 1].DataType) { throw new ArgumentException("数据类型不一致无法进行频次统计!"); } dstEnvelope = dstEnvelope.Union(GetEnvelopeBySize(srcRasters[i])); minResolutionX = Math.Min(srcRasters[i].ResolutionX, srcRasters[i + 1].ResolutionX); minResolutionY = Math.Min(srcRasters[i].ResolutionY, srcRasters[i + 1].ResolutionY); dstSize = new Size((int)Math.Round(dstEnvelope.Width / minResolutionX), (int)Math.Round(dstEnvelope.Height / minResolutionY)); } if (srcRasters.Length == 1) { minResolutionX = srcRasters[0].ResolutionX; minResolutionY = srcRasters[0].ResolutionY; dstEnvelope = srcRasters[0].CoordEnvelope.Clone(); dstSize = new Size(srcRasters[0].Width, srcRasters[0].Height); } IInterestedRaster <T> dstRaster = CreateDstRaster(srcRasters[0], dstEnvelope, rasterIdentify, dstSize); IArgumentProvider argprd = new ArgumentProvider(new AlgorithmDef()); int offsetX = 0, offsetY = 0; int dstIndex = 0; if (progressTracker != null) { progressTracker(0, "开始进行统计..."); } int num = 0; foreach (IRasterDataProvider rst in srcRasters) { offsetX = (int)((rst.CoordEnvelope.MinX - dstEnvelope.MinX) / rst.ResolutionX); offsetY = (int)((dstEnvelope.MaxY - rst.CoordEnvelope.MaxY) / rst.ResolutionY); //by chennan 20120806 IRasterDataProvider dstTempPrd = GetSubPrd <T>(dstRaster.HostDataProvider, rst, rasterIdentify, offsetX, offsetY); try { IVirtualRasterDataProvider virtualDataProvider = new VirtualRasterDataProvider(new IRasterDataProvider[] { dstTempPrd, rst }); argprd.DataProvider = virtualDataProvider; using (IRasterPixelsVisitor <T> visitor = new RasterPixelsVisitor <T>(argprd)) { visitor.VisitPixel(new int[] { 1, 2 }, (idx, values) => { dstIndex = (idx / dstTempPrd.Width + offsetY) * dstRaster.HostDataProvider.Width + (idx % dstTempPrd.Width + offsetX); dstRaster.Put(dstIndex, timesAction(values[0], values[1])); }); } num++; int persent = (int)(num * 100f / srcRasters.Length); if (progressTracker != null) { progressTracker(persent, "统计完成" + persent + "%"); } } finally { dstTempPrd.Dispose(); if (File.Exists(dstTempPrd.fileName)) { File.Delete(dstTempPrd.fileName); } } if (progressTracker != null) { progressTracker(100, "统计完成"); } } for (int i = 0; i < srcRasters.Length; i++) { srcRasters[i].Dispose(); } return(dstRaster); }
private IPixelIndexMapper GenerateHistoryResultByAOI(IPixelIndexMapper pixelMapper, int[] drawedAOI) { if (drawedAOI == null || drawedAOI.Length < 1) { return(null); } if (lstFiles.Items.Count < 1) { return(null); } foreach (string file in lstFiles.Items) { if (!File.Exists(file)) { return(null); } } using (IRasterDataProvider prd = GeoDataDriver.Open(_currentRasterFile) as IRasterDataProvider) { List <int> aoiList = new List <int>(); aoiList.AddRange(drawedAOI); IPixelIndexMapper result = PixelIndexMapperFactory.CreatePixelIndexMapper("FLD", prd.Width, prd.Height, prd.CoordEnvelope, prd.SpatialRef); if (pixelMapper != null && pixelMapper.Indexes.Count() > 0) { foreach (int i in pixelMapper.Indexes) { if (aoiList.Contains(i)) { result.Put(i); } } } // IInterestedRaster <Int16> iir = null; try { RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "FLD"; id.SubProductIdentify = "DBLV"; iir = new InterestedRaster <Int16>(id, new Size(prd.Width, prd.Height), prd.CoordEnvelope.Clone()); int[] idxs = result.Indexes.ToArray(); iir.Put(idxs, 1); } finally { iir.Dispose(); } Dictionary <string, FilePrdMap> filePrdMap = new Dictionary <string, FilePrdMap>(); filePrdMap.Add("currentDBLV", new FilePrdMap(iir.FileName, 1, new VaildPra(Int16.MinValue, Int16.MaxValue), new int[] { 1 })); int index = 0; foreach (string file in lstFiles.Items) { filePrdMap.Add("dblv" + index, new FilePrdMap(file, 1, new VaildPra(Int16.MinValue, Int16.MaxValue), new int[] { 1 })); index++; } ITryCreateVirtualPrd tryVPrd = new TryCreateVirtualPrdByMultiFile(); IVirtualRasterDataProvider vrd = tryVPrd.CreateVirtualRasterPRD(ref filePrdMap); if (vrd == null) { if (filePrdMap != null && filePrdMap.Count > 0) { foreach (FilePrdMap value in filePrdMap.Values) { if (value.Prd != null) { value.Prd.Dispose(); } } } return(null); } try { ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <float> rpVisitor = new RasterPixelsVisitor <float>(ap); int historyCount = lstFiles.Items.Count; int[] bandNos = new int[historyCount + 1]; for (int i = 0; i < bandNos.Length; i++) { bandNos[i] = i + 1; } int[] difArray = new int[historyCount]; rpVisitor.VisitPixel(new Rectangle(0, 0, prd.Width, prd.Height), drawedAOI, bandNos, (idx, values) => { for (int i = 0; i < historyCount; i++) { if (values[0] != values[i + 1]) { difArray[i]++; } } }); int min = difArray[0], minIndex = 0; for (int i = 1; i < difArray.Length; i++) { if (min > difArray[i]) { min = difArray[i]; minIndex = i; } } rpVisitor.VisitPixel(bandNos, (idx, values) => { if (values[minIndex + 1] == 1) { if (!aoiList.Contains(idx)) { result.Put(idx); } } }); return(result); } finally { vrd.Dispose(); if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } } } }
public override IExtractResult MakeExtProduct(IPixelIndexMapper piexd, Action <int, string> progressTracker) { if (piexd == null || this.Tag == null) { return(null); } IPixelFeatureMapper <Int16> resultTag = this.Tag as MemPixelFeatureMapper <Int16>; if (resultTag == null) { return(null); } //生成判识结果文件 IInterestedRaster <Int16> iir = null; IInterestedRaster <Int16> iirFIFLT = null; RasterIdentify id = new RasterIdentify(_argumentProvider.DataProvider.fileName); id.ThemeIdentify = "CMA"; id.ProductIdentify = "FIR"; id.SubProductIdentify = _identify; id.GenerateDateTime = DateTime.Now; iir = new InterestedRaster <Int16>(id, new Size(_argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height), _argumentProvider.DataProvider.CoordEnvelope.Clone()); int[] idxs = piexd.Indexes.ToArray(); iir.Put(idxs, 1); id.SubProductIdentify = "FIFLT"; id.GenerateDateTime = DateTime.Now; iirFIFLT = new InterestedRaster <Int16>(id, new Size(_argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height), _argumentProvider.DataProvider.CoordEnvelope.Clone()); iirFIFLT.Put(resultTag); List <RasterMaper> rms = new List <RasterMaper>(); IRasterDataProvider FIRLPrd = null; IRasterDataProvider FIFLTPrd = null; try { FIRLPrd = iir.HostDataProvider; RasterMaper fiflRm = new RasterMaper(FIRLPrd, new int[] { 1 }); rms.Add(fiflRm); FIFLTPrd = iirFIFLT.HostDataProvider; RasterMaper fifltRm = new RasterMaper(FIFLTPrd, new int[] { 1 }); rms.Add(fifltRm); string outFileName = GetFileName(new string[] { _argumentProvider.DataProvider.fileName }, _subProductDef.ProductDef.Identify, "FIFL", ".dat", null); using (IRasterDataProvider outRaster = CreateOutRaster(outFileName, rms.ToArray())) { RasterMaper[] fileIns = rms.ToArray(); RasterMaper[] fileOuts = new RasterMaper[] { new RasterMaper(outRaster, new int[] { 1 }) }; //创建处理模型 RasterProcessModel <Int16, Int16> rfr = null; rfr = new RasterProcessModel <Int16, Int16>(progressTracker); rfr.SetRaster(fileIns, fileOuts); rfr.SetFeatureAOI(_argumentProvider.AOIs); rfr.RegisterCalcModel(new RasterCalcHandler <Int16, Int16>((rvInVistor, rvOutVistor, aoi) => { int dataLength = rvOutVistor[0].SizeY * rvOutVistor[0].SizeX; if (rvInVistor[0].RasterBandsData == null || rvInVistor[1].RasterBandsData == null || rvInVistor[0].RasterBandsData[0] == null || rvInVistor[1].RasterBandsData[0] == null) { return; } // if (_argumentProvider.AOIs == null) for (int index = 0; index < dataLength; index++) { if (rvInVistor[0].RasterBandsData[0][index] == 0) { rvOutVistor[0].RasterBandsData[0][index] = (Int16)0; } else { rvOutVistor[0].RasterBandsData[0][index] = rvInVistor[1].RasterBandsData[0][index]; } } //else if (_argumentProvider.AOIs != null && aoi != null && aoi.Length != 0) //{ // for (int i = 0; i < aoi.Length; i++) // if (rvInVistor[0].RasterBandsData[0][aoi[i]] == 0) // rvOutVistor[0].RasterBandsData[0][aoi[i]] = (Int16)0; // else // rvOutVistor[0].RasterBandsData[0][aoi[i]] = rvInVistor[1].RasterBandsData[0][aoi[i]]; //} })); //执行 rfr.Excute(); FileExtractResult res = new FileExtractResult("FIFL", outFileName, true); res.SetDispaly(false); return(res); } } finally { iir.Dispose(); if (File.Exists(iir.FileName)) { File.Delete(iir.FileName); } iirFIFLT.Dispose(); if (File.Exists(iirFIFLT.FileName)) { File.Delete(iirFIFLT.FileName); } } }