收藏 分销(赏)

ArcGIS栅格处理总结.docx

上传人:xrp****65 文档编号:6554275 上传时间:2024-12-13 格式:DOCX 页数:25 大小:98.31KB 下载积分:10 金币
下载 相关 举报
ArcGIS栅格处理总结.docx_第1页
第1页 / 共25页
ArcGIS栅格处理总结.docx_第2页
第2页 / 共25页


点击查看更多>>
资源描述
ArcGIS栅格处理总结 RealStyle-赵晓鲁 2012年9月28日 处理栅格数据用到的新的接口有:iconditionalop,Ipnt,IRasterDescriptor, IextractionOp,IrasterLayerExport,IRasterAnalysisEnvironment,ILogicalOp,IReclassOp,IMathOp,INumberRemap,IRemap,ISurfaceop,Irawpixels(很有用) 坐标值位置: 地图坐标最小X、Y值在左下角,IEnvelope最小值是左下角,最大值是右上角,栅格数据最小行列值是在左上角,最大行列值是在右下角。 IRasterAnalysisEnvironment:一般和IextractionOp一起用,用来设置提取出来的栅格数据的一些属性信息。 遍历栅格数据所有数据,将像素值存储在二维数组中 IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\栅格数据处理集\Temp\data", 0) as IRasterWorkspace ; IRaster pRaster = pRwks.OpenRasterDataset("003647.tif").CreateDefaultRaster(); IRasterProps pRprops = pRaster as IRasterProps ; IRasterBandCollection pRbcoll = pRaster as IRasterBandCollection ; int pRbcount = pRbcoll.Count ; IPixelBlock3 pPblock3 = null; GC.Collect();//释放内存,强制回收垃圾内存 byte[,] pByte = new byte[pRprops.Width, pRprops.Height * pRbcount];//内存占有量为byte类型所占的字节数*pRprops.Width*pRprops.Height * pRbcount System.Array pArray = null;//定义一个数组,用来存储pPblock3.get_PixelData(pTindex)获得的像素块的值 for (int pTindex = 0; pTindex < pRbcount; pTindex++)//遍历每个波段 { IRasterCursor pRcursor = pRaster.CreateCursor();//128行,全部列是一个pRcursor.Next(), do { pPblock3 = pRcursor.PixelBlock as IPixelBlock3;//将每个128行的值放在pPblock3中 pArray = pPblock3.get_PixelData(pTindex) as System.Array;//将相应波段的数值存储在数组中 for (int pW = 0; pW < pArray.GetLength(0); pW++)//列数 { for (int pH = 0; pH < pArray.GetLength(1); pH++)//行数 { pByte[pW, pH * (pTindex + 1)] = Convert.ToByte (pArray.GetValue(pW, pH));//给二维数组赋值 } } } while (pRcursor.Next());//获得下一个128行栅格数据 ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(pRcursor );//对对象进行内存释放 }//遍历每个波段 for (int pT = 0; pT < pByte.GetLength(0); pT++)//遍历二维数组 { for (int pTT = 0; pTT < pByte.GetLength(1); pTT++) { int pp = Convert.ToInt32(pByte.GetValue(pT, pTT)); } }//遍历二维数组 1、 如果想将Tif转换为bmp,仅仅需要用到的AO的接口是Isaveas。 IWorkspaceFactory pWksfact=newRasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\Temp",0 ) as IRasterWorkspace ; IRasterDataset pRdataset = pRwks.OpenRasterDataset("cbers.tif"); IRaster2 pRaster = pRdataset.CreateDefaultRaster() as IRaster2 ; IRasterWorkspace2pRwks2=pWksfact.OpenFromFile(@"F:\Temp",0)asIRasterWorkspace2; ISaveAs pSaveas = pRaster as ISaveAs ; pSaveas.SaveAs("pCreat.BMP", pRwks2 as IWorkspace, "BMP"); 2、 修改栅格数据灰度值:没有用到isaveas 用到的接口是:IRasterCursor,IPixelBlock3,System.Array pArray ,IRasterEdit,IPnt IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace2 pRwks = pWksfact.OpenFromFile(@"F:\Temp", 0) as IRasterWorkspace2 ; IRaster2 pRaster = pRwks.OpenRasterDataset("cbers.tif").CreateDefaultRaster() as IRaster2 ; IRasterProps pRprops = pRaster as IRasterProps; IPoint pPoint = new PointClass () ; pPoint.PutCoords (0,0 ) ; IPnt pPnt = new DblPntClass(); pPnt.SetCoords(pRprops.Width,pRprops.Height );//确定范围 IRasterCursor pRcursor = pRaster.CreateCursorEx( pPnt );//确定一个栅格指针的范围,ex:extent,所有要用ppnt, IPixelBlock3 pPblock = pRcursor.PixelBlock as IPixelBlock3 ; System.Array pArray = pPblock.get_PixelData(0) as System.Array; for (int pWidth = 0 ;pWidth < pRprops.Width ;pWidth ++ ) { for (int pHeight = 0; pHeight < pRprops.Height; pHeight ++ ) { if (Convert.ToInt32(pPblock.GetVal(0, pWidth, pHeight)) == 0) { pArray.SetValue(Convert.ToByte ( 100),pWidth,pHeight);//将像素值存在数组里面 } } } pPblock.set_PixelData(0, pArray);//对像素块进行修改 IRasterEdit pRedit = pRaster as IRasterEdit; IPnt pDblpnt = new DblPntClass(); pDblpnt.SetCoords(0,0 );//pdblpnt指的是左上角的坐标 pRedit.Write(pDblpnt , pPblock as IPixelBlock);//将灰度块写入栅格数据 栅格数据二值化:目的:一个是数据处理源的需要,再一个目的是栅格数据的大小可以变得很小。 IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\栅格数据处理集\Temp\data",0) as IRasterWorkspace ; IRaster pRaster = pRwks.OpenRasterDataset("create1.tif").CreateDefaultRaster(); IGeoDataset pGeodataset = pRaster as IGeoDataset; IEnvelope pEnv = pGeodataset.Extent; IRasterCursor pRcursor = pRaster.CreateCursor(); IRasterProps pRprops = pRaster as IRasterProps ; //创建一个二值的图像 IRasterWorkspace2 pRwks2 = pRwks as IRasterWorkspace2; IPoint pPoint = new PointClass () ; pPoint.PutCoords (pEnv.XMin ,pEnv.YMin ) ; if (Directory.Exists(@"F:\栅格数据处理集\Temp\data\TwoValue")) { IDataset pDds = pRwks2.OpenRasterDataset("TwoValue") as IDataset; if (pDds != null) pDds.Delete(); } IRasterDataset pRdataset = pRwks2.CreateRasterDataset( "TwoValue.tif","TIFF",pPoint ,pRprops.Width,pRprops.Height ,pRprops.MeanCellSize().X,pRprops.MeanCellSize().Y ,1,rstPixelType.PT_U1 ,pRprops.SpatialReference,true );//创建一个栅格数据集 IRaster pcR = pRwks.OpenRasterDataset ("TwoValue.tif").CreateDefaultRaster () ; System.Array pChangearr = new byte [pRprops.Width,pRprops.Height ];//定义一个二维数组,用来存储二值化的数据。 int pT = 0 ; int Pa = pRprops.Height / 128; do { IPixelBlock3 pPb = pRcursor.PixelBlock as IPixelBlock3; System.Array pArray = pPb.get_PixelData(0) as System.Array ; int pHH = 0; Pa = pRprops.Height / 128 -pT; pT = pT + 1; if (Pa >= 1) { pHH = 128; } else { pHH = pRprops.Height % 128; } for (int pH = 0; pH < pHH ; pH++) { for (int pW = 0; pW < pRprops.Width; pW++) { if (Convert.ToByte ( pArray.GetValue(pW, pH)) == 1) { pChangearr.SetValue(pArray.GetValue(pW, pH), pW, pH + 128 * (pT - 1));//赋值定义的数组 } } } } while (pRcursor.Next () ) ;//每128行遍历一次 IRaster2 pR2 =pRaster as IRaster2 ; IPnt pPnt = new DblPntClass () ; pPnt.SetCoords (pRprops.Width ,pRprops.Height ) ; IRasterCursor pR2cursor = pR2.CreateCursorEx (pPnt ) ; IPixelBlock3 pSpb = pR2cursor.PixelBlock as IPixelBlock3; IPnt pSpnt = new DblPntClass(); pSpnt.SetCoords(0, 0); pSpb.set_PixelData(0, pChangearr);//将数组赋值给pSpb IRasterEdit pRedit = pcR as IRasterEdit; pRedit.Write(pSpnt, pSpb as IPixelBlock);//编辑栅格数据集,写完后,栅格数据就会是现在的值 模板提取: //找到模板,并将模板放在数组里 IWorkspaceFactory pRwksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pRwksfact.OpenFromFile(@"F:\栅格数据处理集\Temp\data", 0) as IRasterWorkspace ; IRaster pModelraster = pRwks.OpenRasterDataset("extract_17001").CreateDefaultRaster(); IRaster2 pModelraster2 = pModelraster as IRaster2; IRasterProps pModelRprops = pModelraster as IRasterProps; //pModelRprops.NoDataValue = 0; IPnt pModelpnt = new DblPntClass(); pModelpnt.SetCoords(pModelRprops.Width,pModelRprops.Height ); IRasterCursor pModelrcursor = pModelraster2.CreateCursorEx(pModelpnt); IPixelBlock3 pModelppb3 = pModelrcursor.PixelBlock as IPixelBlock3; System.Array pModelarray = pModelppb3.get_PixelData(0) as System.Array; //找到模板,并将模板放在数组里 //找到源文件,将源文件存放到数组里 IRaster pOriraster = pRwks.OpenRasterDataset("17002L1").CreateDefaultRaster(); IRaster2 pOriraster2 = pOriraster as IRaster2; IRasterProps pOrirprops = pOriraster2 as IRasterProps; //pOrirprops.NoDataValue = 0; IPnt pOripnt = new DblPntClass(); pOripnt.SetCoords(pOrirprops.Width, pOrirprops.Height); IRasterCursor pOrircursor = pOriraster2.CreateCursorEx(pOripnt); IPixelBlock3 pOripb3 = pOrircursor.PixelBlock as IPixelBlock3; System.Array pOriarray = pOripb3.get_PixelData(0) as System.Array; //找到源文件,将源文件存放到数组里 //创建一个二值的栅格数据 if (Directory.Exists(@"F:\栅格数据处理集\Temp\data\PCreate")) { IDataset pTds = pRwks.OpenRasterDataset("PCreate") as IDataset; pTds.Delete(); } IGeoDataset pTgeodataset = pOriraster as IGeoDataset; IEnvelope pTenv = pTgeodataset.Extent; IPoint pCpoint = new PointClass(); pCpoint.PutCoords(pTenv.XMin, pTenv.YMin); IRasterWorkspace2 pRwks2 = pRwks as IRasterWorkspace2 ; IRasterDataset pCrdataset = pRwks2.CreateRasterDataset("PCreate","GRID",pCpoint,pOrirprops.Width,pOrirprops.Height,pOrirprops.MeanCellSize().X ,pOrirprops.MeanCellSize().Y ,1,rstPixelType.PT_U1 ,pOrirprops.SpatialReference,true ); //创建一个二值的栅格数据 //创建一个二维数组 System.Array pCarray = new byte [pOrirprops.Width ,pOrirprops.Height]; //计算模板中所有值平方的相加和 double pModelsun = 0; int pTemp = 0; for (int pH = 0; pH < pModelRprops.Height; pH++) { for (int pW = 0; pW < pModelRprops.Width;pW ++ ) { if (Convert.ToSByte ( pModelarray.GetValue (pW,pH ))>=0 ) { pTemp = Convert.ToInt16 ( pModelarray.GetValue(pW, pH)); pModelsun = pModelsun + (Math.Pow(pTemp, 2)); } } } //遍历原始栅格数据的行列 double pMOmulti = 0; double pOrisun = 0; int pTMod = 0; int pTori = 0; double pScale = 0; for (int pH = 0; pH < pOrirprops.Height - pModelRprops.Height; pH++)//遍历每行 { try { for (int pW = 0; pW < pOrirprops.Width - pModelRprops.Width; pW++)//遍历每列 { if (Convert.ToSByte(pOriarray.GetValue(pW, pH)) >= 0) { pMOmulti = 0; pOrisun = 0; pTMod = 0; pTori = 0; for (int pMh = 0; pMh < pModelRprops.Height; pMh++)//遍历模型行 { for (int pMw = 0; pMw < pModelRprops.Width; pMw++)//遍历模型列 { if (Convert.ToSByte(pModelarray.GetValue(pMw, pMh)) >= 0) { pTori = Convert.ToSByte(pOriarray.GetValue(pW + pMw, pH + pMh)); pTMod = Convert.ToSByte(pModelarray.GetValue(pMw, pMh)); pMOmulti = pMOmulti + pTori * pTMod; pOrisun = pOrisun + Math.Pow(pTori, 2); } } } } if (pOrisun > 0) { pScale = pMOmulti / (Math.Sqrt(pModelsun) * Math.Sqrt(pOrisun)); if (pScale > 0.9) { for (int pMh = 0; pMh < pModelRprops.Height; pMh++)//遍历模型行 { for (int pMw = 0; pMw < pModelRprops.Width; pMw++)//遍历模型列 { pCarray.SetValue(Convert.ToByte (pOriarray.GetValue(pW + pMw, pH + pMh)), pW + pMw, pH + pMh); } } } } } } catch { continue ; } } IRaster pCraster = pRwks.OpenRasterDataset("PCreate").CreateDefaultRaster(); IRaster2 pCr2 = pCraster as IRaster2; IRasterProps pCrprops = pCr2 as IRasterProps; IPnt pCpnt = new PntClass(); pCpnt.SetCoords(pCrprops.Width, pCrprops.Height); IRasterCursor pCrcur = pCr2.CreateCursorEx(pCpnt); IPixelBlock3 pCpb = pCrcur.PixelBlock as IPixelBlock3 ; pCpb.set_PixelData(0, pCarray); IRasterEdit pRedit = pCraster as IRasterEdit; IPnt pTlpnt = new PntClass(); pTlpnt.SetCoords(0, 0); pRedit.Write(pTlpnt, pCpb as IPixelBlock); pixel value是栅格象元的值,stretched value是该象元显示时用的值。因显示器显示时必须把象元值转换到0—255显示,所以就有了stretched value。 IRasterProps pRprops = pRaster as IRasterProps; pRprops.NoDataValue = 2;为空白区域赋值,将nodata空白区域赋上pixel值,而不是stretched value。 单元值可正可负,可以是整型也可以是浮点型。在单元中,还可以使用 NoData 值来表示数据缺失。 显示具有 NoData 值的栅格时,所有渲染器可将 NoData 值设置为某个颜色或无颜色;然而,“拉伸”渲染器可识别特定背景值并显示颜色或无颜色。 Nodata相关操作 在栅格数据进行叠加运算时,如果有些区域的值为nodata那么这些区域的值和其他任何栅格数据相加的在值都是nodata,所以有时候需要将nodata区域设置为0。 可以通过SetNull将有些值设置为nodata,也可以通过IsNull来确定哪些区域是nodata区域。 ILogicalOp pLogicalop = new RasterMathOpsClass();//获得ILogicalop接口,用于数学运算 IRaster pOutr = pLogicalop.IsNull(pRaster as IGeoDataset ) as IRaster ;//如果数据缺失,那么输出为1,否则输出为0. Con 可以将栅格数据中的某些值(通过条件查询)设置为想要的区域,将某些不想要的区域设置为其它值(可以是自己设置的也可以是输入的固定值) IConditionalOp: 方法Con, IConditionalOp. Con(IGeoDataset conditionalRaster, IGeoDataset trueRaster, ref object falseRaster) 方法: 不管conditionalRaster是仅有0和1的值,还是有多个值的栅格数据, 只要是值大于0的栅格像素值,赋的值都是trueRaster,凡是值等于0的栅格像素值那么赋值为falseRaster,falseRaster可以为一个常数,也可以为一个栅格数据集(Raster)对应的像素值。 IConditionalOp. Con代码 IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\栅格数据处理集\Temp\data", 0) as IRasterWorkspace ; IRaster pRaster = pRwks.OpenRasterDataset("cbers.tif").CreateDefaultRaster(); IRaster pSraster = new RasterClass(); //object pint = 100;//object为常数 object pRa = pRaster;//object为栅格数据集 IConditionalOp pConditionalop = new RasterConditionalOpClass(); //pSraster = pConditionalop.Con(pRaster as IGeoDataset, pRaster as IGeoDataset , ref pint) as IRaster ;//object为常数 pSraster = pConditionalop.Con(pRaster as IGeoDataset, pRaster as IGeoDataset, ref pRa) as IRaster;//object为栅格数据集 ISaveAs pSa = pSraster as ISaveAs; pSa.SaveAs("nihao2.tif", pRwks as IWorkspace, "TIFF"); 使用“设为空函数”将值设置为 NoData:在spatial analyst下的conditional下的set null。 要将值大于 5 的像元设置为 NoData,并且保留其他像元的原始值,请在工具对话框中使用以下参数: 输入条件栅格:InRas1 表达式:"Value < 5"(条件) 求值结果为 False 的输入栅格或常数值:InRas1(即不符合条件的像素值设置为输入栅格对应的值) 输出栅格:setnull_1 IConditionalOp:只是针对栅格数据只有两个值的0和1的栅格,如果只有0和1,那么将值为1的设置为空,值为0的仍然为0,或者是其它栅格(False Raster)数据相应位置的值。或者栅格数据有多个值,0和大于0两类,当栅格数据有多个值时,值大于0的设置为空,值等于0的仍然是0或者是其它栅格数据(False Raster)相应位置的值。和conditional下的set null理解差不多,但是有区别,不能设置”sql语句”。 将大于0的值变为nodata,将等于0的值变为falseraster的栅格像素值。 用到的接口是 IConditionalOp方法是: SetNull 相应 的代码: IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\Temp",0) as IRasterWorkspace ; IRaster2 pRaster = pRwks.OpenRasterDataset("cbers.tif").CreateDefaultRaster() as IRaster2; IRaster2 pR2 = pRwks.OpenRasterDataset("hh").CreateDefaultRaster() as IRaster2; IConditionalOp pCondi = new RasterConditionalOpClass(); IGeoDataset pDataset = pRaster as IGeoDataset; IGeoDataset pFdataset = pR2 as IGeoDataset; IGeoDataset pOutdataset = pCondi.SetNull(pDataset ,pFdataset ); ISaveAs pSa = pOutdataset as ISaveAs; pSa.SaveAs( "nihao.tif",pRwks as IWorkspace ,"TIFF" ); 通过一个面的范围来提取栅格数据: IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\Temp",0) as IRasterWorkspace ; IRaster2 pRaster = pRwks.OpenRasterDataset("cbers.tif").CreateDefaultRaster() as IRaster2; IRasterProps pRprops = pRaster as IRasterProps ; IExtractionOp pExtra = new RasterExtractionOpClass(); IWorkspaceFactory pSwksfact = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pFwks = pSwksfact.OpenFromFile(@"F:\Temp", 0) as IFeatureWorkspace ; IFeatureClass pFclass = pFwks.OpenFeatureClass("mian"); IFeatureCursor pFcur = pFclass.Search(null,false ); IFeature pFeature = pFcur.NextFeature(); IPolygon pPolygon = pFeature.Shape as IPolygon ; IWorkspace pOutwks = pWksfact.OpenFromFile(@"F:\Temp", 0); IGeoDataset pGeodataset = pRaster as IGeoDataset; IGeoDataset pOutgd = pExtra.Polygon(pGeodataset ,pPolygon,true ) as IGeoDataset ;//true指的是面内的栅格提取出来,false指的是面外的栅格数据提取出来, IRaster pOutr = pOutgd as IRaster;//将Geodataset转换为iraster,而不是转换为irasterdataset,用isaveas来保存存储在内存中的栅格数据。 ISaveAs pSa = (ISaveAs ) pOutr ; pSa.SaveAs("jj.tif", pOutwks, "TIFF");//poutwks一定要是栅格工作空间工厂打开的工作空间,不能是其它工作空间工厂打开的工作空间。 通过属性提取栅格数据 IWorkspaceFactory pWksfact = new RasterWorkspaceFactoryClass(); IRasterWorkspace pRwks = pWksfact.OpenFromFile(@"F:\Temp",0) as IRasterWorkspace ; IRaster2 pRaster = pRwks.OpenRasterDataset("cbers.tif").CreateDefaultRaster() as IRaster2; IRasterProps pRprops = pRaster as IRasterProps ; IExtractionOp pExtra = new RasterExtractionOpClass(); IQueryFilter pQueryfilter = new QueryFilterClass () ;//属性查询,查询到属性值是多少的像素。 pQueryfilter.WhereClause = "Value=109";//设置像素查询的条件。 IRasterDescriptor pRdescriptor = new RasterDescriptorClass();//栅格描述接口。 pRdescriptor.Create(pRaster as IRaster, pQueryfilter, "Value"); IWorkspaceFactory pRwks2 = n
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服