基于C#的ArcEngine二次开发教程(17):获取栅格属性的接口及代码实现

简介: 基于C#的ArcEngine二次开发教程(17):获取栅格属性的接口及代码实现

1 问题描述

从栅格属性中提取分辨率信息、焦点坐标信息、参考坐标系统信息、中央子午线等

20190829233153891.png

20190829232916335.png

2 问题解析

20161011225038574.png

3 要点分析

3.1 ArcGIS的接口与方法

主要用到的接口:


IRasterProps

IRasterBandCollection

IRasterDataset

IRasterPyramid3

IRasterBand

栅格属性列表:

列数和行数(Columns and Rows):通过IRasterProps的Width和Height属性获取

波段数量(Number of Bands):通过IRasterBandCollection接口获取(可以由IRaster对象跳转接口到此接口)

像元大小(CellSize(X,Y)):通过IRasterProps的MeanCellSize

格式(Format):通过IRasterDataset的Format属性获取

源类型(Source Type):可以通过GP工具SetRasterProperties来设置。

像素类型(Pixel Type):通过IRasterProps接口的PixelType 属性获取

像素位深(Pixel Depth):根据像素类型来判断像素位深

无数据值(NoData Value):通过IRasterProps 的NoDataValue属性获取

颜色表/色带(Colormap):通过IRaster2接口的Colormap属性获取色带

金字塔(Pyramids):通过IRasterPyramid3接口来创建、获取、删除金字塔(PS:用IRasterDataset接口跳转到IRasterPyramid3接口)

压缩(Compression):通过IRasterDataset的CompressionType属性获取压缩类型

范围(Extent):将IRasterDataset接口对象转换成IGeoDataset对象来范围信息

空间参考(Spatial Reference):1)将IRasterDataset接口对象转换成IGeoDataset对象来获取空间参考信息 2)通过IRasterProps 的属性SpatialReference获取 3)其它方法

统计(Statistics):通过IRasterBand接口的Statistics属性获取波段的统计信息

波段集合:通过IRasterBandCollection 接口来添加、删除、获取波段。

3.3 DataGridView的学习总结

3.3.1 属性设置

  • DataGridView的最后一行不显示:dataGridView1.AllowUserToAddRows = false;
  • 自动填充列宽:AutoSizeColumns: Fill
  • 不进行列排序

2019083020302161.png

20190830205114823.png

3.3.2 添加新行

方法一:使用add方法

            //采用Add()方法添加新行
            int index1 = dataGridView1.Rows.Add();
            dataGridView1.Rows[index1].Cells[0].Value = "行数";
            dataGridView1.Rows[index1].Cells[1].Value = myRasterProp.Height.ToString();

方法二:添加add(row)

        private void addPropToDgv(string propDiscription, string propValue)
        {
            //采用DataGridViewRow添加新行
            DataGridViewRow row = new DataGridViewRow();
            DataGridViewTextBoxCell textboxcell0 = new DataGridViewTextBoxCell();
            textboxcell0.Value = propDiscription;
            row.Cells.Add(textboxcell0);
            DataGridViewTextBoxCell textboxcell1 = new DataGridViewTextBoxCell();
            textboxcell1.Value = propValue;
            row.Cells.Add(textboxcell1);
            //DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
            //row.Cells.Add(comboxcell);
            dataGridView1.Rows.Add(row);
        }

3.3.3 绘制行号

方式一

//显示行号
        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            var grid = sender as DataGridView;
            var rowIdx = (e.RowIndex + 1).ToString();
            var centerFormat = new StringFormat() 
            { 
                // right alignment might actually make more sense for numbers
                Alignment = StringAlignment.Center, 
                LineAlignment = StringAlignment.Center
            };
            var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
            e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
        }

方式二

//显示行号
        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            SolidBrush b = new SolidBrush(this.dataGridview1.RowHeaderDefaultCellStyle.ForeColor);
            e.Graphics.DrawString((e.RowIndex + 1).Tostring(System.Golbalization.CultureInfo.CurrentCulture), this.dataGridview1.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 10, e.RowBounds.Location.X + 4);
        }

3.3.4 点击首行或首列选中

        //点击列头选中整列
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullColumnSelect;
            dataGridView1.Columns[e.ColumnIndex].Selected = true;
        }
        //点击行头选中整行
        private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.Rows[e.RowIndex].Selected = true;
        }

3.3.5 选中单一的格子

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex != -1)
            {
                this.dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
                dataGridView1.Rows[e.ColumnIndex].Selected = true;
            }           
        }

