intersect 裁剪导出要素类

来源:互联网 发布:mac os x10.12懒人版 编辑:程序博客网 时间:2024/05/16 09:30

最近我在做一个需求:就是用一个图形裁剪导出要素类。最先用Clip工具,后面发现不对,用arcmap测试下,确实不是想要的结果,后面发现用intersect工具可以。但是intersect的参数设置比较不固定,需要进行多番测试,这两天试了很多方法,查了很多资料,最后是下面这种方式成功了。要使用IGpValueTableObject 对象。网上有使用字符串的,似乎不行。

 

/// <summary>        /// 成功方式        /// </summary>        /// <param name="inputFeatClass">输入要素类</param>        /// <param name="clipFeatClass">裁剪要素类</param>        /// <param name="outShpFileName">不带.shp的文件名</param>        private void IntersectResults(IFeatureClass inputFeatClass, IFeatureClass clipFeatClass, string outShpFileName)        {            IGpValueTableObject valTbl = new GpValueTableObjectClass();            valTbl.SetColumns(2);            object row = "";            object rank = 1;            row = inputFeatClass;            valTbl.SetRow(0, ref row);            valTbl.SetValue(0, 1, ref rank);            row = clipFeatClass;            valTbl.SetRow(1, ref row);            rank = 2;            valTbl.SetValue(1, 1, ref rank);            Geoprocessor gp = new Geoprocessor();            gp.OverwriteOutput = true;            ESRI.ArcGIS.AnalysisTools.Intersect intersect = new ESRI.ArcGIS.AnalysisTools.Intersect();            intersect.in_features = valTbl;            intersect.out_feature_class = outShpFileName;             intersect.join_attributes = "NO_FID";            intersect.output_type = "INPUT";            if (gp.Execute(intersect, null) == null)            {                throw new DataOutputException(GetGpMessage(gp));            }                  }


下面是另外一种方式,但是我试了不行。

private void IntersectResults(string[] inShpFileNames, string outShpFileName)        {                        string infeatues = "";            foreach (string str in inShpFileNames)            {                if (infeatues != "")                { infeatues += ";"; }                infeatues += str;            }            Geoprocessor gp = new Geoprocessor();            gp.OverwriteOutput = true;            ESRI.ArcGIS.AnalysisTools.Intersect intersect = new ESRI.ArcGIS.AnalysisTools.Intersect();            intersect.in_features = infeatues;// @"E:\数据\temp\New_Shapefile.shp;E:\数据\temp\New_Shapefile_Intersect.shp";            intersect.out_feature_class = outShpFileName; //@"E:\数据\temp\intersectOne.shp";            intersect.join_attributes = "NO_FID";            intersect.output_type = "INPUT";            if (gp.Execute(intersect, null) == null)            {                throw new DataOutputException(GetGpMessage(gp));            }                    }


还有一种方式 我试了也不行:

private IFeatureClass Intersect(IFeatureClass inputfeatureclass, IFeatureClass cliplayerClass)        {            IBasicGeoprocessor basicGeoprocessor = new BasicGeoprocessorClass();            IFeatureClassName utFeatClassName = new FeatureClassNameClass();            outFeatClassName.FeatureType = esriFeatureType.esriFTSimple;            outFeatClassName.ShapeFieldName = "Shape";            outFeatClassName.ShapeType = inputfeatureclass.ShapeType;            IDataset dataset = inputfeatureclass as IDataset;            string utFileName = dataset.Name + GetNextFileIdName(m_ShpPath, dataset.Name).ToString();            IWorkspaceName workspaceName = new WorkspaceNameClass();            workspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.ShapeFileWorkspaceFactory.1";            workspaceName.PathName = m_ShpPath;            IDatasetName datasetName = outFeatClassName as IDatasetName;            datasetName.Name = outFileName;            datasetName.WorkspaceName = workspaceName;            return basicGeoprocessor.Intersect(inputfeatureclass as ITable, false, cliplayerClass as ITable, false, 0, outFeatClassName);        }