Geoprocessor.Clip(裁剪)

来源:互联网 发布:紫鸟数据魔方 编辑:程序博客网 时间:2024/04/27 17:20

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using DevComponents.DotNetBar;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geoprocessor;
using PublicInterface.TobaGisCS.Homcom;
using UserControls.TobaGis.Homcom;

namespace UI.TobaGisCS.Homcom
{
    public partial class frmAnalysisClip : DevComponents.DotNetBar.Office2007Form
    {
        AxMapControl mapCtrl;
        private static bool bInputShp;

        public frmAnalysisClip(AxMapControl _mapCtrl)
        {
            InitializeComponent();
            mapCtrl = _mapCtrl;
        }

        private void frmAnalysisClip_Load(object sender, EventArgs e)
        {
            cbtInputFeatures.Map = mapCtrl.Map;
            cbtInputFeatures.LayerType = LayerType.All;
            cbtInputFeatures.setNodes();

            tbOutputFeatures.ReadOnly = true;

            tbTolerance.Text = "(默认值)";

            cbtClipFeatures.Map = mapCtrl.Map;
            cbtClipFeatures.LayerType = LayerType.Polygon;
            cbtClipFeatures.setNodes();
        }

        private void btnInputFeatures_Click(object sender, EventArgs e)
        {
            try
            {
                this.openFileDialog1.Title = "请选择地图文件";
                this.openFileDialog1.Filter = "Shap文件|*.shp";
                this.openFileDialog1.RestoreDirectory = true;
                this.openFileDialog1.Multiselect = false;
                if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    cbtInputFeatures.Map = null;
                    cbtInputFeatures.setNodes();
                    string dataName = openFileDialog1.FileName;
                    string fileName = dataName.Substring(dataName.LastIndexOf("//") + 1, dataName.Length - dataName.LastIndexOf("//") - 1);
                    cbtInputFeatures.setText(fileName);
                    bInputShp = true;
                }
            }
            catch (Exception ex)
            {
                RuntimeInfo.Logger.Error("读取文件出错:" + ex);
                DevComponents.DotNetBar.MessageBoxEx.Show("读取文件!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnOutputFeatures_Click(object sender, EventArgs e)
        {
            this.saveFileDialog1.InitialDirectory = RuntimeInfo.Instance.GlobalConfigInfo.ProjectPath;
            this.saveFileDialog1.Title = "选择文件输出位置";
            this.saveFileDialog1.Filter = "Shape Files(*.shp)|*.shp";
            if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                tbOutputFeatures.Text = this.saveFileDialog1.FileName;
            }
        }

        private void OK_Click(object sender, EventArgs e)
        {
            if (cbtInputFeatures.Text.Trim() == "" || cbtClipFeatures.Text.Trim() == ""
                || tbOutputFeatures.Text.Trim() == "" || tbTolerance.Text.Trim() == "")
            {
                MessageBoxEx.Show("请确定各个输入框内都有值!");
                return;
            }

            try
            {
                string outShpFile = tbOutputFeatures.Text.Trim();
                if (!(Directory.Exists(outShpFile.Substring(0, outShpFile.LastIndexOf("//")))))
                {
                    MessageBoxEx.Show("请确定输入的目录是否正确!");
                    return;
                }
                if (File.Exists(tbOutputFeatures.Text.Trim()) == true)
                {
                    if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
                    {
                        File.Delete(tbOutputFeatures.Text.Trim());
                    }
                    else return;
                }

                string inputFileName = openFileDialog1.FileName;
                IFeatureClass pFClass = null;
                if (bInputShp == true)
                {
                    string shpFile;
                    int startX, endX;
                    string shpDir = inputFileName.Substring(0, inputFileName.LastIndexOf("//"));
                    startX = inputFileName.LastIndexOf("//");
                    endX = inputFileName.Length;
                    shpFile = inputFileName.Substring(startX + 1, endX - startX - 1);
                    pFClass = Utility.OpenFeatureClassFromShapefile(shpDir, shpFile);
                }
                else
                {
                    pFClass = GetFClassFromMapLyr(cbtInputFeatures.Text.Trim()); ;
                }
                if (pFClass == null)
                {
                    MessageBoxEx.Show("请确认所选图层是否有效!(复合图层或空图层无效.)", "提示信息");
                    return;
                }
                IFeatureClass clipFClass = GetFClassFromMapLyr(cbtClipFeatures.Text.Trim());
                if (clipFClass == null)
                {
                    MessageBoxEx.Show("请确认所选图形是否有效!(复合图形或空图形无效.)", "提示信息");
                    return;
                }

               
                Geoprocessor GP = new Geoprocessor();
                GP.OverwriteOutput = true;
                ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip();
                clip.clip_features = clipFClass;
                clip.out_feature_class = outShpFile;//@"D://gis//projectparth";
                clip.in_features = pFClass;
                if (tbTolerance.Text.Trim() != "(默认值)")
                {
                    double tolerance = Convert.ToDouble(tbTolerance.Text.Trim());
                    clip.cluster_tolerance = tolerance;
                }               
                this.Text = "地图裁剪 - 正在对地图进行裁剪,请稍候...";
                GP.Execute(clip, null);               
                //可用GP.GetMessage(i)调试时GP的信息,了解是否正确执行

                //将生成的图层加入
                string outShpDir = outShpFile.Substring(0, outShpFile.LastIndexOf("//"));
                string outShpName = outShpFile.Substring(outShpFile.LastIndexOf("//") + 1);
                IFeatureClass outFClass= Utility.OpenFeatureClassFromShapefile(outShpDir,outShpName);
                IFeatureLayer outLayer = new FeatureLayerClass();
                outLayer.FeatureClass = outFClass;
                outLayer.Name = outFClass.AliasName;
                mapCtrl.Map.AddLayer(outLayer);

                this.Text = "地图裁剪";
                MessageBoxEx.Show(this, "生成成功!", "信息", MessageBoxButtons.OK);
            }
            catch (Exception ex)
            {
                MessageBoxEx.Show("裁剪过程出现错误!请重试!", "错误信息");
                RuntimeInfo.Logger.Error("" + ex);
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 从Layer得到FeatureClass
        /// </summary>
        /// <param name="sLyrName">图层的名字</param>
        /// <returns></returns>
        private IFeatureClass GetFClassFromMapLyr(string sLyrName)
        {
            AxMapControl axMap = mapCtrl;
            IFeatureClass pFeatCls = null;

            for (int i = 0; i <= axMap.LayerCount - 1; i++)
            {
                ILayer pLyr = axMap.get_Layer(i);

                if (pLyr is ICompositeLayer)
                {
                    pLyr = getSubLyr(pLyr as ICompositeLayer,sLyrName);
                }
                if (pLyr != null)
                {
                    if (pLyr.Name == sLyrName)
                    {
                        if (pLyr is IFeatureLayer)
                        {
                            IFeatureLayer pFLyr = pLyr as IFeatureLayer;
                            pFeatCls = pFLyr.FeatureClass;
                            break;
                        }
                    }
                }
            }
            return pFeatCls;
        }

        /// <summary>
        /// 从复合图层中得到所需FeatureClass
        /// </summary>
        /// <param name="cmpLayer">要处理的复合图层</param>
        /// <param name="sLyrName">从图层名为此的图层中获取FeatureClass</param>
        /// <returns></returns>
        private IFeatureLayer getSubLyr(ICompositeLayer cmpLayer, string sLyrName)
        {
            IFeatureLayer pFLayer = null;
            for (int j = 0; j < cmpLayer.Count; j++)
            {
                ILayer pLyr = cmpLayer.get_Layer(j);

                if (pLyr is ICompositeLayer)
                {
                    getSubLyr(pLyr as ICompositeLayer, sLyrName);
                }
                else if (pLyr.Name == sLyrName)
                {
                    pFLayer = pLyr as IFeatureLayer;
                    break;
                }
            }
            return pFLayer;
        }

    }
}

===========================================================================

以下为尝试过的方法

===========================================================================
                /* IFeatureClassName pFCName = new FeatureClassNameClass();
                 * 引发多处异常
                **/

                //IFeatureClassName pFCName = new FeatureClassNameClass();
                ////FeatureClassNameClass();
                //pFCName.FeatureType = esriFeatureType.esriFTSimple;
                //pFCName.ShapeFieldName = "Shape";
                //pFCName.ShapeType = pFClass.ShapeType;

                //IFeatureClassName pFCName2 = new FeatureClassNameClass();
                //IWorkspaceName wsName = new WorkspaceNameClass();
                //wsName.WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory";
                //wsName.PathName = "d: //gis";
                //wsName.PathName = tbOutputFeatures.Text.Trim().Substring(0, tbOutputFeatures.Text.Trim().LastIndexOf("//"));
                //IDatasetName dsName = pFCName2 as IDatasetName;
                //dsName.Name = "Clip_result";
                //dsName.WorkspaceName = wsName;
                //IFeatureClass outputFClass = null;
                //IBasicGeoprocessor bg = new BasicGeoprocessorClass();
                //outputFClass = bg.Clip(inputTable, false, clipTable, false, tolerance, pFCName);
                //////不知错在何处
                ////createShapeFile(outputFClass);
                ////////不知怎么保存到shp文件


                ////用pFClass测试,先创建shp文件,然后填入,也不行
                ////createShapeFile(pFClass);
                //IFeatureLayer pInFLayer = new FeatureLayerClass();
                //pInFLayer.FeatureClass = pFClass;
                ////ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip(pInFLayer, fLayer, @tbOutputFeatures.Text.Trim());
                ////ESRI.ArcGIS.AnalysisTools.Clip clipTool = new ESRI.ArcGIS.AnalysisTools.Clip(inputfeatureclass, clipfeatureclass, outfeatureclass);
                ////IDataset dataset = pFClass as IDataset;
                ////IWorkspace workspace = dataset.Workspace;
                ////IFeatureWorkspace fworkspace = workspace as IFeatureWorkspace;
                //string outputShpFile = "D://gis//Clip_result.shp";
                //if (File.Exists(outputShpFile) == true)
                //        File.Delete(outputShpFile);
                //IWorkspaceFactory pWFactory = new ShapefileWorkspaceFactoryClass();
                //IFeatureWorkspace pFWorkspace = pWFactory.OpenFromFile("D://gis", 0) as IFeatureWorkspace;
                //IFields outfields = pFClass.Fields;
                //IFeatureClass outfeatureclass = pFWorkspace.CreateFeatureClass("Clip_result", outfields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
               

                //IWorkspace workspace = pFWorkspace as IWorkspace;
                //IWorkspaceEdit workspaceEdit;
                //workspaceEdit = (IWorkspaceEdit)workspace;
                //workspaceEdit.StartEditing(true);
                //workspaceEdit.StartEditOperation();

                Geoprocessor GP = new Geoprocessor();
                GP.OverwriteOutput = true;
                //IWorkspaceFactory wf = new WorkspaceFactoryClass();
               
                //ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip(pFClass, clipFClass, outfeatureclass);
                ESRI.ArcGIS.AnalysisTools.Clip clip = new ESRI.ArcGIS.AnalysisTools.Clip();
                clip.clip_features = clipFClass;
                //clip.out_feature_class = @"D://gis//try";
                string a;
                clip.out_feature_class=tbOutputFeatures.Text.Trim();
                clip.in_features = pFClass;
                GP.Execute(clip, null);
               
               
                string ms = "";
                if (GP.MessageCount > 0)
                {
                    for (int Count = 0; Count <= GP.MessageCount - 1; Count++)
                    {
                        ms += GP.GetMessage(Count);
                    }
                }

                IFeatureClass outFClass= Utility.OpenFeatureClassFromShapefile(tbOutputFeatures.Text.Trim());
                IFeatureLayer outLayer = new FeatureLayerClass();
                outLayer.FeatureClass = outFClass;
                outLayer.Name = outFClass.AliasName;
                mapCtrl.Map.AddLayer(outLayer);
               

                //MessageBoxEx.Show(ms);


                //IFeatureLayer outlayer = new FeatureLayerClass();
                //outlayer.FeatureClass = clip.out_feature_class as IFeatureClass;
                //outlayer.Name = clip.out_feature_class.ToString();
                ////将裁剪输出的加载到当前Mapcontrol上
                //mapCtrl.Map.AddLayer((ILayer)outlayer);


                //workspaceEdit.StopEditOperation();
                //workspaceEdit.StopEditing(true);

                //IFeatureClass resultFClass = outfeatureclass;
                //IFeatureClass fc = resultFClass;
                //IWorkspace outWorkspace = pFWorkspace as IWorkspace;
                //IDataset inDataSet = fc as IDataset;
                //IFeatureClassName inFCName = inDataSet.FullName as IFeatureClassName;
                //IWorkspace inWorkspace = inDataSet.Workspace;
                //IDataset outDataSet = outWorkspace as IDataset;
                //IWorkspaceName outWorkspaceName = outDataSet.FullName as IWorkspaceName;
                //IFeatureClassName outFCName = new FeatureClassNameClass();
                //IDatasetName dataSetName = outFCName as IDatasetName;
                //dataSetName.WorkspaceName = outWorkspaceName;
                //dataSetName.Name = fc.AliasName.ToString();
                //IFieldChecker fieldChecker = new FieldCheckerClass();
                //fieldChecker.InputWorkspace = inWorkspace;
                //fieldChecker.ValidateWorkspace = outWorkspace;
                //IFields fields = fc.Fields;
                //IFields outFields = null;
                //IEnumFieldError enumFieldError = null;
                //fieldChecker.Validate(fields, out enumFieldError, out outFields);
                //IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
                //featureDataConverter.ConvertFeatureClass(inFCName, null, null, outFCName, null, outFields, "", 100, 0);

 

        ////创建shap文件的字段,但不知怎么将数据存入
        //private void createShapeFile(IFeatureClass pFClass)
        //{
        //    if (pFClass == null) return;
        //    //string shapeFieldName = "shape";
        //    string outputShapeFile = tbOutputFeatures.Text.Trim();
        //    string outDir = outputShapeFile.Substring(0, outputShapeFile.LastIndexOf("//"));
        //    string name = outputShapeFile.Substring(outputShapeFile.LastIndexOf("//") + 1);
        //    string outName = name.Substring(0, name.LastIndexOf("."));
        //    if (File.Exists(outputShapeFile) == true)
        //    {
        //        if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
        //        {
        //            File.Delete(outputShapeFile);
        //        }
        //        else return;
        //    }
        //    string shapeFieldName = "shape";
        //    try
        //    {

        //        IFeatureWorkspace pFWS = null;
        //        IWorkspaceFactory pWorkspaceFactory = null;
        //        pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
        //        pFWS = pWorkspaceFactory.OpenFromFile(outDir, 0) as IFeatureWorkspace;
        //        IFields pFields = pFClass.Fields;
        //        IFeatureClass pFeatClass = null;
        //        pFeatClass = pFWS.CreateFeatureClass(name, pFields, null, null, esriFeatureType.esriFTSimple, shapeFieldName, "");            
               
        //    }
        //    catch (Exception ex)
        //    {
        //        RuntimeInfo.Logger.Error("存入Shape文件出错!" + ex);
        //    }
        //}


        //public void ConvertFeatureClassToShapefile(IFeatureClass pFClass)
        //{
        //    try
        //    {
        //        if (pFClass == null) return;
        //        //string shapeFieldName = "shape";
        //        string outputShapeFile = tbOutputFeatures.Text.Trim();
        //        string outDir = outputShapeFile.Substring(0, outputShapeFile.LastIndexOf("//"));
        //        string name = outputShapeFile.Substring(outputShapeFile.LastIndexOf("//") + 1);
        //        string outName = name.Substring(0, name.LastIndexOf("."));
        //        if (File.Exists(outputShapeFile) == true)
        //        {
        //            if (MessageBoxEx.Show("所选目录已存在同名文件,覆盖该文件?") == DialogResult.OK)
        //            {
        //                File.Delete(outputShapeFile);
        //            }
        //            else return;
        //        }
        //        IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
        //        IWorkspace targetWorkspace = pWorkspaceFactory.OpenFromFile(outDir, 0);

        //        IFeatureClassName sourceFeatureClassName = new FeatureClassNameClass();
        //        sourceFeatureClassName.FeatureType = esriFeatureType.esriFTSimple;
        //        sourceFeatureClassName.ShapeFieldName = "Shape";
        //        sourceFeatureClassName.ShapeType = pFClass.ShapeType;

        //        IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
        //        IName targetWorkspaceDatasetName = targetWorkspaceDataset.FullName;
        //        IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDatasetName;

        //        IFeatureClassName targetFeatureClassName = new FeatureClassNameClass();
        //        IDatasetName targetDatasetName = (IDatasetName)targetFeatureClassName;
        //        targetDatasetName.Name = "AtlantaStreets";
        //        targetDatasetName.WorkspaceName = targetWorkspaceName;
        //        IFeatureClass sourceFeatureClass = pFClass;

               
        //        IFields sourceFields = sourceFeatureClass.Fields;
        //        IFields targetFields = null;
        //        IEnumFieldError enumFieldError = null;
        //        IFeatureDataset ftDataset = pFClass.FeatureDataset;
        //        IWorkspace sourceWorkspace= ftDataset.Workspace;

        //        IFieldChecker fieldChecker = new FieldCheckerClass();
        //        fieldChecker.InputWorkspace = sourceWorkspace;
        //        fieldChecker.ValidateWorkspace = targetWorkspace;
        //        fieldChecker.Validate(sourceFields, out enumFieldError, out targetFields);

        //        String shapeFieldName = sourceFeatureClass.ShapeFieldName;
        //        int shapeFieldIndex = sourceFeatureClass.FindField(shapeFieldName);
        //        IField shapeField = sourceFields.get_Field(shapeFieldIndex);
        //        IGeometryDef geometryDef = shapeField.GeometryDef;
        //        IClone geometryDefClone = (IClone)geometryDef;
        //        IClone targetGeometryDefClone = geometryDefClone.Clone();
        //        IGeometryDef targetGeometryDef = (IGeometryDef)targetGeometryDefClone;
        //        IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
        //        IEnumInvalidObject enumInvalidObject = featureDataConverter.ConvertFeatureClass(sourceFeatureClassName, null, null, targetFeatureClassName, targetGeometryDef, targetFields, "", 1000, 0);
        //        enumInvalidObject.Reset();
        //    }
        //    catch (Exception ex)
        //    {
        //        RuntimeInfo.Logger.Error("" + ex);
        //    }
        //}
    }
}

原创粉丝点击