4 源码实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
//https://blog.csdn.net/yh0503/article/details/52644017
//https://blog.csdn.net/mengxiangzhengfaya/article/details/52985746
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
            InitializeComponent();
        }
        private void textBox1_DragDrop(object sender, DragEventArgs e)
        {
            textBox1.Text = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
        }
        private void textBox1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Link;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
        private void addPropToDgv(string propDiscription, string propValue)
        {
            //采用DataGridViewRow添加新行
            DataGridViewRow row = new DataGridViewRow();
            DataGridViewTextBoxCell textboxcell0 = new DataGridViewTextBoxCell();
            textboxcell0.Value = propDiscription;
            row.Cells.Add(textboxcell0);
            DataGridViewTextBoxCell textboxcell1 = new DataGridViewTextBoxCell();
            textboxcell1.Value = propValue;
            row.Cells.Add(textboxcell1);
            //DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
            //row.Cells.Add(comboxcell);
            dataGridView1.Rows.Add(row);
        }
        private void btn_GetRasterInfo_Click(object sender, EventArgs e)
        {
            IWorkspaceFactory myWorkFact = new RasterWorkspaceFactoryClass();
            string rasterData = textBox1.Text;
            IRasterWorkspace myRasterWorkspce = myWorkFact.OpenFromFile(System.IO.Path.GetDirectoryName(rasterData), 0) as IRasterWorkspace;
            IRasterDataset myRasterDataset = myRasterWorkspce.OpenRasterDataset(System.IO.Path.GetFileName(rasterData)) as IRasterDataset;
            IRasterLayer myRasterLayer = new RasterLayerClass();
            myRasterLayer.CreateFromDataset(myRasterDataset);
            IRasterProps myRasterProp = myRasterLayer.Raster as IRasterProps;
            //采用Add()方法添加新行
            int index1 = dataGridView1.Rows.Add();
            dataGridView1.Rows[index1].Cells[0].Value = "行数";
            dataGridView1.Rows[index1].Cells[1].Value = myRasterProp.Height.ToString();
            addPropToDgv("列数", myRasterProp.Width.ToString());
            addPropToDgv("像素类型", myRasterProp.PixelType.ToString());
            addPropToDgv("波段数",(myRasterLayer.Raster as IRasterBandCollection).Count.ToString());
            addPropToDgv("压缩类型", myRasterDataset.CompressionType.ToString());
            //四个角点的最大最小坐标
            addPropToDgv("最大X坐标", myRasterProp.Extent.XMax.ToString());
            addPropToDgv("最小X坐标", myRasterProp.Extent.XMin.ToString());
            addPropToDgv("最大Y坐标", myRasterProp.Extent.YMax.ToString());
            addPropToDgv("最小Y坐标", myRasterProp.Extent.YMin.ToString());
            //四个角点的坐标
            addPropToDgv("左下X坐标", myRasterProp.Extent.LowerLeft.X.ToString());
            addPropToDgv("左下Y坐标", myRasterProp.Extent.LowerLeft.Y.ToString());
            addPropToDgv("左上X坐标", myRasterProp.Extent.UpperLeft.X.ToString());
            addPropToDgv("左上Y坐标", myRasterProp.Extent.UpperLeft.Y.ToString());
            addPropToDgv("右下X坐标", myRasterProp.Extent.LowerRight.X.ToString());
            addPropToDgv("右下Y坐标", myRasterProp.Extent.LowerRight.Y.ToString());
            addPropToDgv("右上X坐标", myRasterProp.Extent.UpperRight.X.ToString());
            addPropToDgv("右上Y坐标", myRasterProp.Extent.UpperRight.Y.ToString());
            //X和Y坐标的格网分辨率
            addPropToDgv("X尺寸", myRasterProp.MeanCellSize().X.ToString());
            addPropToDgv("Y尺寸", myRasterProp.MeanCellSize().Y.ToString());
            //参考坐标信息
            ISpatialReference pSpatialReference = myRasterProp.SpatialReference;
            addPropToDgv("空间参考", pSpatialReference.Name.ToString());
            //投影坐标系
            IProjectedCoordinateSystem pcs = pSpatialReference as IProjectedCoordinateSystem;
            addPropToDgv("地理坐标系", pcs.GeographicCoordinateSystem.Name);
            addPropToDgv("基准面", pcs.GeographicCoordinateSystem.Datum.Name);
            addPropToDgv("参考椭球", pcs.GeographicCoordinateSystem.Datum.Spheroid.Name);
            addPropToDgv("投影坐标系", pcs.Projection.Name);
            addPropToDgv("中央子午线", pcs.get_CentralMeridian(true).ToString());
            addPropToDgv("线性单位", pcs.CoordinateUnit.Name.ToString());
            addPropToDgv("尺度因子", pcs.ScaleFactor.ToString());
            addPropToDgv("假东距", pcs.FalseEasting.ToString());
            addPropToDgv("假北距", pcs.FalseNorthing.ToString());
        }
        //显示行号
        private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            var grid = sender as DataGridView;
            var rowIdx = (e.RowIndex + 1).ToString();
            var centerFormat = new StringFormat() 
            { 
                // right alignment might actually make more sense for numbers
                Alignment = StringAlignment.Center, 
                LineAlignment = StringAlignment.Center
            };
            var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
            e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
        }
        //点击列头选中整列
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullColumnSelect;
            dataGridView1.Columns[e.ColumnIndex].Selected = true;
        }
        //点击行头选中整行
        private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.Rows[e.RowIndex].Selected = true;
        }
        //选中格子
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex != -1)
            {
                this.dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
                dataGridView1.Rows[e.ColumnIndex].Selected = true;
            }           
        }
    }
}

5 结果展示

20190830211310285.gif

6 参考优质博文:

ArcEngine 栅格数据 总结

C# ArcEngine获取坐标系、投影类型、计量单位、带号、几度分带、精度



相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
166 2
|
5天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
37 12
|
11天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
30 5
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
103 2
|
2月前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
52 9
|
3月前
|
安全 C# 索引
C#一分钟浅谈:属性与索引器的定义
本文深入浅出地介绍了C#编程中的属性和索引器。属性让字段更安全,通过访问器方法在读写时执行额外操作,如验证数据有效性;索引器则赋予类数组般的访问方式,支持基于索引的数据访问模式。文章通过示例代码展示了如何定义及使用这两种特性,并提供了常见问题及其解决方案,帮助读者写出更健壮、易维护的代码。希望读者能从中学习到如何有效利用属性和索引器增强C#类的功能性。
111 12
|
2月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
44 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
140 5