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); }
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); }
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); }
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)); }
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); }
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); }
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); }
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); }
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); }
public IInterestedRaster <T> CycleTimes(IRasterDataProvider[] srcRasters, RasterIdentify rasterIdentify, Func <int, T, T, T> iTimesGetter, Action <int, string> progress) { ////修改不同区域生成结果文件大小不足问题 by chennan 20120806 //CoordEnvelope dstEnvelope = srcRasters[srcRasters.Length - 1].CoordEnvelope; CoordEnvelope dstEnvelope = GetEnvelopeBySize(srcRasters[srcRasters.Length - 1]); float minResolutionX = 0f; float minResolutionY = 0f; Size dstSize = Size.Empty;; for (int i = 0; i < srcRasters.Length - 1; i++) { if (srcRasters[i].DataType != srcRasters[i + 1].DataType) { throw new ArgumentException("数据类型不一致无法进行频次统计!"); } dstEnvelope = dstEnvelope.Union(GetEnvelopeBySize(srcRasters[i])); // by chennan 20120806 minResolutionX = Math.Min(srcRasters[i].ResolutionX, srcRasters[i + 1].ResolutionX); minResolutionY = Math.Min(srcRasters[i].ResolutionY, srcRasters[i + 1].ResolutionY); dstSize = new Size((int)Math.Floor(dstEnvelope.Width / minResolutionX), (int)Math.Floor(dstEnvelope.Height / minResolutionY)); } //by chennan 20121025 修改单文件无法进行周期统计 if (srcRasters.Length == 1) { minResolutionX = srcRasters[0].ResolutionX; minResolutionY = srcRasters[0].ResolutionY; dstEnvelope = srcRasters[0].CoordEnvelope.Clone(); dstSize = new Size(srcRasters[0].Width, srcRasters[0].Height); } IInterestedRaster <T> dstRaster = CreateDstRaster(srcRasters[0], dstEnvelope, rasterIdentify, dstSize); IArgumentProvider argprd = new ArgumentProvider(new AlgorithmDef()); int offsetX = 0, offsetY = 0; int dstIndex = 0; int index = 0; foreach (IRasterDataProvider rst in srcRasters) { if (progress != null) { progress((int)(index++ *100f / srcRasters.Length), "正在执行周期统计"); } CoordEnvelope inc = rst.CoordEnvelope.Intersect(dstEnvelope); if (inc == null || inc.IsEmpty()) { continue; } int iCycle = Array.IndexOf <IRasterDataProvider>(srcRasters, rst) + 1; offsetX = (int)((rst.CoordEnvelope.MinX - dstEnvelope.MinX) / rst.ResolutionX); offsetY = (int)((dstEnvelope.MaxY - rst.CoordEnvelope.MaxY) / rst.ResolutionY); //by chennan 20120806 IRasterDataProvider dstTempPrd = GetSubPrd <T>(dstRaster.HostDataProvider, rst, rasterIdentify, offsetX, offsetY); try { IVirtualRasterDataProvider virtualDataProvider = new VirtualRasterDataProvider(new IRasterDataProvider[] { dstTempPrd, rst }); argprd.DataProvider = virtualDataProvider; using (IRasterPixelsVisitor <T> visitor = new RasterPixelsVisitor <T>(argprd)) { visitor.VisitPixel(new int[] { 1, 2 }, (idx, values) => { dstIndex = (idx / dstTempPrd.Width + offsetY) * dstRaster.HostDataProvider.Width + (idx % dstTempPrd.Width + offsetX); dstRaster.Put(dstIndex, iTimesGetter(iCycle, values[0], values[1])); }); } } finally { dstTempPrd.Dispose(); if (File.Exists(dstTempPrd.fileName)) { File.Delete(dstTempPrd.fileName); } } } for (int i = 0; i < srcRasters.Length; i++) { srcRasters[i].Dispose(); } return(dstRaster); }
public IInterestedRaster <T> Times(IRasterDataProvider[] srcRasters, RasterIdentify rasterIdentify, Action <int, string> progressTracker, Func <T, T, T> timesAction) { CoordEnvelope dstEnvelope = GetEnvelopeBySize(srcRasters[srcRasters.Length - 1]); float minResolutionX = 0f; float minResolutionY = 0f; Size dstSize = Size.Empty; for (int i = 0; i < srcRasters.Length - 1; i++) { if (srcRasters[i].DataType != srcRasters[i + 1].DataType) { throw new ArgumentException("数据类型不一致无法进行频次统计!"); } dstEnvelope = dstEnvelope.Union(GetEnvelopeBySize(srcRasters[i])); minResolutionX = Math.Min(srcRasters[i].ResolutionX, srcRasters[i + 1].ResolutionX); minResolutionY = Math.Min(srcRasters[i].ResolutionY, srcRasters[i + 1].ResolutionY); dstSize = new Size((int)Math.Round(dstEnvelope.Width / minResolutionX), (int)Math.Round(dstEnvelope.Height / minResolutionY)); } if (srcRasters.Length == 1) { minResolutionX = srcRasters[0].ResolutionX; minResolutionY = srcRasters[0].ResolutionY; dstEnvelope = srcRasters[0].CoordEnvelope.Clone(); dstSize = new Size(srcRasters[0].Width, srcRasters[0].Height); } IInterestedRaster <T> dstRaster = CreateDstRaster(srcRasters[0], dstEnvelope, rasterIdentify, dstSize); IArgumentProvider argprd = new ArgumentProvider(new AlgorithmDef()); int offsetX = 0, offsetY = 0; int dstIndex = 0; if (progressTracker != null) { progressTracker(0, "开始进行统计..."); } int num = 0; foreach (IRasterDataProvider rst in srcRasters) { offsetX = (int)((rst.CoordEnvelope.MinX - dstEnvelope.MinX) / rst.ResolutionX); offsetY = (int)((dstEnvelope.MaxY - rst.CoordEnvelope.MaxY) / rst.ResolutionY); //by chennan 20120806 IRasterDataProvider dstTempPrd = GetSubPrd <T>(dstRaster.HostDataProvider, rst, rasterIdentify, offsetX, offsetY); try { IVirtualRasterDataProvider virtualDataProvider = new VirtualRasterDataProvider(new IRasterDataProvider[] { dstTempPrd, rst }); argprd.DataProvider = virtualDataProvider; using (IRasterPixelsVisitor <T> visitor = new RasterPixelsVisitor <T>(argprd)) { visitor.VisitPixel(new int[] { 1, 2 }, (idx, values) => { dstIndex = (idx / dstTempPrd.Width + offsetY) * dstRaster.HostDataProvider.Width + (idx % dstTempPrd.Width + offsetX); dstRaster.Put(dstIndex, timesAction(values[0], values[1])); }); } num++; int persent = (int)(num * 100f / srcRasters.Length); if (progressTracker != null) { progressTracker(persent, "统计完成" + persent + "%"); } } finally { dstTempPrd.Dispose(); if (File.Exists(dstTempPrd.fileName)) { File.Delete(dstTempPrd.fileName); } } if (progressTracker != null) { progressTracker(100, "统计完成"); } } for (int i = 0; i < srcRasters.Length; i++) { srcRasters[i].Dispose(); } return(dstRaster); }
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); } } }