C#编程之C#使用GDAL读取与创建影像
小标 2018-11-27 来源 : 阅读 3055 评论 0

摘要:本文主要向大家介绍了C#编程之C#使用GDAL读取与创建影像,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C#使用GDAL读取与创建影像,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

代码中都加了凝视,这里就不再一一叙述了。代码例如以下:
 class FloodSimulation
    {
        #region 类成员变量

        public Dataset m_DEMDataSet;            //DEM数据集
        public Dataset m_FloodSimulatedDataSet; //洪涝淹没范围数据集
        public int m_XSize;                     //数据X方向栅格个数
        public int m_YSize;                     //数据Y方向栅格个数
        public double m_AreaFlooded;            //水面面积
        public double m_WaterVolume;            //淹没水体体积
        public double[] m_FloodBuffer;          //填充缓冲区(洪涝淹没范围)
        public double[] m_DEMdataBuffer;           //DEM数据缓冲

        /* 这里的GeoTransform(影像坐标变换參数)的定义是:通过像素所在的行列值得到其左上角点空间坐标的运算參数
            比如:某图像上(P,L)点左上角的实际空间坐标为:
            Xp = GeoTransform[0] + P * GeoTransform[1] + L * GeoTransform[2];
            Yp = GeoTransform[3] + P * GeoTransform[4] + L * GeoTransform[5];                                                                     */
        public double[] m_adfGeoTransform;   

        #endregion
        
        //构造函数
        public FloodSimulation()
        {
            m_adfGeoTransform = new double[6];
        }

        /// 


        /// 载入淹没区DEM,并创建淹没范围影像
        /// 


        /// 

DEM文件路径
        /// 


        public void loadDataSet(string m_DEMFilePath)
        {
            m_DEMDataSet = Gdal.Open(m_DEMFilePath, Access.GA_ReadOnly);
            //获取X、Y方向栅格数
            m_XSize = m_DEMDataSet.RasterXSize;
            m_YSize = m_DEMDataSet.RasterYSize;
            
            //读取DEM数据到内存中
            Band m_DEMBand = m_DEMDataSet.GetRasterBand(1); //获取第一个波段
            m_DEMdataBuffer = new double[m_XSize * m_YSize];
            m_DEMBand.ReadRaster(0, 0, m_XSize, m_YSize, m_DEMdataBuffer, m_XSize, m_YSize, 0, 0);

            //淹没范围填充缓冲区
            m_FloodBuffer = new double[m_XSize * m_YSize];
            //获取影像坐标转换參数
            m_DEMDataSet.GetGeoTransform(m_adfGeoTransform); 

            //创建洪涝淹没范围影像
            string m_FloodImagePath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\FloodSimulation\\FloodedRegion.tif";
            if (System.IO.File.Exists(m_FloodImagePath))
            {
                System.IO.File.Delete(m_FloodImagePath);
            }
            //在GDAL中创建影像,先须要明白待创建影像的格式,并获取到该影像格式的驱动
            OSGeo.GDAL.Driver driver = Gdal.GetDriverByName("GTiff");
            //调用Creat函数创建影像
            m_FloodSimulatedDataSet=driver.Create(m_FloodImagePath, m_XSize, m_YSize, 1, DataType.GDT_CFloat32, null);
            //设置影像属性
            m_FloodSimulatedDataSet.SetGeoTransform(m_adfGeoTransform); //影像转换參数
            m_FloodSimulatedDataSet.SetProjection(m_DEMDataSet.GetProjection()); //投影
            //将影像数据写入内存
            m_FloodSimulatedDataSet.GetRasterBand(1).WriteRaster(0, 0, m_XSize, m_YSize, m_FloodBuffer, m_XSize, m_YSize, 0, 0);
            m_FloodSimulatedDataSet.GetRasterBand(1).FlushCache();
            m_FloodSimulatedDataSet.FlushCache();

        }

        /// 


        /// 从像素空间转换到地理空间
        /// 


        /// 

影像坐标变换參数
        /// 

像素所在行
        /// 

像素所在列
        /// 

X
        /// 

Y
        public void  imageToGeoSpace( double [] m_GeoTransform, int pixel,int line, out double X,out double Y )
        {
            X = m_GeoTransform[0] + pixel * m_GeoTransform[1] + line * m_GeoTransform[2];
            Y = m_GeoTransform[3] + pixel * m_GeoTransform[4] + line * m_GeoTransform[5];
        }

        /// 


        /// 从地理空间转换到像素空间
        /// 


        /// 

影像坐标变化參数
        /// 

X
        /// 

Y
        /// 

像素所在行
        /// 

像素所在列
        public void geoToImageSpace(double[] m_GeoTransform, double x, double y, out int pixel, out int line)
        {
            line = (int)((y * m_GeoTransform[1] - x * m_GeoTransform[4] + m_GeoTransform[0] * m_GeoTransform[4] - m_GeoTransform[3] * m_GeoTransform[1]) / (m_GeoTransform[5] * m_GeoTransform[1] - m_GeoTransform[2] * m_GeoTransform[4]));
            pixel = (int)((x - m_GeoTransform[0] - line * m_GeoTransform[2]) / m_GeoTransform[1]);
        }
    }
因项目须要做洪涝模拟。所以採用GDAL使用C#编写了FloodSimulation类,后面再一步步完好这个类。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved