예제 #1
0
 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
     {
     }
 }
예제 #2
0
        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();
            }
        }
예제 #3
0
        protected override int[] DoFilter(IRasterDataProvider dataProvider, Rectangle aoiRect, int[] aoi, byte[] assistInfo)
        {
            List <int> retAOI = new List <int>(aoi.Length);

            using (IRasterPixelsVisitor <UInt16> visitor = new RasterPixelsVisitor <UInt16>(_argProvider))
            {
                int[] bandNos = new int[] { _midInfraredBandNo, _farInfraredBandNo };
                visitor.VisitPixelWnd(aoiRect, aoi, bandNos, bandNos, _minWndSize, _maxWndSize,
                                      (pixelIdx, crtWndSize, bandValues, wndValues) =>
                {
                    return(GetCount(bandValues, wndValues) < _abnormalPixelCount);
                },
                                      (pixelIdx, crtWndSize, bandValues, wndValues) =>
                {
                    int count = GetCount(bandValues, wndValues);
                    //
                    if (count >= _abnormalPixelCount)
                    {
                        retAOI.Add(pixelIdx);
                        if (assistInfo != null)
                        {
                            assistInfo[pixelIdx] = 1;
                        }
                    }
                });
            }
            return(retAOI.Count > 0 ? retAOI.ToArray() : null);
        }
예제 #4
0
        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);;
        }
예제 #5
0
        /// <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;
            }
        }
예제 #6
0
 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();
     }
 }
예제 #7
0
        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);
        }
예제 #8
0
        //微波积雪判识
        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);;
        }
예제 #9
0
        /// <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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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();
            }
        }
예제 #12
0
        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);
        }
예제 #13
0
        //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);
                }
            }
        }
예제 #14
0
        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));
            }
        }
예제 #15
0
        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);
        }
예제 #16
0
        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);
        }
예제 #17
0
        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();
            }
        }
예제 #18
0
파일: Form1.cs 프로젝트: configare/hispeed
        //通过读取历史判识文件获取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("能见度计算完成!");
        }
예제 #19
0
 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);
 }
예제 #20
0
        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);
        }
예제 #21
0
파일: Form1.cs 프로젝트: configare/hispeed
        private void button5_Click(object sender, EventArgs e)
        {
            string fname = @"f:\\FY3A_Mersi_2010_06_24_10_00_1000M_L1B_PRJ_Whole.LDF";
            //fname = @"f:\\FY3A_MERSI_2010_06_24_10_00_1000M_L1B - 副本.HDF";
            IRasterDataProvider          prd    = GeoDataDriver.Open(fname) as IRasterDataProvider;
            ArgumentProvider             argPrd = new ArgumentProvider(prd, null);
            RasterPixelsVisitor <UInt16> ext    = new RasterPixelsVisitor <ushort>(argPrd);
            Stopwatch sw = new Stopwatch();

            sw.Start();
            ext.VisitPixelWnd(new int[] { 1 }, new int[] { 5 },
                              3, 9, new Func <int, int, ushort[], ushort[][], bool>(IsNeedIncWndSize),
                              new Action <int, int, ushort[], ushort[][]>(Extract));
            sw.Stop();
            Text = sw.ElapsedMilliseconds.ToString();
        }
예제 #22
0
        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();
                }
            }
        }
예제 #23
0
파일: Form1.cs 프로젝트: configare/hispeed
        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();
        }
예제 #24
0
        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;
            }
        }
예제 #25
0
        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);
        }
예제 #26
0
 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);
                 }
             });
         }
     }
 }
예제 #27
0
        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;
            }
        }
예제 #28
0
        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);
        }
예제 #29
0
        /// <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));
        }
예제 #30
0
        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);
            }
        }