public override IExtractResult Make(Action <int, string> progressTracker) { if (_argumentProvider == null || _argumentProvider.DataProvider == null) { return(null); } if (_argumentProvider.GetArg("AlgorithmName") == null) { return(null); } if (_argumentProvider.GetArg("AlgorithmName").ToString() == "0MIX") { float fldValue = 0; float landValue = 0; string[] nearInfValues = _argumentProvider.GetArg("NearInfraredValues") as string[]; if (nearInfValues == null || nearInfValues.Count() != 2) { return(null); } if (!float.TryParse(nearInfValues[0], out fldValue) || !float.TryParse(nearInfValues[1], out landValue)) { return(null); } int bandNo = (int)_argumentProvider.GetArg("NearInfrared"); double nearInfraredZoom = (double)_argumentProvider.GetArg("NearInfrared_Zoom"); IRasterDataProvider prd = _argumentProvider.DataProvider; IPixelFeatureMapper <UInt16> result = new MemPixelFeatureMapper <UInt16>("0MIX", prd.Width * prd.Height, new Size(prd.Width, prd.Height), prd.CoordEnvelope, prd.SpatialRef); ArgumentProvider ap = new ArgumentProvider(prd, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); if (fldValue == landValue) { visitor.VisitPixel(new int[] { bandNo }, (index, values) => { result.Put(index, 0); }); return(result); } visitor.VisitPixel(new int[] { bandNo }, (index, values) => { UInt16 percentValue = (UInt16)GetMixPixelPercent(values[0], fldValue, landValue); result.Put(index, percentValue); }); return(result); } return(null); }
public void UpdateDisplayInfo(int VisibleCH, int ShortInfraredCH, int FarInfraredCH) { if (_argumentProvider.DataProvider == null) { _snwFeatureCollection = null; } Dictionary <int, SnwFeature> features = new Dictionary <int, SnwFeature>(); SnwFeature tempSnw = null; RasterPixelsVisitor <UInt16> rpVisitor = new RasterPixelsVisitor <UInt16>(_argumentProvider); Rectangle rect = new Rectangle(0, 0, _argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height); int[] aoi = null;//积雪信息提示要求不使用AOI。 rpVisitor.VisitPixel(rect, aoi, new int[] { VisibleCH, ShortInfraredCH, FarInfraredCH }, (index, values) => { tempSnw = new SnwFeature(); tempSnw.Ndsi = (Int16)((values[0] - values[1]) * 1000f / (values[0] + values[1])); tempSnw.Visible = values[0]; tempSnw.ShortInfrared = values[1]; tempSnw.FarInfrared = values[2]; features.Add(index, tempSnw); } ); _snwFeatureCollection = new SnwFeatureCollection("积雪辅助信息", features);; }
private Dictionary <int, CLMFeature> GetBagDisplayInfo(int visiable, int shortInfraredCH, int nearinfraredCH, IRasterDataProvider prd) { if (_argumentProvider.DataProvider == null) { return(null); } Dictionary <int, CLMFeature> features = new Dictionary <int, CLMFeature>(); CLMFeature tempCLM = null; RasterPixelsVisitor <UInt16> rpVisitor = new RasterPixelsVisitor <UInt16>(_argumentProvider); rpVisitor.VisitPixel(new Rectangle(0, 0, prd.Width, prd.Height), null, new int[] { visiable, shortInfraredCH, nearinfraredCH }, (index, values) => { tempCLM = new CLMFeature(); tempCLM.Ndsi = (Int16)((values[1] - values[0]) * 1000f / (values[1] + values[0])); tempCLM.Ndvi = (Int16)((values[2] - values[1]) * 1000f / (values[2] + values[1])); tempCLM.Visible = values[0]; tempCLM.UseFarInfrared = false; tempCLM.UseNDSI = false; tempCLM.UseNearVisiable = false; tempCLM.UseNDVI = true; tempCLM.UseNearShort = true; tempCLM.UseNearInfrared = true; tempCLM.shortInfrared = values[1]; tempCLM.nearInfrared = values[2]; features.Add(index, tempCLM); } ); return(features); }
private IExtractResult CalcOPTDByOneFile(Dictionary <string, FilePrdMap> filePrdMap, IVirtualRasterDataProvider vrd, float extinctionCoefficient, int visibleCH, double visibleZoom, double OptdZoom) { try { ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <float> rpVisitor = new RasterPixelsVisitor <float>(ap); IPixelFeatureMapper <Int16> curOPTD = new MemPixelFeatureMapper <Int16>("OPTD", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); float upRef = 0f; rpVisitor.VisitPixel(new int[] { filePrdMap["CurrentRasterFile"].StartBand, filePrdMap["csrFile"].StartBand, filePrdMap["dvlbFile"].StartBand }, (index, values) => { if (values[2] == 1f) { upRef = values[0] - Convert.ToSingle(values[1] * Math.Pow((1 - (values[0] / visibleZoom)), 2)); curOPTD.Put(index, (Int16)(upRef * (1 / extinctionCoefficient) / ((visibleZoom - upRef) * 3) * OptdZoom)); } else { curOPTD.Put(index, 0); } }); return(curOPTD); } finally { vrd.Dispose(); } }
/// <summary> /// 全球火点LDF转换Dat /// </summary> public void writeGFR() { IRasterDataProvider dp = RasterDataDriver.Open(@"L:\新演示数据\01_火情\全球火点\FIR_FREQ_FY3B_VIRR_1D_GBAL_PXXX_1000KM_201304250941.ldf") as IRasterDataProvider; Size size = new Size(dp.Width, dp.Height); IPixelFeatureMapper <Int16> result = new MemPixelFeatureMapper <Int16>("FIR", dp.Width * dp.Height, size, dp.CoordEnvelope, dp.SpatialRef); RasterIdentify id = new RasterIdentify(dp.fileName); id.ThemeIdentify = "CMA"; id.ProductIdentify = "FIR"; id.SubProductIdentify = "GFRF"; id.IsOutput2WorkspaceDir = true; IArgumentProvider ap = new ArgumentProvider(dp, null); RasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(ap); visitor.VisitPixel(new int[] { 1 }, (index, values) => { result.Put(index, (Int16)values[0]); }); using (IInterestedRaster <Int16> iir = new InterestedRaster <Int16>(id, size, dp.CoordEnvelope.Clone(), dp.SpatialRef)) { iir.Put(result); string filename = iir.FileName; } }
/// <summary> /// 计算总覆盖度 /// 总覆盖度=(有蓝藻的像元面积)/(指定区域面积,例如太湖); /// </summary> /// <returns>覆盖度(0-1)</returns> public float StatTotalConvertDegree(IRasterDataProvider dataProvider, int[] aoi) { int convertedCount = 0; bool[] convertedPixels = new bool[aoi.Length]; int i = 0; Size size = new Size(dataProvider.Width, dataProvider.Height); Rectangle rect = AOIHelper.ComputeAOIRect(aoi, size); ArgumentProvider ap = new ArgumentProvider(dataProvider, null); RasterPixelsVisitor <float> visitor = new RasterPixelsVisitor <float>(ap); visitor.VisitPixel(rect, aoi, new int[] { 1 }, (index, values) => { if (values[0] >= 0f && values[0] <= 1f) { convertedPixels[i] = true; i++; } }); foreach (bool isConverted in convertedPixels) { if (isConverted) { convertedCount++; } } return((float)convertedCount / (float)convertedPixels.Length); }
public unsafe IExtractResult Do(string productIdentify, string subProductIdentify, IRasterDataProvider dataProvider, string filename, out string error) { error = string.Empty; if (!CanDo(productIdentify, subProductIdentify, filename, out error)) { return(null); } if (_transDef == null) { _transDef = (new MVGXMLParser()).GetTransDef(); } ProductDef product = _transDef.GetProductBySmartProductIdentify(productIdentify); SubProductDef subProduct = product.GetSubProductBySmartIdentfy(subProductIdentify); IGeoDataProvider provider = GeoDataDriver.Open(filename, enumDataProviderAccess.ReadOnly, null); if (provider != null) { MvgDataProvider mvgProvider = provider as MvgDataProvider; if (mvgProvider == null) { error = "MVG转换尚不支持文件【" + Path.GetFileName(filename) + "】!"; return(null); } float xResolution = dataProvider.ResolutionX, mvgXResolution = (float)mvgProvider.CoordEnvelope.Width / mvgProvider.Width; float yResolution = dataProvider.ResolutionY, mvgYResolution = (float)mvgProvider.CoordEnvelope.Height / mvgProvider.Height; int width = dataProvider.Width, mvgWidth = mvgProvider.Width; double minX = dataProvider.CoordEnvelope.MinX, mvgMinX = mvgProvider.CoordEnvelope.MinX; double maxY = dataProvider.CoordEnvelope.MaxY, mvgMaxY = mvgProvider.CoordEnvelope.MaxY; int xIndex = 0; int yIndex = 0; if (dataProvider.DataType == enumDataType.UInt16) { Int16[] dataBlock = new Int16[mvgProvider.Width * mvgProvider.Height]; fixed(Int16 *buffer = dataBlock) { IntPtr ptr = new IntPtr(buffer); mvgProvider.Read(0, 0, mvgProvider.Width, mvgProvider.Height, ptr, enumDataType.Int16, mvgProvider.Width, mvgProvider.Height, 1, new int[] { 1 }, enumInterleave.BSQ); } Dictionary <Int16, Int16> dic = subProduct.GetTableDic <Int16, Int16>(); IPixelIndexMapper map = PixelIndexMapperFactory.CreatePixelIndexMapper(productIdentify + "_" + subProductIdentify, width, dataProvider.Height, dataProvider.CoordEnvelope, dataProvider.SpatialRef); RasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(new ArgumentProvider(dataProvider, null)); visitor.VisitPixel(new int[] { 1 }, (index, values) => { xIndex = (int)Math.Round((minX + (index % width * xResolution) - mvgMinX) / mvgXResolution); yIndex = (int)Math.Round((mvgMaxY - (maxY - (index / width * yResolution))) / mvgYResolution); if (xIndex >= 0 && yIndex >= 0 && yIndex * mvgWidth + xIndex < dataBlock.Length) { if (dic.ContainsKey(dataBlock[yIndex * mvgWidth + xIndex])) { map.Put(index); } } }); return(map); } } return(null); }
//微波积雪判识 public void UpdateDisplayInfoMS(int ch18v, int ch23v, int ch36v, int ch89v) { if (_argumentProvider.DataProvider == null) { _snwFeatureCollectionMS = null; } Dictionary <int, SnwFeatureMS> features = new Dictionary <int, SnwFeatureMS>(); SnwFeatureMS tempSnw = null; RasterPixelsVisitor <Int16> rpVisitor = new RasterPixelsVisitor <Int16>(_argumentProvider); Rectangle rect = new Rectangle(0, 0, _argumentProvider.DataProvider.Width, _argumentProvider.DataProvider.Height); int[] aoi = null;//积雪信息提示要求不使用AOI。 rpVisitor.VisitPixel(rect, aoi, new int[] { ch18v, ch23v, ch36v, ch89v }, (index, values) => { tempSnw = new SnwFeatureMS(); tempSnw.si1 = (values[1] - values[3]) * 0.01; tempSnw.si2 = (values[0] - values[2]) * 0.01; tempSnw.ch23v = (values[1] * 0.01) + 327.68; tempSnw.si22 = (values[0] - values[2]) * 0.01; tempSnw.si1si2 = (values[1] - values[3] - values[0] + values[2]) * 0.01; tempSnw.si1si22 = (values[1] - values[3] - values[0] + values[2]) * 0.01; features.Add(index, tempSnw); } ); _snwFeatureCollectionMS = new SnwFeatureCollectionMS("微波积雪辅助信息", features);; }
private Dictionary <int, BagFeature> GetDisplayInfo(IPixelIndexMapper result, int visiBandNo, int niBandNo) { if (_argumentProvider.DataProvider == null) { return(null); } try { Dictionary <int, BagFeature> features = new Dictionary <int, BagFeature>(); BagFeature tempFeature = null; ArgumentProvider ap = new ArgumentProvider(_argumentProvider.DataProvider, null); RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap); visitor.VisitPixel(new int[] { visiBandNo, niBandNo }, (index, values) => { tempFeature = new BagFeature(); tempFeature.Ndvi = GetOnePixelNDVI(values[0], values[1]); features.Add(index, tempFeature); }); return(features); } finally { } }
private IExtractResult CompareDATFile(string backWaterPath, string binWater) { Dictionary <string, FilePrdMap> filePrdMap = new Dictionary <string, FilePrdMap>(); filePrdMap.Add("backWaterPath", new FilePrdMap(backWaterPath, 1, new VaildPra(Int16.MinValue, Int16.MaxValue), new int[] { 1 })); filePrdMap.Add("binWater", new FilePrdMap(binWater, 1, new VaildPra(Int16.MinValue, Int16.MaxValue), new int[] { 1 })); ITryCreateVirtualPrd tryVPrd = new TryCreateVirtualPrdByMultiFile(); IVirtualRasterDataProvider vrd = tryVPrd.CreateVirtualRasterPRD(ref filePrdMap); if (vrd == null) { PrintInfo("数据间无相交部分,无法进行泛滥缩小水体计算!"); 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); IPixelFeatureMapper <Int16> result = new MemPixelFeatureMapper <Int16>("FLOD", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); rpVisitor.VisitPixel(new int[] { filePrdMap["backWaterPath"].StartBand, filePrdMap["binWater"].StartBand }, (idx, values) => { if (values[0] == 1 && values[1] == 1) { result.Put(idx, 1); } else if (values[0] == 1 && values[1] == 0) { result.Put(idx, 5); } else if (values[0] == 0 && values[1] == 1) { result.Put(idx, 4); } }); RasterIdentify rid = new RasterIdentify(new string[] { backWaterPath, binWater }); rid.ProductIdentify = _subProductDef.ProductDef.Identify; rid.SubProductIdentify = _identify; rid.IsOutput2WorkspaceDir = true; IInterestedRaster <Int16> iir = new InterestedRaster <Int16>(rid, result.Size, result.CoordEnvelope, result.SpatialRef); iir.Put(result); iir.Dispose(); return(new FileExtractResult("扩大缩小水体", iir.FileName)); } finally { vrd.Dispose(); } }
public void btnGetInfos_Click(object sender, EventArgs e) { if (_arp != null) { double lstBandRoom = (double)_arp.GetArg("lstband_Zoom"); IRasterDataProvider prd = _arp.DataProvider; if (prd == null) { return; } IBandNameRaster bandNameRaster = prd as IBandNameRaster; int lstbandNo = TryGetBandNo(bandNameRaster, "lstband"); if (lstbandNo == -1 || lstBandRoom == -1) { return; } ArgumentProvider ap = new ArgumentProvider(prd, null); Size size = new Size(prd.Width, prd.Height); if (_arp.AOIs != null && _arp.AOIs.Length != 0) { txtIdenfiy.Text = GetInfoExt(_arp.AOIs); } Rectangle rect = AOIHelper.ComputeAOIRect(_arp.AOI, size); Dictionary <string, Dictionary <string, float> > anlysis = new Dictionary <string, Dictionary <string, float> >(); InitAnlysisInfo(anlysis); int count = 0; Int16[] cloudValues = GetNanValues("CloudyValue"); Int16[] waterValues = GetNanValues("WaterValue"); Int16[] invaildValues = GetNanValues("InvailValue"); using (RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap)) { visitor.VisitPixel(rect, _arp.AOI, new int[] { lstbandNo }, (index, values) => { if (IsNanValue(values[0], cloudValues) || IsNanValue(values[0], waterValues) || IsNanValue(values[0], invaildValues)) { return; } AnlysisValues(anlysis, "地表温度", values[0]); count++; }); } anlysis["地表温度"]["avg"] = (float)Math.Round(anlysis["地表温度"]["avg"] / count, 4); using (RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap)) { visitor.VisitPixel(rect, _arp.AOI, new int[] { lstbandNo }, (index, values) => { anlysis["地表温度"]["pc"] += (float)Math.Pow(values[0] - anlysis["地表温度"]["avg"], 2); }); } anlysis["地表温度"]["pc"] = (float)Math.Round(Math.Sqrt(anlysis["地表温度"]["pc"]) / count, 4); StringBuilder sb = new StringBuilder(); sb.Append(string.Format("地表温度:\n 最小值:{0}\n 最大值:{1}\n 平均值:{2}\n 偏差值:{3}\n", anlysis["地表温度"]["min"], anlysis["地表温度"]["max"], anlysis["地表温度"]["avg"], anlysis["地表温度"]["pc"])); txtInfos.Text = sb.ToString(); } }
private string MAxValue(string[] fileNames, int bandNo, float zoom) { foreach (string f in fileNames) { if (!File.Exists(f)) { PrintInfo("所选择的数据:\"" + f + "\"不存在。"); return(null); } } Dictionary <string, FilePrdMap> filePrdMap = new Dictionary <string, FilePrdMap>(); for (int i = 0; i < fileNames.Length; i++) { FilePrdMap map = new FilePrdMap(fileNames[i], zoom, new VaildPra(float.MinValue, float.MaxValue), new int[] { bandNo }); if (map.BandCount < 1) { PrintInfo("请选择正确的数据进行最大值合成。"); return(null); } filePrdMap.Add("ndviFile" + i.ToString(), map); } ITryCreateVirtualPrd tryVPrd = new TryCreateVirtualPrdByMultiFile(); IVirtualRasterDataProvider prd = tryVPrd.CreateVirtualRasterPRD(ref filePrdMap); if (prd == null) { throw new Exception("数据间无相交部分,无法创建虚拟数据提供者!"); } IRasterPixelsVisitor <float> visitor = new RasterPixelsVisitor <float>(new ArgumentProvider(prd, null)); List <int> bands = new List <int>(); for (int i = 0; i < fileNames.Length; i++) { bands.Add(filePrdMap["ndviFile" + i.ToString()].StartBand); } PrintInfo("正在进行最大值合成,请稍后...!"); IPixelFeatureMapper <float> result = new MemPixelFeatureMapper <float>("0MAX", prd.Width * prd.Height, new Size(prd.Width, prd.Height), prd.CoordEnvelope, prd.SpatialRef); visitor.VisitPixel(bands.ToArray(), (idx, values) => { result.Put(idx, values.Max() * zoom); } ); RasterIdentify rid = new RasterIdentify(fileNames); IInterestedRaster <float> iir = new InterestedRaster <float>(rid, new Size(prd.Width, prd.Height), prd.CoordEnvelope, prd.SpatialRef); iir.Put(result); iir.Dispose(); return(iir.FileName); }
//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); } } }
private IStatResult STATAlgorithm(string filename) { string[] files = new string[] { filename }; if (files == null || files.Length == 0) { return(null); } string mixFile = files[0].Replace("_DBLV_", "_0MIX_").Replace("_FLOD_", "_0MIX_"); Dictionary <int, Int16> mixDic = new Dictionary <int, short>(); if (File.Exists(mixFile)) { using (IRasterDataProvider rd = GeoDataDriver.Open(mixFile) as IRasterDataProvider) { ArgumentProvider ap = new ArgumentProvider(rd, null); RasterPixelsVisitor <Int16> rpVisitor = new RasterPixelsVisitor <Int16>(ap); rpVisitor.VisitPixel(new int[] { 1 }, (idx, values) => { if (values[0] != 0) { mixDic.Add(idx, values[0]); } }); } } if (mixDic.Count == 0) { return(AreaStatResultToStatResult <Int16>(filename, "水情", "FLD", (v) => { return v == 1; })); } else { return(AreaStatResultToStatResult <Int16>(filename, "水情", "FLD", (v, idx) => { if (v == 1) { if (mixDic.ContainsKey(idx)) { return mixDic[idx]; } else { return 100; } } else { return 0; } }, 100)); } }
private IExtractResult CalcOPTDByOneFile(IVirtualRasterDataProvider vrd, IRasterDataProvider optdPrd, int optdCH, double OptdZoom, int lwpCH, double lwpZoom) { ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <Int16> rpVisitor = new RasterPixelsVisitor <Int16>(ap); IPixelFeatureMapper <Int16> curERAD = new MemPixelFeatureMapper <Int16>("ERAD", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); rpVisitor.VisitPixel(new int[] { optdCH, optdPrd.BandCount + lwpCH }, (index, values) => { curERAD.Put(index, (Int16)(3 / 2 * ((values[1] / lwpZoom) / 1 * (values[0] / OptdZoom)))); }); return(curERAD); }
private IExtractResult CalcOPTDByOneFile(IRasterDataProvider prd, double lwpa, double lwpb, int optdCH, double OptdZoom, double lwpZoom) { ArgumentProvider ap = new ArgumentProvider(prd, null); RasterPixelsVisitor <Int16> rpVisitor = new RasterPixelsVisitor <Int16>(ap); IPixelFeatureMapper <Int16> curLWP = new MemPixelFeatureMapper <Int16>("0LWP", 1000, new Size(prd.Width, prd.Height), prd.CoordEnvelope, prd.SpatialRef); rpVisitor.VisitPixel(new int[] { optdCH }, (index, values) => { curLWP.Put(index, (Int16)Convert.ToSingle(Math.Pow(10, Math.Exp((Math.Log10(values[0] / OptdZoom - lwpa) / lwpb))) * lwpZoom)); }); return(curLWP); }
public static Dictionary <float, List <float> > NDVIHistograms(TVDIUCArgs ucArgs) { string error = string.Empty; if (!CheckHistograms(ucArgs, ref error)) { return(null); } Dictionary <string, FilePrdMap> filePrdMap = new Dictionary <string, FilePrdMap>(); filePrdMap.Add("NDVIFile", new FilePrdMap(ucArgs.NDVIFile, ucArgs.TVDIParas.NdviFile.Zoom, new VaildPra(ucArgs.TVDIParas.NdviFile.Min, ucArgs.TVDIParas.NdviFile.Max), new int[] { ucArgs.TVDIParas.NdviFile.Band })); filePrdMap.Add("LSTFile", new FilePrdMap(ucArgs.ECLstFile, ucArgs.TVDIParas.LstFile.Zoom, new VaildPra(ucArgs.TVDIParas.LstFile.Min, ucArgs.TVDIParas.LstFile.Max), new int[] { 1 })); ITryCreateVirtualPrd tryVPrd = new TryCreateVirtualPrdByMultiFile(); IVirtualRasterDataProvider vrd = null; try { vrd = tryVPrd.CreateVirtualRasterPRD(ref filePrdMap); if (vrd == null) { throw new Exception("数据间无相交部分,无法创建虚拟数据提供者!"); } Dictionary <float, List <float> > result = new Dictionary <float, List <float> >(); ArgumentProvider ap = new ArgumentProvider(vrd, null); RasterPixelsVisitor <float> rpVisitor = new RasterPixelsVisitor <float>(ap); TVDIParaClass tvdiP = ucArgs.TVDIParas; IPixelFeatureMapper <float> _result = new MemPixelFeatureMapper <float>("0DWE", 1000, new Size(vrd.Width, vrd.Height), vrd.CoordEnvelope, vrd.SpatialRef); float ndvizoom = tvdiP.NdviFile.Zoom; float lstZoom = tvdiP.LstFile.Zoom; rpVisitor.VisitPixel(new int[] { filePrdMap["NDVIFile"].StartBand, filePrdMap["LSTFile"].StartBand }, (index, values) => { if (values[1] >= tvdiP.LstFile.Min / lstZoom && values[1] <= tvdiP.LstFile.Max / lstZoom && values[0] >= tvdiP.NdviFile.Min / ndvizoom && values[0] <= tvdiP.NdviFile.Max / ndvizoom) { if (!result.ContainsKey(values[0])) { result.Add(values[0], new List <float>()); } result[values[0]].Add(values[1]); } }); return(result.Count == 0 ? null : result); } finally { vrd.Dispose(); } }
//通过读取历史判识文件获取AOI private void 能见度计算file_Click(object sender, EventArgs e) { InitExIdentify(); _exPro.SubProductIdentify = "VISY"; _sub = _pro.GetSubProductDefByIdentify("VISY"); _exAlg.Satellite = "FY3A"; _exAlg.Sensor = "VIRR"; AlgorithmDef visiAlg = _sub.GetAlgorithmDefByIdentify("Visibility"); IArgumentProvider visiArg = MonitoringThemeFactory.GetArgumentProvider(_exPro, _exAlg); IRasterDataProvider prd = GetRasterDataProviderBinaryFile(); Dictionary <string, object> args = new Dictionary <string, object>(); IArgumentProvider argPrd = new ArgumentProvider(prd, args); RasterPixelsVisitor <UInt16> raster = new RasterPixelsVisitor <UInt16>(argPrd); List <int> idxs = new List <int>(); raster.VisitPixel(new int[] { 1 }, (index, value) => { if (value[0] != 0) { idxs.Add(index); } }); visiArg.DataProvider = GetRasterDataProviderVIRR(); visiArg.AOI = idxs.ToArray(); visiArg.SetArg("Visibility", visiAlg); SubProductRasterDst subraster = new SubProductRasterDst(_sub); IPixelFeatureMapper <UInt16> rasterResult = subraster.Make(null) as IPixelFeatureMapper <UInt16>; // RasterIdentify id = new RasterIdentify(); id.ThemeIdentify = "CMA"; id.ProductIdentify = "SAND"; id.SubProductIdentify = "VISIBILITY"; id.Satellite = "FY3A"; id.Sensor = "VIRRX"; id.Resolution = "1000M"; id.OrbitDateTime = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0, 0)); id.GenerateDateTime = DateTime.Now; IInterestedRaster <UInt16> iir = new InterestedRaster <UInt16>(id, new Size(prd.Width, prd.Height), prd.CoordEnvelope.Clone()); iir.Put(rasterResult); iir.Dispose(); MessageBox.Show("能见度计算完成!"); }
private double CompuCurPixel(string rasterFileName) { IRasterDataProvider inRaster = RasterDataDriver.Open(rasterFileName) as IRasterDataProvider; ArgumentProvider ap = new ArgumentProvider(inRaster, null); RasterPixelsVisitor <float> visitor = new RasterPixelsVisitor <float>(ap); double result = 0; visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] > 0) { result += values[0]; } }); return(result); }
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 void button17_Click(object sender, EventArgs e) { IVirtualRasterDataProvider prd = new VirtualRasterDataProvider(null); IRasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(new ArgumentProvider(prd, null)); IPixelFeatureMapper <float> result = new MemPixelFeatureMapper <float>("NVI", 10000, new Size(prd.Width, prd.Height), prd.CoordEnvelope, prd.SpatialRef); visitor.VisitPixel(new int[] { 1, 11, 21 }, (idx, values) => { result.Put(idx, values[0] * values[1] * values[2]); } ); // //IInterestedRaster<float> rst = new InterestedRaster<float>(null, Size.Empty, null); //rst.Put(result); //rst.Dispose(); }
public void btnGetAOIIndex(object sender, EventArgs e) { this.AOIIndexs = _arp.AOI; //根据选定的AOI区域进行自动计算水体NDVI最小值 IRasterDataProvider prd = _arp.DataProvider; int bandNI = (int)_arp.GetArg("NearInfrared"); int bandVI = (int)_arp.GetArg("Visible"); ArgumentProvider ap = new ArgumentProvider(prd, null); Size size = new Size(prd.Width, prd.Height); Rectangle rect = AOIHelper.ComputeAOIRect(this.AOIIndexs, size); using (RasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(ap)) { List <double> ndvis = new List <double>(); visitor.VisitPixel(rect, this.AOIIndexs, new int[] { bandVI, bandNI }, (index, values) => { if (values[1] + values[0] != 0) //是判断两个值都不等0的意思? { ndvis.Add(Math.Round((float)(values[1] - values[0]) / (values[1] + values[0]), 4)); } }); if (ndvis.Count >= 0) { //设置界面值 float a = float.Parse(txta.Text); float b = float.Parse(txtb.Text); ndvis.Sort(); //从小到大排列 ndvis.RemoveRange(0, (int)(0.01 * ndvis.Count)); //去除百分之一最小值 float avgndvi = (float)ndvis.Min(); float MinNDVI = a * avgndvi + b; this.txtNDVI.Text = avgndvi.ToString(); this.txtminndvi.Text = MinNDVI.ToString(); this.txtndvimin.Text = MinNDVI.ToString(); this.NDVIMultiBar.SetValues(new double[] { this.txtndvimin.Value, this.txtndvimax.Value }); } } this.ckbaoi.Checked = false;//重置状态 //设置完成之后自动生成 if (_handler != null) { _handler(GetArgumentValue()); return; } }
public override IExtractResult Make(Action <int, string> progressTracker) { if (_argumentProvider == null) { return(null); } string algname = _argumentProvider.GetArg("AlgorithmName").ToString(); string ndviFName = _argumentProvider.GetArg("mainfiles").ToString(); if (string.IsNullOrEmpty(algname) || string.IsNullOrEmpty(ndviFName) || !File.Exists(ndviFName)) { return(null); } if (algname == "BPCD") { //NDVI结果文件 using (IRasterDataProvider ndviDataProvider = GeoDataDriver.Open(ndviFName) as IRasterDataProvider) { NDVISetValue setValue = (ndviDataProvider as MemoryRasterDataProvider).GetExtHeader <NDVISetValue>(); double minNDVI = setValue.MinNDVI; double maxNDVI = setValue.MaxNDVI; double dst = maxNDVI - minNDVI; IPixelFeatureMapper <float> memResult = new MemPixelFeatureMapper <float>("BPCD", 1000, new Size(ndviDataProvider.Width, ndviDataProvider.Height), ndviDataProvider.CoordEnvelope.Clone(), 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)); } }); return(memResult); } } return(null); }
private void GetDBLVAOIIndex(string dblvFile, List <int> dblvAOI) { using (IRasterDataProvider provider = GeoDataDriver.Open(dblvFile) as IRasterDataProvider) { ArgumentProvider ap = new ArgumentProvider(provider, null); using (RasterPixelsVisitor <Int16> visitor = new RasterPixelsVisitor <Int16>(ap)) { visitor.VisitPixel(new int[] { 1 }, (index, values) => { if (values[0] == 1) { dblvAOI.Add(index); } }); } } }
public void btnGetAOIIndex(object sender, EventArgs e) { this.AOIIndexs = _arp.AOI; //根据选定的AOI区域进行自动计算水体近红外反射率最小值 IRasterDataProvider prd = _arp.DataProvider; int bandNI = (int)_arp.GetArg("NearInfrared"); ArgumentProvider ap = new ArgumentProvider(prd, null); Size size = new Size(prd.Width, prd.Height); Rectangle rect = AOIHelper.ComputeAOIRect(this.AOIIndexs, size); using (RasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(ap)) { List <double> nears = new List <double>(); visitor.VisitPixel(rect, this.AOIIndexs, new int[] { bandNI }, (index, values) => { if (values[0] > 0) //近红外反射率>0 { nears.Add(Math.Round(values[0] / 1000f, 4)); } }); if (nears.Count >= 0) { //设置界面值 float pa = float.Parse(txtpa.Text); float pb = float.Parse(txtpb.Text); nears.Sort(); //从小到大排列 nears.RemoveRange(0, (int)(0.05 * nears.Count)); //去除百分之一最小值 float minnear = (float)nears.Min(); float MinN = minnear + (pa + pb) / 10; this.txtNear.Text = minnear.ToString(); this.txtnearmin.Text = MinN.ToString(); this.NDVIMultiBar.SetValues(new double[] { MinN }); } } this.ckbone.Checked = false;//重置状态 //设置完成之后自动生成 if (_handler != null) { _handler(GetArgumentValue()); return; } }
private StatInfo CalcUPHIByOneFile(string file, int UHEBandCH, SortedDictionary <float, float> UHERegions, UInt16[] HILevel) { Dictionary <UInt16, int> uhpi = new Dictionary <UInt16, int>(); StatInfo result = new StatInfo(); int levelIndex = -1; foreach (float key in UHERegions.Keys) { levelIndex++; uhpi.Add(HILevel[levelIndex], 0); } IRasterDataProvider rdp = GeoDataDriver.Open(file, null) as IRasterDataProvider; ArgumentProvider ap = new ArgumentProvider(rdp, null); RasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(ap); visitor.VisitPixel(new int[] { UHEBandCH }, (index, values) => { if (values[0] != 0) { levelIndex = -1; foreach (float key in UHERegions.Keys) { levelIndex++; if (values[0] < key || values[0] >= UHERegions[key]) { continue; } if (uhpi.ContainsKey(HILevel[levelIndex])) { uhpi[HILevel[levelIndex]]++; } else { uhpi.Add(HILevel[levelIndex], 1); } } result.totalCount++; } }); result.UHPI = uhpi; return(result); }
/// <summary> /// 计算实际覆盖度 /// 实际覆盖度=(求和(每像元覆盖度*像元面积))/(指定区域面积,例如太湖) /// </summary> /// <param name="dataProvider"></param> /// <param name="aoi"></param> /// <returns></returns> public float CalcActualConvertDegree(IRasterDataProvider dataProvider, int[] aoi) { double actualArea = 0; double totalArea = aoi.Count() * dataProvider.ResolutionX; Size size = new Size(dataProvider.Width, dataProvider.Height); Rectangle rect = AOIHelper.ComputeAOIRect(aoi, size); ArgumentProvider ap = new ArgumentProvider(dataProvider, null); RasterPixelsVisitor <float> visitor = new RasterPixelsVisitor <float>(ap); //solution 使用横向? visitor.VisitPixel(rect, aoi, new int[] { 1 }, (index, values) => { if (values[0] <= 1f && values[0] >= 0f) { actualArea += values[0] * dataProvider.ResolutionX; } }); return((float)(actualArea / totalArea)); }
private double GetTotalArea(IRasterDataProvider raster, int[] aoi) { IArgumentProvider argPrd = new ArgumentProvider(raster, null); argPrd.AOI = aoi; using (IRasterPixelsVisitor <double> visitor = new RasterPixelsVisitor <double>(argPrd)) { double totalArea = 0; visitor.VisitPixel(new int[] { 1 }, (idx, values) => { if (values[0] >= 0) { totalArea += values[0]; } }); return(totalArea); } }
private Dictionary <int, CLMFeature> GetDisplayInfo(int NDSIVisibleCH, int ShortInfraredCH, int VisibleCH, int FarInfraredCH, bool useNDSI, bool useNearVisiable, bool useFarInfrared, IRasterDataProvider prd) { if (_argumentProvider.DataProvider == null) { return(null); } Dictionary <int, CLMFeature> features = new Dictionary <int, CLMFeature>(); CLMFeature tempCLM = null; RasterPixelsVisitor <UInt16> rpVisitor = new RasterPixelsVisitor <UInt16>(_argumentProvider); if (NDSIVisibleCH == -1) { NDSIVisibleCH = 1; } if (ShortInfraredCH == -1) { ShortInfraredCH = 1; } if (VisibleCH == -1) { VisibleCH = 1; } if (FarInfraredCH == -1) { FarInfraredCH = 1; } rpVisitor.VisitPixel(new Rectangle(0, 0, prd.Width, prd.Height), null, new int[] { NDSIVisibleCH, ShortInfraredCH, VisibleCH, FarInfraredCH }, (index, values) => { tempCLM = new CLMFeature(); tempCLM.Ndsi = (Int16)((values[0] - values[1]) * 1000f / (values[0] + values[1])); tempCLM.Visible = values[2]; tempCLM.FarInfrared = values[3]; tempCLM.nearInfrared = values[1]; tempCLM.UseFarInfrared = useFarInfrared; tempCLM.UseNDSI = useNDSI; tempCLM.UseNearVisiable = useNearVisiable; features.Add(index, tempCLM); } ); return(features); }
private StatResultItem[] DegreeStatCurrentRegion(IRasterDataProvider prd, string title) { double totalArea = 0; using (IArgumentProvider argPrd = new ArgumentProvider(prd, null)) { using (IRasterPixelsVisitor <double> visitor = new RasterPixelsVisitor <double>(argPrd)) { visitor.VisitPixel(new int[] { 1 }, (index, values) => { totalArea += values[0]; }); StatResultItem sri = new StatResultItem(); sri.Name = "当前区域"; sri.Value = (totalArea / _dayCount); return(new StatResultItem[] { sri }); } } }