/// <summary>/// 获取栅格图层的属性表/// </summary>/// <param name="layer">栅格图层</param>/// <returns></returns>public static ITable GetRasterITableByLayer(ILayer layer){ITable iTable = BuildRasterTable(layer);return iTable;}/// <summary>/// 获取栅格图层的属性表/// </summary>/// <param name="layer">栅格图层</param>/// <returns></returns>public static DataTable GetRasterDataTableByLayer(ILayer layer){ITable iTable = BuildRasterTable(layer);if (iTable == null){return null;}DataTable dataTable = new DataTable();IFields fields = iTable.Fields;for (int i = 0; i < fields.FieldCount; i++){dataTable.Columns.Add(fields.Field[i].Name);}ICursor pCursor = iTable.Search(null, false);IRow pRrow = pCursor.NextRow();while (pRrow != null){DataRow pRow = dataTable.NewRow();for (int i = 0; i < pRrow.Fields.FieldCount; i++){pRow[i] = pRrow.Value[i].ToString();}dataTable.Rows.Add(pRow);pRrow = pCursor.NextRow();}return dataTable;}/// <summary>/// 构建栅格图层属性表,有时候生成的栅格图层没有属性表,需要自己构建属性表。/// 其中,不能为 32 位浮点像素类型的栅格数据集或多波段构建栅格属性表/// </summary>/// <param name="pLayer">图层</param>/// <returns>属性表ITable</returns>public static ITable BuildRasterTable(ILayer pLayer){if (!(pLayer is IRasterLayer)) return null;IRasterLayer rasterLayer = pLayer as IRasterLayer;IRaster pRaster = rasterLayer.Raster;IRasterProps rProp = pRaster as IRasterProps;if (rProp == null){return null;}if (rProp.PixelType == rstPixelType.PT_FLOAT || rProp.PixelType == rstPixelType.PT_DOUBLE) //判断栅格像元值是否是整型{return null;}IRasterDataset rasterDataset = GetRasterDataset(rasterLayer);IRasterBandCollection pRasterbandCollection = pRaster as IRasterBandCollection;if (rasterDataset != null){IRasterDataset2 rd2 = rasterDataset as IRasterDataset2;//重新构建全删格,读取所有波段数IRaster raster = rd2.CreateFullRaster();pRasterbandCollection = (IRasterBandCollection)raster;//无法为多波段或浮点型栅格数据集构建 VATif (pRasterbandCollection.Count > 1){return null;}}IRasterBand rasterBand = pRasterbandCollection.Item(0);ITable rTable = rasterBand.AttributeTable;if (rTable != null) return rasterBand.AttributeTable; //直接获取属性表try{IRasterDatasetEdit2 rasterDatasetEdit = (IRasterDatasetEdit2)rasterDataset;if (rasterDatasetEdit == null){return null;}//Build default raster attribute table with VALUE and COUNTrasterDatasetEdit.BuildAttributeTable();  //建立属性表//更新属性表pRasterbandCollection = (IRasterBandCollection)rasterDataset;rasterBand = pRasterbandCollection.Item(0);}catch (Exception ex){PSKJ.Common.Core.Log.LogHelper.getInstance().GetLogger(typeof(RasterLayerWrapper)).Error(ex);return null;}return rasterBand.AttributeTable;    //重新获取属性表}/// <summary>/// 判断栅格图层是否拥有属性表/// </summary>/// <param name="pRaster">栅格</param>/// <returns>是否拥有属性表</returns>public static bool IsRasterLayerHaveTable(IRaster pRaster){IRasterProps pProp = pRaster as IRasterProps;if (pProp == null){return false;}if (pProp.PixelType == rstPixelType.PT_FLOAT || pProp.PixelType == rstPixelType.PT_DOUBLE) //判断栅格像元值是否是整型{return false;}IRasterBandCollection pRasterbandCollection = (IRasterBandCollection)pRaster;IRasterBand rasterBand = pRasterbandCollection.Item(0);ITable rTable = rasterBand.AttributeTable;return rTable != null;}/// <summary>/// 获取栅格波段,默认第0波段/// </summary>/// <param name="rasterlayer"></param>/// <param name="bandIndex"></param>/// <returns></returns>public static IRasterBand GetBand(IRasterLayer rasterlayer, int bandIndex = 0){IRaster pRaster = rasterlayer.Raster;IRasterBandCollection pRasterbandCollection = (IRasterBandCollection)pRaster;int count = pRasterbandCollection.Count;IRasterBand rasterBand = null;if (bandIndex + 1 <= count){rasterBand = pRasterbandCollection.Item(bandIndex);}else{rasterBand = pRasterbandCollection.Item(0);}return rasterBand;}public static List<string> GetBandNameList(IRasterLayer rasterlayer){IRasterBandCollection pRasterbandCollection = GetRasterBandCollection(rasterlayer);int count = pRasterbandCollection.Count;List<string> itemband = new List<string>();for (int i = 0; i < count; i++){itemband.Add(pRasterbandCollection.Item(i).Bandname);}return itemband;}public static int GetBandCount(IRasterLayer rasterlayer){IRasterBandCollection rbc = GetRasterBandCollection(rasterlayer);return rbc.Count;}public static IRasterDataset GetRasterDataset(IRasterLayer rasterlayer){IRasterDataset rasterDataset = null;string strPath = rasterlayer.FilePath;string strDirName = System.IO.Path.GetDirectoryName(strPath);string strRasterName = System.IO.Path.GetFileName(strPath);IWorkspace ws = GetWorkspace(rasterlayer);if (ws == null) return rasterDataset;IDataset ds = rasterlayer as IDataset;string workspaceFactoryType = WorkspaceWrapper.GetWorkspaceFactoryType(ws as IWorkspace);strRasterName = ds.BrowseName.Contains("\\") ? ds.BrowseName.Split('\\')[0] : strRasterName;IRasterWorkspaceEx rasterWorkspaceEx = ws as IRasterWorkspaceEx;if (rasterWorkspaceEx != null){rasterDataset = rasterWorkspaceEx.OpenRasterDataset(strRasterName);}else{IRasterWorkspace rasterWorkspace = ws as IRasterWorkspace;if (rasterWorkspace != null){rasterDataset = rasterWorkspace.OpenRasterDataset(strRasterName);}}return rasterDataset;}public static IRasterBandCollection GetRasterBandCollection(IRasterLayer rasterlayer){IRasterBandCollection rbc = rasterlayer.Raster as IRasterBandCollection;IRasterDataset rasterDataset=GetRasterDataset(rasterlayer);IRasterDataset2 rd2 = rasterDataset as IRasterDataset2;//重新构建全删格,读取所有波段数IRaster raster = rd2.CreateFullRaster();rbc = (IRasterBandCollection)raster;return rbc;}public static IWorkspace GetWorkspace(ILayer layer){IDataset ds = layer as IDataset;if (ds == null) return null;IWorkspace ws = ds.Workspace;return ws;}/// <summary>/// 获取栅格行列对应的Value值/// </summary>/// <param name="rasterLayer"></param>/// <param name="meanx">像元X值大小</param>/// <param name="meany">像元X值大小</param>/// <param name="XMin">栅格图层左上角范围X</param>/// <param name="YMax">栅格图层左上角范围Y</param>/// <returns></returns>public static Dictionary<int[], double> GetRasterRowColumnValueArray(IRasterLayer rasterLayer, out double meanx, out double meany,out double XMin, out double YMax){IRaster raster = rasterLayer.Raster;IRaster2 pRaster2 = raster as IRaster2;IRasterProps pRasterProps = raster as IRasterProps;IPnt meanPnt = pRasterProps.MeanCellSize();meanx = meanPnt.X;meany = meanPnt.Y;//获取图层的行列值int Height = pRasterProps.Height;int Width = pRasterProps.Width;XMin = pRasterProps.Extent.XMin;YMax = pRasterProps.Extent.YMax;//定义并初始化字典,用于存储栅格内所有像员像素值Dictionary<int[], double> PixelValueDic = new Dictionary<int[], double>();System.Array pixels;//定义RasterCursor初始化,参数设为null,内部自动设置PixelBlock大小IRasterCursor pRasterCursor = pRaster2.CreateCursorEx(null);//用于存储PixelBlock的长宽long blockwidth = 0;long blockheight = 0;IPixelBlock3 pPixelBlock3;try{do{//获取Cursor的左上角坐标int left = (int)pRasterCursor.TopLeft.X;int top = (int)pRasterCursor.TopLeft.Y;pPixelBlock3 = pRasterCursor.PixelBlock as IPixelBlock3;blockheight = pPixelBlock3.Height;blockwidth = pPixelBlock3.Width;pixels = (System.Array)pPixelBlock3.get_PixelData(0);//获取该Cursor的PixelBlock中像素的值for (int i = 0; i < blockheight; i++){for (int j = 0; j < blockwidth; j++){//一定要注意,pixels中的数组排序为[Width,Height]PixelValueDic.Add(new int[] { left + j, top + i }, Convert.ToDouble(pixels.GetValue(j, i)));}}}while (pRasterCursor.Next() == true);return PixelValueDic;}catch (Exception ex){throw ex;}}

