1、新建一个窗体文件
主菜单栏有4个功能:数据加载、拉伸、地形渲染、坡度分析
2、数据加载功能
(1)导入DEM数据
private void 导入DEMToolStripMenuItem_Click(object sender, EventArgs e)
{
ISceneGraph pSceneGraph = this.axSceneControl1.SceneGraph;
IScene pScene = pSceneGraph.Scene;
IRasterLayer pRasterLayer = new RasterLayerClass();
ILayer pLayer;
this.openFileDialog1.Title = "加载DEM数据";
this.openFileDialog1.DefaultExt = ".TIF";
this.openFileDialog1.Filter = "(*.tif)|*.tif";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
pPathName = this.openFileDialog1.FileName;
string pPath = pPathName.Substring(0, pPathName.LastIndexOf('\\'));
string fileName = pPathName.Substring(pPath.Length + 1, pPathName.Length - pPath.Length - 1);
IWorkspaceFactory pwsf = new RasterWorkspaceFactoryClass();
IRasterWorkspace pRasterWorkspace;
if (pwsf.IsWorkspace(pPath))
{
pRasterWorkspace = pwsf.OpenFromFile(pPath, 0) as IRasterWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(fileName);
//pRasterDataset.OpenFromFile(pPath);
pRasterLayer.CreateFromDataset(pRasterDataset);
pLayer = pRasterLayer as ILayer;
pScene.AddLayer(pLayer);
//pScene.ExaggerationFactor = 6;
axTOCControl1.Update();
pSceneGraph.RefreshViewers();
}
}
}
(2)导入TIN数据
//导入TIN数据,与加载其他数据略有不同,TIN数据包含若干文件
private void 导入TINToolStripMenuItem_Click(object sender, EventArgs e)
{
ISceneGraph pSceneGraph = this.axSceneControl1.SceneGraph;
IScene pScene = pSceneGraph.Scene;
ITinLayer tinLayer = new TinLayerClass();
FileInfo fileInfo;
string tinPath;
IWorkspaceFactory tinWorkspaceFactory = new TinWorkspaceFactoryClass();
ITinWorkspace tinWorkspace;
ITin tin;
if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
tinPath = this.folderBrowserDialog1.SelectedPath;
fileInfo = new FileInfo(tinPath);
if (tinWorkspaceFactory.IsWorkspace(fileInfo.DirectoryName))
{
tinWorkspace = tinWorkspaceFactory.OpenFromFile(fileInfo.DirectoryName, 0) as ITinWorkspace;
//tinWorkspace.OpenTin(fileInfo.DirectoryName);
tin = tinWorkspace.OpenTin(fileInfo.Name);
tinLayer.Dataset = tin;
tinLayer.Visible = false;
pScene.AddLayer(tinLayer as ILayer, true);
pSceneGraph.RefreshViewers();
}
}
}
加载DEM的结果
3 拉伸功能
(1)新建一个拉伸的窗体
(2)在ComBox的Items属性里添加可选择的数据
(3)代码如下:
public partial class stretch : Form
{
private threeD threed; //获取父窗体的控件
public stretch(threeD threed)
{
InitializeComponent();
this.threed = threed; //这行代码很重要
}
private void button1_Click(object sender, EventArgs e)
{
try
{
ISceneGraph scenegraph = threed.axSceneControl1.SceneGraph;
IScene scene = scenegraph.Scene;
ILayer layer = scene.get_Layer(0);
IRasterLayer pLayer = layer as IRasterLayer;
IRasterSurface pSurface = new RasterSurface();
IRaster raster = (IRaster)pLayer.Raster;
IRasterBandCollection rasterbands = raster as IRasterBandCollection;
IRasterBand rasterband = rasterbands.Item(0);
pSurface.RasterBand = rasterband;
ISurface surface = pSurface as ISurface;
ILayerExtensions layerextensions = layer as ILayerExtensions;
I3DProperties properties = new Raster3DPropertiesClass();
object p3d;
for (int i = 0; i < layerextensions.ExtensionCount; i++)
{
p3d = layerextensions.get_Extension(i);
if (p3d != null)
{
properties = (I3DProperties)p3d;
break;
}
}
properties.ZFactor = Convert.ToDouble(comboBox1.Text);
properties.BaseOption = esriBaseOption.esriBaseSurface;
properties.BaseSurface = surface;
properties.Apply3DProperties(layer);
threed.axSceneControl1.SceneGraph.RefreshViewers();
}
catch
{
return;
}
}
private void stretch_Load(object sender, EventArgs e)
{
}
}
4 地形渲染功能
直接上代码
//地形渲染
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
//Render render = new Render(this);
//
//render.Show();
try
{
IScene scene = axSceneControl1.Scene;
ILayer layer = scene.get_Layer(0);
IRasterLayer pRasterLayer = layer as IRasterLayer;
IRaster raster = (IRaster)pRasterLayer.Raster;
IRasterBandCollection rasterbands = raster as IRasterBandCollection;
IRasterBand rasterband = rasterbands.Item(0);
IRasterStretchColorRampRenderer pRStretchRender = new RasterStretchColorRampRendererClass();
//创建两个起始颜色
IRgbColor pFromRgbColor = new RgbColorClass();
pFromRgbColor.Red = 40;
pFromRgbColor.Green = 30;
pFromRgbColor.Blue = 250;
IRgbColor pToRgbColor = new RgbColorClass();
pToRgbColor.Red = 240;
pToRgbColor.Green = 80;
pToRgbColor.Blue = 40;
//创建起始色带
IAlgorithmicColorRamp pAlgorithmicColorRamp = new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
bool btrue = true;
pAlgorithmicColorRamp.CreateRamp(out btrue);
//选择拉伸颜色带符号化的波段
pRStretchRender.BandIndex = 1;
//设置拉伸颜色带符号化所采用的颜色带
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
IRasterRenderer pRasterRender = pRStretchRender as IRasterRenderer;
pRasterLayer = scene.get_Layer(0) as IRasterLayer;
pRasterRender.Raster = pRasterLayer as IRaster;
pRasterRender.Update();
//符号化RasterLayer
pRasterLayer.Renderer = pRasterRender;
//渲染的刷新
axSceneControl1.Scene.SceneGraph.Invalidate(pRasterLayer, true, false);
axSceneControl1.SceneViewer.Redraw(true);
axSceneControl1.Scene.SceneGraph.RefreshViewers();
axTOCControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, pRasterLayer, axSceneControl1.Scene.Extent);
axTOCControl1.Update();
}
catch(Exception Err)
{
MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
5 坡度分析功能
(1)新建坡度分析窗体
(2)输入栅格代码
string inPutPath;
private void btnInput_Click(object sender, EventArgs e)
{
ISceneGraph pSceneGraph = threed.axSceneControl1.SceneGraph;
IScene pScene = pSceneGraph.Scene;
IRasterLayer pRasterLayer = new RasterLayerClass();
ILayer pLayer;
this.openFileDialog1.Title = "加载DEM数据";
this.openFileDialog1.DefaultExt = ".TIF";
this.openFileDialog1.Filter = "(*.tif)|*.tif";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
inPutPath = this.openFileDialog1.FileName;
string pPath = inPutPath.Substring(0, inPutPath.LastIndexOf('\\'));
string fileName = inPutPath.Substring(pPath.Length + 1, inPutPath.Length - pPath.Length - 1);
IWorkspaceFactory pwsf = new RasterWorkspaceFactoryClass();
IRasterWorkspace pRasterWorkspace;
if (pwsf.IsWorkspace(pPath))
{
pRasterWorkspace = pwsf.OpenFromFile(pPath, 0) as IRasterWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(fileName);
//pRasterDataset.OpenFromFile(pPath);
pRasterLayer.CreateFromDataset(pRasterDataset);
pLayer = pRasterLayer as ILayer;
cmbRasterInput.Text = inPutPath;
//pScene.AddLayer(pLayer);
pScene.ExaggerationFactor = 6;
//threed.axTOCControl1.Update();
//pSceneGraph.RefreshViewers();
}
}
}
(3)输出栅格代码
string outPutPath = "";
private void btnOutput_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "TIFF(*tif)|*.tif";
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
outPutPath = sfd.FileName.ToString();
string fileNameExt = outPutPath.Substring(outPutPath.LastIndexOf("\\") + 1);
}
cmbRasterOutput.Text = outPutPath;
}
(4)输出测量单位的Items属性
(5)直接上代码
private void btnOK_Click(object sender, EventArgs e)
{
//定义一个栅格工作空间工厂
IWorkspaceFactory workspaceFactory = new RasterWorkspaceFactoryClass();
//FileInfo—提供创建、复制、删除、移动和打开文件的实力方法,获取进行坡度分析的文件名
FileInfo fileInfo = new FileInfo(inPutPath);//字符串inPutPath是上文加载TIFF文件时传入的文件名
FileInfo fileOut=new FileInfo(outPutPath);
//定义获取目录的完整路径的字符串变量
string filePath = fileInfo.DirectoryName;
string filep = fileOut.DirectoryName;
//定义获取文件名的字符串变量
string fileName = fileInfo.Name;
//打开指定工作空间工厂的文件名
IRasterWorkspace workspace = workspaceFactory.OpenFromFile(filePath, 0) as IRasterWorkspace;
IRasterWorkspace work = workspaceFactory.OpenFromFile(filep, 0) as IRasterWorkspace;
//定义ILayer变量,获取SceneControl中第0层的影像
ILayer layer = threed.axSceneControl1.Scene.get_Layer(0);
//定义IRasterLayer变量,把layer强制转换成IRasterLayer
IRasterLayer rasterLayer = layer as IRasterLayer;
//在工作空间工厂内打开一个RasterDataset,并指定其名称
IRasterDataset rasterDataset = workspace.OpenRasterDataset(fileName);
//栅格表面分析
ISurfaceOp surfaceOp = new RasterSurfaceOpClass();
//定义了提供访问控制栅格分析环境的成员
IRasterAnalysisEnvironment rasterAnalysisEnveronment;
//栅格分析环境设置,设置为表面分析
rasterAnalysisEnveronment = surfaceOp as IRasterAnalysisEnvironment;
//设置输出的工作目录工作空间,目录
rasterAnalysisEnveronment.OutWorkspace = work as IWorkspace;
object zFactor = new object();
//IGeoDtaaset—提供对成员的访问,提供有关地理数据集的信息
IGeoDataset geoDataset, rasterGeoDataset;
rasterGeoDataset = rasterDataset as IGeoDataset;
//通过Slope方法,设置相应参数,获取坡度分析
//得到坡度分析数据集
geoDataset = surfaceOp.Slope(rasterGeoDataset, esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopeDegrees, Type.Missing);
IRasterLayer pSARLayer = new RasterLayerClass();
//当栅格数据为单个栅格数据时
pSARLayer.CreateFromRaster(geoDataset as IRaster);
//当栅格数据为栅格数据集时使用该代码显示
//pSARLayer.CreateFromDataset((IRasterDataset)geoDataset);
threed.axSceneControl1.Scene.AddLayer(pSARLayer);
threed.axSceneControl1.Refresh();
一个栅格数据集由一个或者多个波段(RasterBand)的数据组成,一个波段就是一个数据矩阵
IRasterBandCollection rasterBandCollection = geoDataset as IRasterBandCollection;
将坡度分析得到的数据存储于Workspace读取的工作目录中
rasterBandCollection.SaveAs("slope.tif", work as IWorkspace, "TIFF");
}