ArcGIS栅格处理总结.docx_第1页
ArcGIS栅格处理总结.docx_第2页
ArcGIS栅格处理总结.docx_第3页
ArcGIS栅格处理总结.docx_第4页
ArcGIS栅格处理总结.docx_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:栅格数据处理集Tempdata, 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 bytepRprops.Width, pRprops.Height * pRbcount;/内存占有量为byte类型所占的字节数*pRprops.Width*pRprops.Height * pRbcountSystem.Array pArray = null;/定义一个数组,用来存储pPblock3.get_PixelData(pTindex)获得的像素块的值for (int pTindex = 0; pTindex pRbcount; pTindex+)/遍历每个波段IRasterCursor pRcursor = pRaster.CreateCursor();/128行,全部列是一个pRcursor.Next(),dopPblock3 = 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+)/行数pBytepW, 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,IPntIWorkspaceFactory 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 = 1)pHH = 128;elsepHH = 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);/将数组赋值给pSpbIRasterEdit pRedit = pcR as IRasterEdit;pRedit.Write(pSpnt, pSpb as IPixelBlock);/编辑栅格数据集,写完后,栅格数据就会是现在的值模板提取: /找到模板,并将模板放在数组里IWorkspaceFactory pRwksfact = new RasterWorkspaceFactoryClass();IRasterWorkspace pRwks = pRwksfact.OpenFromFile(F:栅格数据处理集Tempdata, 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:栅格数据处理集TempdataPCreate)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 =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+)/遍历每行tryfor (int pW = 0; pW = 0)pMOmulti = 0;pOrisun = 0;pTMod = 0;pTori = 0; for (int pMh = 0; pMh pModelRprops.Height; pMh+)/遍历模型行for (int pMw = 0; pMw = 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);catchcontinue ;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是该象元显示时用的值。因显示器显示时必须把象元值转换到0255显示,所以就有了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:栅格数据处理集Tempdata, 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_1IConditionalOp:只是针对栅格数据只有两个值的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 = new RasterWorkspaceFactoryClass();IWorkspace pWks2 = pRwks2.OpenFromFile(F:Temp, 0);IRaster pOut2 = pExtra.Attribute(pRdescriptor) as IRaster;/将获得的栅格数据给irasterISaveAs poUTas = pOut2 as ISaveAs ;poUTas.SaveAs(temPp.tif,pWks2 ,TIFF);通过范围(Rectangle)来提取栅格数据 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 ; 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();IEnvelope pEnv = pFeature.Extent; /获取范围IExtractionOp pEx = new RasterExtractionOpClass();IRaster pOraster = pEx.Rectangle(pRaster as IGeoDataset, pEnv, true) as IRaster ;ISaveAs pSa = pOraster as ISaveAs;/保存pSa.SaveAs(pOraster.tif,pRwks as IWorkspace ,TIFF);通过矩形(Rectangle)来导出地图坐标最小X、Y值在左下角,IEnvelope最小值是左下角,最大值是右上角,栅格数据最小行列值是在左上角,最大行列值是在右下角。double pXmin, pXmax, pYmin, pYmax;IEnvelope pEnv = new EnvelopeClass();pR2.PixelToMap(pW, pH + pRprops.Height, out pXmin, out pYmin);/获得xy值的最小值pR2.PixelToMap(pW + pRprops.Width ,pH,out pXmax ,out pYmax );/获得xy值得最大值pEnv.PutCoords(pXmin, pYmin, pXmax, pYmax);/设置IEnvelope的范围IExtractionOp pExtractop = new RasterExtractionOpClass();IRaster pSraster = pExtractop.Rectangle(pR as IGeoDataset, pEnv, true) as IRaster;ISaveAs pSa = pSraster as ISaveAs;pSa.SaveAs(Ptiqu + Pc , pRwks as IWorkspace, GRID);通过栅格数据提取栅格数据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 ;IRaster pMaskraster = pRwks.OpenRasterDataset(pOraster.tif).CreateDefaultRaster();/获取掩膜的栅格数据IExtractionOp pEx = new RasterExtractionOpClass();IRaster pO = pEx.Raster(pRaster as IGeoDataset ,pMaskraster as IGeoDataset ) as IRaster ;ISaveAs pSA = pO as ISaveAs;/保存pSA.SaveAs(pp.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 ;IWorkspaceFactory pShpwksfact = new ShapefileWorkspaceFactoryClass();IFeatureWorkspace pFwks = pShpwksfact.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 ;IArea pArea = pPolygon as IArea;IPoint pPoint = pArea.Centroid;/获得面的中心点。ICircularArc pCircular = new C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论