ArcGIS Engine基础(7)之栅格数据集常用操作相关推荐

  1. ArcGIS Engine基础开发教程(转)

    ArcGIS Engine基础开发教程(0)--目录 <ArcEngine9.3 基础开发教程>是面向初中级开发者的一份简单易用,功能全面的学习资料及参考文档.教程首先从如何来创建一个Ar ...

  2. [AE] ArcGIS Engine - 基础知识 - AE|AO|GIS开发模式

    文章目录 GIS开发模式 组件式GIS AO与AE 区别 开发环境 功能 联系 AE GIS开发模式 独立开发模式 自己独立开发 宿主型开发模式 基于某个GIS平台或GIS工具软件,用该平台的自带语言 ...

  3. java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...

    一.Arrays jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作.例如快速输出.排序.查找等. 1.数组的常用方法 1.数组以字符串形式的输出,2.sort对数组排序 ...

  4. SAS︱数据索引、数据集常用操作(set、where、merge、append)

    代码部分大多来源于姚志勇老师的<SAS编程与数据挖掘商业案例>. 每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ ------------ ...

  5. Python基础教程:字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...

  6. ArcGIS Engine基础(21)之面积测量(带内外环面积计算方法、地理坐标系和投影坐标系通用)

    //计算面积值private void ReCalculateArea(IPolygon trackPolygon) {double totalArea = 0.0;double totalAreaK ...

  7. ArcGIS Engine基础(23)之布局视图工具类(地图打印设置)

    工具OnClick事件 public override void OnClick(){AxPageLayoutControl pageLayoutControl =AxPageLayoutContro ...

  8. 算法基础(09)— 字符串常用操作

    1. 字符串定义 字符串 string 是由 n 个字符组成的一个有序整体 n >= 0.例如,s = "BEIJING" ,s 代表这个串的串名,BEIJING 是串的值. ...

  9. 【mongoDB基础篇①】安装与常用操作语句

    简述 mongoDB与redis同为noSql数据库,但是redis为kv数据库(key/value),而mongoDB为文档型数据库存储的是文档(Bson->json的二进制化).内部执行引擎 ...

  10. ArcGIS Engine代码共享-可以直接移植到你的工程中

    以前写ArcGIS Engine程序,都是一些代码积累,基本上都是静态变量,如果有基础的一看就明白了,我也没有时间来总结这一块了,大家自己消化吧,好多东西应该可以直接移植到其他地方. ArcGIS E ...

最新文章

  1. iOS开发之绝对布局和相对布局(屏幕适配)
  2. 嵌入在C++程序中的extern C
  3. entity framework 6 我写了一个公用数据类
  4. 当final作用于变量、参数、方法和类时该如何处理
  5. 修改树莓派更新源及设置代理配置
  6. JavaScript中变量提升是什么?如何实现?
  7. Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)
  8. 嵌入式java基准测试_Java正则表达式库基准测试– 2015年
  9. 一个风骚的C语言操作
  10. html标签属性值拼接,js拼接url以及为html某标签属性赋值
  11. Atitit. null错误的设计 使用Optional来处理null
  12. ubuntu下tftp服务器搭建
  13. matlab设计匹配滤波器,[转载]利用MATLAB实现匹配滤波器的仿真验证
  14. c语言1至100的累乘求和,c语言 累加累乘课件.ppt
  15. 网页中文转英文(国际化)
  16. C++[Error] expected primary-expression before ‘]‘ token
  17. TCP连接,三次握手问题
  18. 还在纠结芯片引脚需要加多大容值的电容吗?
  19. WWDC20 Session 清单(06-23)
  20. 为了给YiYi节省时间,写了个能自动拼图贴水印的机器人,很多bug,能用就行。

热门文章

  1. CentOS7 安装 Oracle 11g rac(7) —— 安装 grid 软件前的准备工作
  2. 富文本编辑器抓取秀米图片转存到七牛云
  3. 黄金分割点公式java_java如何实现黄金分割数 java实现黄金分割数代码
  4. 图表框架html,推荐14个实用的JavaScript图表(JS图表)图形绘制工具
  5. 烽火2640路由器命令行手册-01-基础配置命令
  6. 实战:入侵win10
  7. 最基础的股市定律--支撑阻挡定律
  8. VBox下频繁出现0x00000000指令引用的0x00000000内存,该内存不能为written:解决方案(附文件)
  9. VirtualBox中出现“0x00000000指令引用的0x00000000内存该内存不能为written 和visual studio Just in time debugger error
  10. fms服务器ip修改,FusionSphere 平台修改管理网段和VLAN