下面要讲的种重分类方法,网上很多。但是好像 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#实现)的更多相关文章

  1. AE设置投影而非重投影IGeoDatasetSchemaEdit

    AE设置投影而非重投影 读取一个jpg格式的影像,包含jgw文件,这时设置投影.赋值操作. IRasterDataset raster = rasterWsp.OpenRasterDataset(Fi ...

  2. Bootstrap3 栅格系统-栅格参数

    通过下表可以详细查看 Bootstrap 的栅格系统是如何在多种屏幕设备上工作的. -–下面有个"顶"字,你懂得O(∩_∩)O哈哈~ -–乐于分享,共同进步! -–更多文章请看:h ...

  3. AD软件中可视栅格 捕捉栅格 电气栅格的功能和设置详解

    AD16的栅格设置 AD16系统共有3种栅格:可视栅格.电气栅格.捕捉栅格. Snap:捕获栅格,如果设定值是10mil,鼠标的光标拖动零件引脚,距离可视栅格在10mil范围之内时,零件引脚自动的准确 ...

  4. arcpy 重分类

    arcpy.gp.Reclassify_sa("dem.tif","Value","0 2000 1;2000 2100 2;2100 2500 3; ...

  5. ArcGIS教程:加权叠加

    摘要 使用经常使用測量比例叠加多个栅格数据,并依据各栅格数据的重要性分配权重. 插图 插图中,两个输入栅格已又一次分类为 1 至 3 三种公共測量级别.为每一个栅格均分配了一个影响百分比.这些像元值与 ...

  6. 3D Analyst Tools(3D Analyst 工具)

    3D Analyst 工具 工具里有又细分如下分类: 注:以下代码的参数需要另行配置,不能直接执行:Python2不支持中文变量! 1.3D 要素 # Process: 3D 内部 arcpy.Ins ...

  7. Spatial Analyst Tools(Spatial Analyst 工具)

    Spatial Analyst Tools 1.区域分析 # Process: 以表格显示分区几何统计 arcpy.gp.ZonalGeometryAsTable_sa("", & ...

  8. 栅格那点儿事(四D)

    统计值与空值 在上一篇的内容里反复提到了一个统计值.那这个统计值是怎么来的,具体是干嘛用的呢? 统计值主要就是用于栅格数据的显示和重分类,顾名思义就是一个波段中所有像元值的一个统计信息,最大值,最小值 ...

  9. 使用Python脚本批量裁切栅格

    对栅格的裁切,我们通常使用裁切(数据管理-栅格-栅格处理)或按掩膜提取(空间分析-提取分析)来裁切,裁切的矢量要素通常是一个要素图层或Shape文件.如果要进行批量处理,可以使用ToolBox中的批量 ...

随机推荐

  1. [译]缓解BEAST对TLS攻击的方式

    原文链接:https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls 原 ...

  2. BZOJ3998 TJOI2015 弦论 【后缀自动机】【贪心】

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  3. Python学习-赋值、浅copy和深copy

    Python Copy: 在Python语言中,分为浅拷贝和深拷贝两种形式,也就是官方文档中的Shadow copy和Deep copy.在对简单的对象(object)进行复制时,两者没有区别,如下面 ...

  4. Java8新特性——StreamAPI(二)

    1. 收集器简介 收集器用来将经过筛选.映射的流进行最后的整理,可以使得最后的结果以不同的形式展现. collect方法即为收集器,它接收Collector接口的实现作为具体收集器的收集方法. Col ...

  5. mysql update select 用法

    之前用SqlServer , update语句对表进行更新:update a set a.xx= (select yy from b) ; 是可以的但是在mysql中,不能直接使用set select ...

  6. Docker的主要组件

    Docker 的主要组件 安装 docker ,其实是安装了 docker 客户端.dockerd 等一系列的组件,其中比较重要的有下面几个. Docker CLI(docker)docker 程序是 ...

  7. 关于tab的切换之共用html页面,而引发的页面跳转错乱问题

    在一个项目中的同一个模块中,有多个tab(并且多个tab对应的页面结构完全一样),tab的每次切换,不同tab调用不同的接口,利用一个switch进行判断,根据当前的类型去调用不同的接口,返回不同数据 ...

  8. linux 时钟时间,用户CPU时间,系统CPU时间 .

    之前看过几次这几个的概念,但还是老是记不住,干脆就直接写下来,以后方便看~ 所谓的时钟时间又叫做墙上时钟时间,它是进程运行的时钟总量,其值与系统中同时运行的进程数有关,不过一般在讨论时钟时间的时候都是 ...

  9. SharedPreference工具类

    public class SPUtils { /** * 保存在手机里的SP文件名 */ public static final String FILE_NAME = "my_sp" ...

  10. Bootstrap组件系列之福利篇几款好用的组件(推荐)

    引用 :http://www.jb51.net/article/87189.htm 一.时间组件 bootstrap风格的时间组件非常多,你可以在github上面随便搜索“datepicker”关键字 ...