Esempio n. 1
0
        protected IRasterDataProvider CreateOutM_BandRaster(string outFileName, RasterMaper[] inrasterMaper, int bandcount)
        {
            IRasterDataDriver raster = RasterDataDriver.GetDriverByName("LDF") as IRasterDataDriver;


            CoordEnvelope outEnv = null;

            foreach (RasterMaper inRaster in inrasterMaper)
            {
                if (outEnv == null)
                {
                    outEnv = inRaster.Raster.CoordEnvelope;
                }
                else
                {
                    outEnv.Union(inRaster.Raster.CoordEnvelope);
                }
            }
            float  resX    = inrasterMaper[0].Raster.ResolutionX;
            float  resY    = inrasterMaper[0].Raster.ResolutionY;
            int    width   = (int)(Math.Round(outEnv.Width / resX));
            int    height  = (int)(Math.Round(outEnv.Height / resY));
            string mapInfo = outEnv.ToMapInfoString(new Size(width, height));

            string[] optionString = new string[] {
                "INTERLEAVE=BSQ",
                "VERSION=LDF",
                "WITHHDR=TRUE",
                "SPATIALREF=" + inrasterMaper[0].Raster.SpatialRef == null?"":("SPATIALREF=" + inrasterMaper[0].Raster.SpatialRef.ToProj4String()),
                "MAPINFO={" + 1 + "," + 1 + "}:{" + outEnv.MinX + "," + outEnv.MaxY + "}:{" + resX + "," + resY + "}"
            };
            RasterDataProvider outRaster = raster.Create(outFileName, width, height, bandcount, enumDataType.UInt16, optionString) as RasterDataProvider;

            return(outRaster);
        }
