资源描述
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
展开阅读全文