Пример #1
0
        private void sure_Click(object sender, EventArgs e)
        {
            string layer_name = layers1.Text;
            ILayer choose     = null;
            double @base      = double.Parse(basenumber.Text);
            double interval   = double.Parse(dis.Text);


            ILayer temp_lay;

            for (int i = 0; i < m_hookHelper.FocusMap.LayerCount; i++)
            {
                temp_lay = m_hookHelper.FocusMap.get_Layer(i);
                if (temp_lay.Name == layer_name)
                {
                    choose = temp_lay;
                }
            }

            IRasterLayer chooseras = choose as IRasterLayer;


            ISurfaceOp2 pSurfaceOp = default(ISurfaceOp2);

            pSurfaceOp = new RasterSurfaceOp() as ISurfaceOp2;
            IGeoDataset       pRasterDataset       = chooseras as IGeoDataset;
            IWorkspace        pShpWS               = default(IWorkspace);
            IWorkspaceFactory pShpWorkspaceFactory =
                new  ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory();

            pShpWS     = pShpWorkspaceFactory.OpenFromFile(FilePath, 0);
            pSurfaceOp = new RasterSurfaceOp() as ISurfaceOp2;
            IRasterAnalysisEnvironment pRasterAEnv =
                (IRasterAnalysisEnvironment)pSurfaceOp;

            pRasterAEnv.OutWorkspace = pShpWS;
            IGeoDataset   pOutput       = default(IGeoDataset);
            IFeatureClass pFeatureClass = default(IFeatureClass);
            IFeatureLayer pFLayer       = default(IFeatureLayer);



            object tmpbase;

            tmpbase = (object)@base;
            object tmpmy = 1;

            pOutput = pSurfaceOp.Contour(pRasterDataset, interval,
                                         ref tmpbase, ref tmpmy);
            pFeatureClass        = (IFeatureClass)pOutput;
            pFLayer              = new FeatureLayer();
            pFLayer.FeatureClass = pFeatureClass;
            IGeoFeatureLayer pGeoFL = default(IGeoFeatureLayer);

            pGeoFL = (IGeoFeatureLayer)pFLayer;
            pGeoFL.DisplayAnnotation = false;
            pGeoFL.DisplayField      = "CONTOUR";
            pGeoFL.Name = "CONTOUR";
            m_hookHelper.FocusMap.AddLayer(pGeoFL);
        }
Пример #2
0
        public static IRaster buildSlope(string string_0, string string_1, string string_2)
        {
            IWorkspaceFactory          factory     = new RasterWorkspaceFactory();
            IRasterDataset             dataset     = ((IRasterWorkspace)factory.OpenFromFile(string_0, 0)).OpenRasterDataset(string_1);
            ISurfaceOp                 op          = new RasterSurfaceOp() as ISurfaceOp;
            IRasterAnalysisEnvironment environment = (IRasterAnalysisEnvironment)op;
            IWorkspaceFactory          factory2    = new RasterWorkspaceFactory();
            IWorkspace                 workspace2  = factory2.OpenFromFile(string_2, 0);

            environment.OutWorkspace = workspace2;
            object zFactor = new object();

            zFactor = Missing.Value;
            return
                ((IRaster)
                 op.Slope((IGeoDataset)dataset, esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopeDegrees, ref zFactor));
        }