Esempio n. 2
0
        private CoordEnvelope CalcOutRegion(List <string> moasicFileNames)
        {
            CoordEnvelope dstCoordEnvelope = null;

            try
            {
                foreach (string fileName in moasicFileNames)
                {
                    CheckFile(fileName);
                    using (IRasterDataProvider rasterprd = GeoDataDriver.Open(fileName) as IRasterDataProvider)
                    {
                        if (dstCoordEnvelope != null)
                        {
                            dstCoordEnvelope = dstCoordEnvelope.Union(rasterprd.CoordEnvelope);
                        }
                        else
                        {
                            dstCoordEnvelope = rasterprd.CoordEnvelope;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            return(dstCoordEnvelope);
        }
Esempio n. 3
0
        protected IRasterDataProvider CreateOutRaster(string outFileName, RasterMaper[] inrasterMaper)
        {
            IRasterDataDriver raster = RasterDataDriver.GetDriverByName("MEM") as IRasterDataDriver;
            CoordEnvelope     outEnv = null;

            foreach (RasterMaper inRaster in inrasterMaper)
            {
                if (outEnv == null)
                {
                    outEnv = inRaster.Raster.CoordEnvelope;
                }
                else
                {
                    outEnv.Union(inRaster.Raster.CoordEnvelope);
                }
            }
            float              resX      = inrasterMaper[0].Raster.ResolutionX;
            float              resY      = inrasterMaper[0].Raster.ResolutionY;
            int                width     = (int)(Math.Round(outEnv.Width / resX));
            int                height    = (int)(Math.Round(outEnv.Height / resY));
            string             mapInfo   = outEnv.ToMapInfoString(new Size(width, height));
            RasterDataProvider outRaster = raster.Create(outFileName, width, height, 1, enumDataType.Int16, mapInfo) as RasterDataProvider;

            return(outRaster);
        }
Esempio n. 4
0
        private void GetArgument(out Size size, out CoordEnvelope envelope, string[] files)
        {
            float maxResultion      = 0f;
            IRasterDataProvider prd = null;

            envelope = new CoordEnvelope(double.MaxValue, double.MinValue, double.MaxValue, double.MinValue);
            foreach (string file in files)
            {
                try
                {
                    prd          = GeoDataDriver.Open(file) as IRasterDataProvider;
                    maxResultion = Math.Max(maxResultion, prd.ResolutionX);
                    envelope     = envelope.Union(new CoordEnvelope(prd.CoordEnvelope.MinX, prd.CoordEnvelope.MinX + prd.ResolutionX * prd.Width,
                                                                    prd.CoordEnvelope.MinY, prd.CoordEnvelope.MinY + prd.ResolutionY * prd.Height));
                }
                catch
                {
                    throw new ArgumentException("选择的文件:“" + Path.GetFileName(file) + "”无法进行面积统计。");
                }
                finally
                {
                    if (prd != null)
                    {
                        prd.Dispose();
                        prd = null;
                    }
                }
            }
            size = new Size((int)(envelope.Width / maxResultion), (int)(envelope.Height / maxResultion));
        }
Esempio n. 5
0
        private IRasterDataProvider CreateOutRaster(string outFileName, RasterMaper[] inrasterMaper, int extHeaderLength)
        {
            IRasterDataDriver raster = RasterDataDriver.GetDriverByName("MEM") as IRasterDataDriver;
            CoordEnvelope     outEnv = null;
            float             resX   = inrasterMaper[0].Raster.ResolutionX;
            float             resY   = inrasterMaper[0].Raster.ResolutionY;

            foreach (RasterMaper inRaster in inrasterMaper)
            {
                if (outEnv == null)
                {
                    outEnv = inRaster.Raster.CoordEnvelope;
                }
                else
                {
                    outEnv = outEnv.Union(inRaster.Raster.CoordEnvelope);
                }
                if (resX < inRaster.Raster.ResolutionX)
                {
                    resX = inRaster.Raster.ResolutionX;
                }
                if (resY < inRaster.Raster.ResolutionY)
                {
                    resY = inRaster.Raster.ResolutionY;
                }
            }
            int                width     = (int)(Math.Round(outEnv.Width / resX));
            int                height    = (int)(Math.Round(outEnv.Height / resY));
            string             mapInfo   = outEnv.ToMapInfoString(new Size(width, height));
            RasterDataProvider outRaster = raster.Create(outFileName, width, height, 1, enumDataType.UInt16, mapInfo, "EXTHEADERSIZE=" + extHeaderLength) as RasterDataProvider;

            return(outRaster);
        }
Esempio n. 6
0
        protected IRasterDataProvider CreateOutRaster(string outFileName, RasterMaper[] inrasterMaper, float resolution)
        {
            string dir = Path.GetDirectoryName(outFileName);

            if (!string.IsNullOrEmpty(dir))
            {
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
            }
            IRasterDataDriver raster = RasterDataDriver.GetDriverByName("MEM") as IRasterDataDriver;
            CoordEnvelope     outEnv = null;

            foreach (RasterMaper inRaster in inrasterMaper)
            {
                if (outEnv == null)
                {
                    outEnv = inRaster.Raster.CoordEnvelope;
                }
                else
                {
                    outEnv = outEnv.Union(inRaster.Raster.CoordEnvelope);
                }
            }
            float resX, resY;

            if (resolution != 0f)
            {
                resX = resolution;
                resY = resolution;
            }
            else
            {
                resX = inrasterMaper[0].Raster.ResolutionX;
                resY = inrasterMaper[0].Raster.ResolutionY;
                for (int i = 1; i < inrasterMaper.Length; i++)
                {
                    if (resX > inrasterMaper[i].Raster.ResolutionX)
                    {
                        resX = inrasterMaper[i].Raster.ResolutionX;
                    }
                    if (resY > inrasterMaper[i].Raster.ResolutionY)
                    {
                        resY = inrasterMaper[i].Raster.ResolutionY;
                    }
                }
            }
            int                width     = (int)(Math.Round(outEnv.Width / resX));
            int                height    = (int)(Math.Round(outEnv.Height / resY));
            string             mapInfo   = outEnv.ToMapInfoString(new Size(width, height));
            RasterDataProvider outRaster = raster.Create(outFileName, width, height, 1, enumDataType.Int16, mapInfo) as RasterDataProvider;

            return(outRaster);
        }
Esempio n. 7
0
        public bool ComputeMaxEnvelope(string[] fnames, out CoordEnvelope outEnvelope, out Size size)
        {
            outEnvelope = null;
            size        = Size.Empty;
            if (fnames == null || fnames.Length == 0)
            {
                return(false);
            }
            float resX = 0;
            float resY = 0;

            foreach (string f in fnames)
            {
                if (string.IsNullOrEmpty(f))
                {
                    continue;
                }
                try
                {
                    using (IRasterDataProvider prd = GeoDataDriver.Open(f) as IRasterDataProvider)
                    {
                        if (prd == null)
                        {
                            continue;
                        }
                        if (outEnvelope == null)
                        {
                            outEnvelope = prd.CoordEnvelope.Clone();
                            resX        = prd.ResolutionX;
                            resY        = prd.ResolutionY;
                        }
                        else
                        {
                            outEnvelope = outEnvelope.Union(prd.CoordEnvelope);
                        }
                    }
                }
                catch
                {
                    throw;
                }
            }
            size = new Size((int)(outEnvelope.Width / resX), (int)(outEnvelope.Height / resY));
            return(true);
        }
Esempio n. 8
0
        public static bool SetAOIArugment(string[] fnames, IMonitoringSubProduct msp, bool multiSelect, Dictionary <string, string> fileNameList)
        {
            float maxResultion           = 0f;
            IRasterDataProvider prd      = null;
            CoordEnvelope       envelope = new CoordEnvelope(double.MaxValue, double.MinValue, double.MaxValue, double.MinValue);

            foreach (string item in fnames)
            {
                try
                {
                    prd          = GeoDataDriver.Open(item) as IRasterDataProvider;
                    maxResultion = Math.Max(maxResultion, prd.ResolutionX);
                    envelope     = envelope.Union(new CoordEnvelope(prd.CoordEnvelope.MinX, prd.CoordEnvelope.MinX + prd.ResolutionX * prd.Width,
                                                                    prd.CoordEnvelope.MinY, prd.CoordEnvelope.MinY + prd.ResolutionY * prd.Height));
                }
                catch
                {
                    throw new ArgumentException("选择的文件:“" + Path.GetFileName(item) + "”无法进行面积统计。");
                }
                finally
                {
                    if (prd != null)
                    {
                        prd.Dispose();
                        prd = null;
                    }
                }
            }
            Size size = new Size((int)(envelope.Width / maxResultion), (int)(envelope.Height / maxResultion));

            using (frmStatCustomSubRegionTemplates frm = new frmStatCustomSubRegionTemplates(size, envelope, maxResultion, fileNameList))
            {
                frm.listView1.MultiSelect = multiSelect;
                if (frm.ShowDialog() == DialogResult.OK)
                {
                    msp.ArgumentProvider.SetArg("AOI", frm.GetFeatureAOIIndex());
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
Esempio n. 9
0
        private IRasterDataProvider CreateOutputFile(RasterMaper[] inputRasterMapers, string outFileName, float resolution)
        {
            IRasterDataDriver raster = RasterDataDriver.GetDriverByName("MEM") as IRasterDataDriver;
            CoordEnvelope     outEnv = null;

            foreach (RasterMaper maper in inputRasterMapers)
            {
                if (outEnv == null)
                {
                    outEnv = maper.Raster.CoordEnvelope;
                }
                else
                {
                    outEnv = outEnv.Union(maper.Raster.CoordEnvelope);
                }
            }
            int                width     = (int)(Math.Round(outEnv.Width / resolution));
            int                height    = (int)(Math.Round(outEnv.Height / resolution));
            string             mapInfo   = outEnv.ToMapInfoString(new Size(width, height));
            RasterDataProvider outRaster = raster.Create(outFileName, width, height, 1, inputRasterMapers[0].Raster.DataType, mapInfo) as RasterDataProvider;

            return(outRaster);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        public static bool SetAOIArugment(string[] fnames, IMonitoringSubProduct msp, bool multiSelect, out CoordEnvelope selectedEnvelope)
        {
            float maxResultion           = 0f;
            IRasterDataProvider prd      = null;
            CoordEnvelope       envelope = new CoordEnvelope(double.MaxValue, double.MinValue, double.MaxValue, double.MinValue);

            GeoDo.Project.ISpatialReference prdSpatialRef = null;
            foreach (string item in fnames)
            {
                try
                {
                    prd          = GeoDataDriver.Open(item) as IRasterDataProvider;
                    maxResultion = Math.Max(maxResultion, prd.ResolutionX);
                    envelope     = envelope.Union(new CoordEnvelope(prd.CoordEnvelope.MinX, prd.CoordEnvelope.MinX + prd.ResolutionX * prd.Width,
                                                                    prd.CoordEnvelope.MinY, prd.CoordEnvelope.MinY + prd.ResolutionY * prd.Height));
                    prdSpatialRef = prd.SpatialRef;
                }
                catch
                {
                    throw new ArgumentException("选择的文件:“" + Path.GetFileName(item) + "”无法进行面积统计。");
                }
                finally
                {
                    if (prd != null)
                    {
                        prd.Dispose();
                        prd = null;
                    }
                }
            }
            Size size = new Size((int)(envelope.Width / maxResultion), (int)(envelope.Height / maxResultion));

            using (frmStatSubRegionTemplates frm = new frmStatSubRegionTemplates(size, envelope, maxResultion))
            {
                frm.listView1.MultiSelect = multiSelect;
                if (prdSpatialRef != null)
                {
                    frm.SpatialRef = prdSpatialRef;
                }
                if (frm.ShowDialog() == DialogResult.OK)
                {
                    //Feature[] features = frm.GetSelectedFeatures();
                    //AOIProvider aoiProvider = new AOIProvider(null);
                    //aoiProvider.GetBitmapIndexes
                    msp.ArgumentProvider.SetArg("AOI", frm.GetFeatureAOIIndex());
                    msp.ArgumentProvider.SetArg("AOIFeatures", frm.GetSelectedFeatures());
                    CodeCell.AgileMap.Core.Envelope env = frm.GetSelectedEnvelope();
                    if (env != null)
                    {
                        selectedEnvelope = new CoordEnvelope(env.MinX, env.MaxX, env.MinY, env.MaxY);
                    }
                    else
                    {
                        selectedEnvelope = null;
                    }
                    return(true);
                }
                else
                {
                    selectedEnvelope = null;
                    return(false);
                }
            }
        }