今天发现一个问题,之前没写释放内存的代码,结果运行代码的时候出现内存泄漏了。。
这个之后再解决,还有要解决之前重分类会改变源数据的问题。
今天实现的是由dem计算坡长,然后计算LS因子。
private void 坡长计算ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 自定义的提示信息
string customMessage1 = "请输入DEM栅格";
// 显示自定义提示信息
MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRasterDataset rasterDataset1 = OpenTiffFile();
if (rasterDataset1 == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
// 自定义的提示信息
string customMessage2 = "请输入坡度栅格";
// 显示自定义提示信息
MessageBox.Show(customMessage2, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRasterDataset rasterDataset2 = OpenTiffFile();
if (rasterDataset2 == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
IRaster processedRaster = MapAlgebraOperationLength(rasterDataset1, rasterDataset2);
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(processedRaster);
rasterLayer.Name = "Length";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(processedRaster);
}
private IRaster MapAlgebraOperationLength(IRasterDataset rasterDataset1, IRasterDataset rasterDataset2)
{
IMapAlgebraOp pMapAlgebraOp = new RasterMapAlgebraOpClass();
IRasterAnalysisEnvironment pEnv = (IRasterAnalysisEnvironment)pMapAlgebraOp;
pEnv.OutWorkspace = new RasterWorkspaceFactory().OpenFromFile(System.IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)), 0);
pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset1, "Ras01");
pMapAlgebraOp.BindRaster((IGeoDataset)rasterDataset2, "Ras02");
string sOut = "[Ras01] / (sin([Ras02] * 3.14 / 180))";
IRaster resultRaster = (IRaster)pMapAlgebraOp.Execute(sOut);
return resultRaster;
}
private void l因子计算ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 自定义的提示信息
string customMessage1 = "请输入坡度栅格";
IRaster resultRaster = null;
// 显示自定义提示信息
MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRasterDataset rasterDataset = OpenTiffFile();
if (rasterDataset == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
// 自定义的提示信息
string customMessage2 = "请输入坡长栅格";
IRaster resultRaster1 = null;
// 显示自定义提示信息
MessageBox.Show(customMessage2, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRasterDataset rasterDataset1 = OpenTiffFile();
if (rasterDataset == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
//调用 reclass 方法
resultRaster = reclass4(rasterDataset.CreateDefaultRaster(), rasterDataset1.CreateDefaultRaster());
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(resultRaster);
rasterLayer.Name = "重分类";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(resultRaster);
}
private void s因子计算ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 自定义的提示信息
string customMessage1 = "请输入坡度栅格";
IRaster resultRaster = null;
// 显示自定义提示信息
MessageBox.Show(customMessage1, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
IRasterDataset rasterDataset = OpenTiffFile();
if (rasterDataset == null)
{
MessageBox.Show("未选择任何TIFF文件或者打开文件失败。");
return;
}
//调用 reclass 方法
resultRaster = reclass3(rasterDataset.CreateDefaultRaster());
IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromRaster(resultRaster);
rasterLayer.Name = "重分类";
axMapControl2.AddLayer((ILayer)rasterLayer, 0);
axMapControl2.ActiveView.Refresh();
SaveRasterToFile(resultRaster);
}
private IRaster reclass3(IRaster pRaster)
{
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(0, 0);
//读入栅格
IRasterBandCollection pRasterBands = pRaster as IRasterBandCollection;
IRasterBand pRasterBand = pRasterBands.Item(0);
IRawPixels pRawPixels = pRasterBands.Item(0) as IRawPixels;
pRawPixels.Read(tlp, pPixelBlock);
//将PixBlock的值组成数组
System.Array pSafeArray = pPixelBlock.get_SafeArray(0) as System.Array;
List<double> pixelValues = new List<double>();
System.Array dataArray = pSafeArray;
double temp = 0;
for (int y = 0; y < rasterProps.Height; y++)
{
for (int x = 0; x < rasterProps.Width; x++)
{
double value = Convert.ToDouble(dataArray.GetValue(x, y));
if (value <= 5 && value >= 0)
{
temp = 10.8 * Math.Sin(value * Math.PI /180) + 0.03;
dataArray.SetValue((float)temp, x, y);
}
else if (value > 5 && value <= 10)
{
temp = 16.8 * Math.Sin(value * Math.PI / 180) -0.5 ;
dataArray.SetValue((float)temp, x, y);
}
else if (value > 10 && value <=25)
{
temp = 20.204 * Math.Sin(value * Math.PI / 180) - 1.2404;
dataArray.SetValue((float)temp, x, y);
}
else if (value > 25)
{
temp = 29.585 * Math.Sin(value * Math.PI / 180) - 5.6079;
dataArray.SetValue((float)temp, x, y);
}
else
{
dataArray.SetValue(float.NaN, x, y); // 设置为空值
}
}
}
pPixelBlock.set_SafeArray(0, pSafeArray);
//编辑raster,将更新的值写入raster中
IRasterEdit rasterEdit = pRaster as IRasterEdit;
rasterEdit.Write(tlp, pPixelBlock);
rasterEdit.Refresh();
return pRaster;
}
private IRaster reclass4(IRaster pRaster1, IRaster pRaster2)
{
IRasterProps rasterProps1 = (IRasterProps)pRaster1;
//设置栅格数据起始点
IPnt pBlockSize1 = new Pnt();
pBlockSize1.SetCoords(rasterProps1.Width, rasterProps1.Height);
//选取整个范围
IPixelBlock pPixelBlock1 = pRaster1.CreatePixelBlock(pBlockSize1);
//左上点坐标
IPnt tlp = new Pnt();
tlp.SetCoords(0, 0);
IRasterProps rasterProps2 = (IRasterProps)pRaster1;
//设置栅格数据起始点
IPnt pBlockSize2 = new Pnt();
pBlockSize2.SetCoords(rasterProps2.Width, rasterProps2.Height);
//选取整个范围
IPixelBlock pPixelBlock2 = pRaster2.CreatePixelBlock(pBlockSize2);
//读入栅格
IRasterBandCollection pRasterBands1 = pRaster1 as IRasterBandCollection;
IRasterBand pRasterBand1 = pRasterBands1.Item(0);
IRawPixels pRawPixels1 = pRasterBands1.Item(0) as IRawPixels;
pRawPixels1.Read(tlp, pPixelBlock1);
//读入栅格
IRasterBandCollection pRasterBands2 = pRaster2 as IRasterBandCollection;
IRasterBand pRasterBand2 = pRasterBands2.Item(0);
IRawPixels pRawPixels2 = pRasterBands2.Item(0) as IRawPixels;
pRawPixels2.Read(tlp, pPixelBlock2);
//将PixBlock的值组成数组
System.Array pSafeArray1 = pPixelBlock1.get_SafeArray(0) as System.Array;
List<double> pixelValues1 = new List<double>();
System.Array dataArray1 = pSafeArray1;
System.Array pSafeArray2 = pPixelBlock2.get_SafeArray(0) as System.Array;
List<double> pixelValues2 = new List<double>();
System.Array dataArray2 = pSafeArray2;
double temp = 0;
if(rasterProps1.Height != rasterProps2.Height || rasterProps1.Width!= rasterProps2.Width)
{
MessageBox.Show("栅格范围不相等,请调整栅格范围");
}
for (int y = 0; y < rasterProps1.Height; y++)
{
for (int x = 0; x < rasterProps1.Width; x++)
{
double flag = Convert.ToDouble(dataArray1.GetValue(x, y));
double value = Convert.ToDouble(dataArray2.GetValue(x, y));
if (flag <= 1 && flag >= 0)
{
temp = Math.Pow(value/22.13,0.2);
dataArray2.SetValue((float)temp, x, y);
}
else if (flag > 1 && flag <= 3)
{
temp = Math.Pow(value / 22.13, 0.3);
dataArray2.SetValue((float)temp, x, y);
}
else if (flag > 3 && flag <= 5)
{
temp = Math.Pow(value / 22.13, 0.4);
dataArray2.SetValue((float)temp, x, y);
}
else if (flag > 5)
{
temp = Math.Pow(value / 22.13, 0.5);
dataArray2.SetValue((float)temp, x, y);
}
else
{
dataArray2.SetValue(float.NaN, x, y); // 设置为空值
}
}
}
pPixelBlock2.set_SafeArray(0, pSafeArray2);
//编辑raster,将更新的值写入raster中
IRasterEdit rasterEdit = pRaster2 as IRasterEdit;
rasterEdit.Write(tlp, pPixelBlock2);
rasterEdit.Refresh();
return pRaster2;
}
}
主要使用的还是栅格重分类方法。