AE 遍历栅格实现栅格重分类(C#实现)
下面要讲的种重分类方法,网上很多。但是好像 System.Array pSafeArray = pPixelBlock.get_SafeArray(0) as System.Array;这一句一直报下面的错误。我还没有解决。
不过还是将这种方法整理一下,转载自此。

作者本人的初步的解决方法为:
将 pSafeArray.GetValue(x, y) 替换为 pPixelBlock.GetVal(0, c_x, r_y)。 同时避免了“System.Array pSafeArray = pPixelBlock.get_SafeArray(0) as System.Array”的异常问题。该问题很有可能为内部调用 MemoryStream 的 set_Capacity 时,在申请新内存时失败,可能是需要存储到ViewState中的内容太过庞大,或者可用内存太少。导致尝试将数据序列化写入ViewState时内存溢出。
下面为正文
--------------------------
栅格重分类方法很多,在AE中有多种方式可以实现,使用地图代数(在RasterModel中实现),或者IReclassOp,或者Geoprocessor的方式都可以,甚至可以遍历栅格来实现,这是最原始的方式,不过也可能是最实用的。这里使用的是最原始的遍历栅格的方式。
private void reclass(IRaster pRaster, float weight)
{
IRasterProps rasterProps = (IRasterProps)pRaster; //设置栅格数据起始点
IPnt pBlockSize = new Pnt();
pBlockSize.SetCoords(rasterProps.Width, rasterProps.Height); //选取整个范围
IPixelBlock pPixelBlock = pRaster.CreatePixelBlock(pBlockSize); //左上点坐标
IPnt tlp = new Pnt();
tlp.SetCoords(, ); //读入栅格
IRasterBandCollection pRasterBands = pRaster as IRasterBandCollection;
IRasterBand pRasterBand = pRasterBands.Item();
IRawPixels pRawRixels = pRasterBands.Item() as IRawPixels;
pRawRixels.Read(tlp, pPixelBlock); //将PixBlock的值组成数组
System.Array pSafeArray = pPixelBlock.get_SafeArray() as System.Array;
for (int y = ; y < rasterProps.Height; y++)
{
for (int x = ; x < rasterProps.Width; x++)
{
//int value = Convert.ToInt32(pSafeArray.GetValue(x, y));
Byte value = Convert.ToByte(pSafeArray.GetValue(x, y));
if (value != )
pSafeArray.SetValue((Byte)(value * weight), x, y);
}
} pPixelBlock.set_SafeArray(, pSafeArray); //编辑raster,将更新的值写入raster中
IRasterEdit rasterEdit = pRaster as IRasterEdit;
rasterEdit.Write(tlp, pPixelBlock);
rasterEdit.Refresh();
}
改变RasterLayer中DEM的值
public void ChangePixelValue(double xMax, double xMin, double yMax, double yMin,double[,] PixelChanged)
{
IRaster pRaster = thisRasterLayer.Raster;
IRaster2 pRaster2 = pRaster as IRaster2; //地图坐标转换为图中行列值
rowMax = pRaster2.ToPixelRow(yMin);
rowMin = pRaster2.ToPixelRow(yMax);
columnMin = pRaster2.ToPixelColumn(xMin);
columnMax = pRaster2.ToPixelColumn(xMax); int Height = rowMax - rowMin + ;
int Width = columnMax - columnMin + ; //按照需要的大小建立一个空的PixelBlock3
IPnt blocksize = new PntClass();
blocksize.SetCoords(Width, Height); IPixelBlock3 pPixelBlock3 = pRaster.CreatePixelBlock(blocksize) as IPixelBlock3; System.Array pixels = (System.Array)pPixelBlock3.get_PixelData(); //为新建的PixelBlock赋值
try
{
for (int i = ; i < Height; i++)
{
for (int j = ; j < Width; j++)
{
pixels.SetValue(Convert.ToByte(PixelChanged[i,j]), j, i);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} //把像素值赋予新建的PixelBlock3
pPixelBlock3.set_PixelData(, pixels); //PixelBlock3应在的位置
blocksize.SetCoords(columnMin, rowMin); //改变的像素值写入图层
IRasterEdit pRasterEdit = pRaster as IRasterEdit;
pRasterEdit.Write(blocksize, (IPixelBlock)pPixelBlock3);
pRasterEdit.Refresh(); System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterEdit);
}
及将IRasterLayer存储起来的方法
public static void SaveRasterLayerTofile(IRasterLayer pRasterLayer, string fileName, string strFileExtension="TIFF")
{ IRaster pRaster = pRasterLayer.Raster;
IRaster2 pRaster2 = pRaster as IRaster2; ISaveAs pSaveAs = pRaster2 as ISaveAs;
pSaveAs.SaveAs(fileName, null, strFileExtension);
}
AE 遍历栅格实现栅格重分类(C#实现)的更多相关文章
- AE设置投影而非重投影IGeoDatasetSchemaEdit
AE设置投影而非重投影 读取一个jpg格式的影像,包含jgw文件,这时设置投影.赋值操作. IRasterDataset raster = rasterWsp.OpenRasterDataset(Fi ...
- Bootstrap3 栅格系统-栅格参数
通过下表可以详细查看 Bootstrap 的栅格系统是如何在多种屏幕设备上工作的. -–下面有个"顶"字,你懂得O(∩_∩)O哈哈~ -–乐于分享,共同进步! -–更多文章请看:h ...
- AD软件中可视栅格 捕捉栅格 电气栅格的功能和设置详解
AD16的栅格设置 AD16系统共有3种栅格:可视栅格.电气栅格.捕捉栅格. Snap:捕获栅格,如果设定值是10mil,鼠标的光标拖动零件引脚,距离可视栅格在10mil范围之内时,零件引脚自动的准确 ...
- arcpy 重分类
arcpy.gp.Reclassify_sa("dem.tif","Value","0 2000 1;2000 2100 2;2100 2500 3; ...
- ArcGIS教程:加权叠加
摘要 使用经常使用測量比例叠加多个栅格数据,并依据各栅格数据的重要性分配权重. 插图 插图中,两个输入栅格已又一次分类为 1 至 3 三种公共測量级别.为每一个栅格均分配了一个影响百分比.这些像元值与 ...
- 3D Analyst Tools(3D Analyst 工具)
3D Analyst 工具 工具里有又细分如下分类: 注:以下代码的参数需要另行配置,不能直接执行:Python2不支持中文变量! 1.3D 要素 # Process: 3D 内部 arcpy.Ins ...
- Spatial Analyst Tools(Spatial Analyst 工具)
Spatial Analyst Tools 1.区域分析 # Process: 以表格显示分区几何统计 arcpy.gp.ZonalGeometryAsTable_sa("", & ...
- 栅格那点儿事(四D)
统计值与空值 在上一篇的内容里反复提到了一个统计值.那这个统计值是怎么来的,具体是干嘛用的呢? 统计值主要就是用于栅格数据的显示和重分类,顾名思义就是一个波段中所有像元值的一个统计信息,最大值,最小值 ...
- 使用Python脚本批量裁切栅格
对栅格的裁切,我们通常使用裁切(数据管理-栅格-栅格处理)或按掩膜提取(空间分析-提取分析)来裁切,裁切的矢量要素通常是一个要素图层或Shape文件.如果要进行批量处理,可以使用ToolBox中的批量 ...
随机推荐
- git学习笔记——查看git历史记录
1.查看Git日志: 命令:git log 默认不加参数,git日志会按照最新的日期从上往下显示 参数:-p 显示版本间的代码差异 -数字 显示部分的提交 -哈希值 显示指定的版本 2.指定查找范围: ...
- MySQL INFORMATION_SCHEMA 使用
--查看创建的索引的CARDINALITY比率 --通常cardinality达到表数据的10%左右建索引会有意义--如果是一个组合索引,索引第一位的cardinality表示第一个列的cardina ...
- 线性回归 Linear regression(2)线性回归梯度下降中学习率的讨论
这篇博客针对的AndrewNg在公开课中未讲到的,线性回归梯度下降的学习率进行讨论,并且结合例子讨论梯度下降初值的问题. 线性回归梯度下降中的学习率 上一篇博客中我们推导了线性回归,并且用梯度下降来求 ...
- HDU1496 Equations 卡时间第二题
Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b, c, d are integers ...
- Filter学习(一)
一.Filter简介 Filter:可以对web服务器管理的所有web资源(如Jsp, Servlet, 静态图片文件或静态 html 文件等)进行拦截,从而实现一些特殊的功能.例如实现URL级别的权 ...
- python 之 list,tuple,dict,set
基本类型, 其中set好像提到的很少 list : [] 根据字面, 是一个列表, 所以有序, 可以通过序号方位 tuple: () 是不变的list, 通过序号访问 dict: {}, 字 ...
- SpringBoot 接收 单个String入参之解决方案
场景: 在做接口时,有的时候,接口入参只需要一个参数,如果将一个参数封装成一个对象很麻烦,故有了以下方式: 思路: spring自带的参数解析器貌似是不具备这个能力的,所有自定义 方式方法: 1.定义 ...
- Quick 3.3 final 加载ccs的变化
1,用self._topUIWidget = ccs.GUIReader:getInstance():widgetFromJsonFile("mapTopUI.json")就还是用 ...
- [嵌入式]I2C协议指东
最近闲来无聊,入了一块MPU6050,手头本来就有一块原子的STM32 MINI开发板,凑活着学习了一下IIC,特此总结. IIC,是集成电路总线[Inter-Intergrated Circuit] ...
- bzoj 2632 [neerc2011]Gcd guessing game——贪心(存疑)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2632 官方题解:http://neerc.ifmo.ru/archive/2011/neer ...