class RasterCostDistance { private IRasterLayer costRasterlayer; public RasterCostDistance(IRasterLayer costRasterlayer) { this.costRasterlayer = costRasterlayer; } public IRasterLayer CalCostDistance(IRasterLayer sourceRasterlayer, string outputFileName) { if (System.IO.File.Exists(outputFileName)) { System.IO.File.Delete(outputFileName); } IGeoDataset sourceRaster = sourceRasterlayer.Raster as IGeoDataset; IGeoDataset costRaster = costRasterlayer.Raster as IGeoDataset; IDistanceOp2 distanceOp = new RasterDistanceOpClass(); IRasterAnalysisEnvironment rasAnaEnv = distanceOp as IRasterAnalysisEnvironment; //设置生成图层的工作空间 IWorkspaceFactory wsf = new RasterWorkspaceFactoryClass(); string outputPath = System.IO.Path.GetDirectoryName(outputFileName); string fileName = System.IO.Path.GetFileName(outputFileName); IWorkspace ws = wsf.OpenFromFile(outputPath, 0); rasAnaEnv.OutWorkspace = ws; //设置生成图层的范围 object extent = (object)costRaster.Extent; object missing = System.Reflection.Missing.Value; rasAnaEnv.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvValue, ref extent, ref missing); //设置生成图层的栅格大小 rasAnaEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvMinOf, ref cellsize);
//进行成本距离的计算 object maxDistance = System.Reflection.Missing.Value; object valueRaster = System.Reflection.Missing.Value; IGeoDataset outputDataset = distanceOp.CostDistance(sourceRaster, costRaster, ref maxDistance, ref valueRaster);
//生成的IRaster是保存在内存中的数据,要保存在硬盘文件中还应使用ISaveas ISaveAs pSaveAs = outputDataset as ISaveAs; pSaveAs.SaveAs(fileName, ws, "IMAGINE Image"); IRasterLayer pCreatRalyr = new RasterLayerClass(); pCreatRalyr.CreateFromFilePath(outputFileName); return pCreatRalyr; } }