C#下GDAL的使用这里就不多赘述了,参见上一篇博客。
代码中都加了注释,这里就不再一一叙述了,代码如下:
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 voidimageToGeoSpace( 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#|C#使用GDAL读取与创建影像】
推荐阅读
- C#|C# 文件路径操作
- C# 接口实例
- C#|10、接口、抽象、密封、开放封闭原则
- c#|11、C#处理程序异常的技术
- C#|九、C#结构 类 属性
- C#|c# HashtableTo Json 字符串 HashtableToWxJson
- 分表分库(百亿级大数据存储)
- C#|微信小程序开发系列(六)——“处理请求时出错”怎么处理()
- c#做的一个简单的包含实时进度的进度条
- asp.net|c#文件写入与获取post请求数据