Пример #3
0
        private void btnSure_Click(object sender, EventArgs e)
        {
            SysCommon.CProgress vProgress = new SysCommon.CProgress("进度条");
            try
            {
                if (comboBoxOpen.Text == "")
                {
                    MessageBox.Show("请选择数据!", "提示!");
                    return;
                }
                if (txtZFactor.Text == "")
                {
                    MessageBox.Show("请设置Z值参数!", "提示!");
                    return;
                }
                if (txtCellSize.Text == "")
                {
                    MessageBox.Show("请设置输出精度参数!", "提示!");
                    return;
                }
                if (txtSave.Text == "")
                {
                    MessageBox.Show("请输入保存文件名!", "提示!");
                    return;
                }
                string Unit;
                if (radioBtnDegree.Checked)
                {
                    Unit = "DEGREE";
                }
                else
                {
                    Unit = "PERCENT";
                }
                //this.Hide();
                //Progress.FormProgress
                vProgress.EnableCancel    = false;//设置进度条
                vProgress.ShowDescription = true;
                vProgress.FakeProgress    = true;
                vProgress.TopMost         = true;
                vProgress.ShowProgress();
                vProgress.SetProgress("正在进行坡度分析");
                ILayer      pLayer      = GetLayerByName(ref fileName);//根据图层名获取图层
                IGeoDataset pGeoDataset = pLayer  as IGeoDataset;
                ISurfaceOp  pSurfaceOp;
                IRasterAnalysisEnvironment pRasterAnalysisEnvironment = new RasterSurfaceOp();
                pSurfaceOp = pRasterAnalysisEnvironment as ISurfaceOp;
                object pObject  = Convert.ToDouble(txtCellSize.Text);
                object pZFactor = Convert.ToDouble(txtZFactor.Text);
                pRasterAnalysisEnvironment.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref pObject);                             //设置输出数据的像元值大小
                IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactoryClass();
                string            OutPath           = System.IO.Path.GetDirectoryName(txtSave.Text);                                          //输出文件存储的目录信息
                string            TempPath          = string.Concat(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "\\Temp\\"); //临时文件存储位置
                if (!Directory.Exists(TempPath))
                {
                    Directory.CreateDirectory(TempPath);// 当路径不存在时创建临时文件存储路径
                }
                IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(TempPath, 0);
                pRasterAnalysisEnvironment.OutWorkspace = pWorkspace;
                IRasterBandCollection pRasterBandCollection;
                string Newfile = System.IO.Path.GetFileName(txtSave.Text);
                if (pGeoDataset is IRasterLayer)
                {
                    IRasterLayer pRasterLayer = pLayer as IRasterLayer;
                    pGeoDataset = (IGeoDataset)pRasterLayer.Raster;

                    if (Unit == "DEGREE")//选择不同单位进行坡度分析
                    {
                        pRasterBandCollection = pSurfaceOp.Slope(pGeoDataset, esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopeDegrees, ref pZFactor) as IRasterBandCollection;
                    }
                    else
                    {
                        pRasterBandCollection = pSurfaceOp.Slope(pGeoDataset, esriGeoAnalysisSlopeEnum.esriGeoAnalysisSlopePercentrise, ref pZFactor) as IRasterBandCollection;
                    }
                    pWorkspace = pWorkspaceFactory.OpenFromFile(OutPath, 0);

                    pRasterBandCollection.SaveAs(Newfile, pWorkspace, RasterType); //保存分析结果到固定路径下
                    vProgress.Close();
                    if (MessageBox.Show("坡度分析成功,是否加载分析结果", "提示!", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    {
                        vProgress.ShowProgress();
                        vProgress.SetProgress("正在进行加载结果数据");
                        IRasterWorkspace pRasterWorkspace = pWorkspaceFactory.OpenFromFile(OutPath, 0) as IRasterWorkspace;               // 张琪  20110613
                        IRasterDataset   pRasterDataset   = pRasterWorkspace.OpenRasterDataset(System.IO.Path.GetFileName(txtSave.Text)); //包含扩展名的表面数据集
                        IRasterLayer     pOutRasterLayer  = new RasterLayerClass();
                        pOutRasterLayer.CreateFromDataset(pRasterDataset);
                        m_pCurrentSceneControl.Scene.AddLayer(pOutRasterLayer as ILayer, true);
                        vProgress.Close();
                    }
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pRasterBandCollection);
                }
                else if (pGeoDataset is ITinLayer)
                {
                    ITinLayer             pTinLayer        = pGeoDataset as ITinLayer;
                    ITinAdvanced          pTinAdvanced     = pTinLayer.Dataset as ITinAdvanced;
                    Cls3DModulsefun       pCls3DModulsefun = new Cls3DModulsefun();
                    IRasterDataset        pRasterDataset;
                    esriRasterizationType pesriRasterizationType;

                    if (Unit == "DEGREE")
                    {
                        pesriRasterizationType = esriRasterizationType.esriDegreeSlopeAsRaster;
                    }
                    else
                    {
                        pesriRasterizationType = esriRasterizationType.esriPercentageSlopeAsRaster;
                    }
                    rstPixelType prstPixelType = rstPixelType.PT_LONG;
                    //TIN数据转换成Raster数据并进行坡度分析(暂时未成功)
                    vProgress.Close();
                    pRasterDataset = pCls3DModulsefun.TinToRaster2(pTinAdvanced, pesriRasterizationType, OutPath, Newfile, prstPixelType, Convert.ToDouble(txtCellSize.Text), pTinAdvanced.Extent, true, RasterType);
                    if (MessageBox.Show("坡度分析成功,是否加载分析结果", "提示!", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    {
                        IRasterLayer pOutRasterLayer = new RasterLayerClass();
                        pOutRasterLayer.CreateFromDataset(pRasterDataset);
                        m_pCurrentSceneControl.Scene.AddLayer(pOutRasterLayer as ILayer, true);
                        if (this.WriteLog)
                        {
                            Plugin.LogTable.Writelog("坡度分析,表面集为:" + comboBoxOpen.Text);
                            Plugin.LogTable.Writelog("输出栅格路径为:" + txtSave.Text);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("目前不支持对当前选择图层的坡度分析功能", "提示!");
                }
                m_pCurrentSceneControl.SceneGraph.RefreshViewers();
                this.Close();
                DeleteFolder(TempPath);//清楚临时文件
            }
            catch
            {
                vProgress.Close();
                this.Close();
                MessageBox.Show("很抱歉,操作失败!", "提示!");
                return;
            }
        }