最近我在做一个需求:就是用一个图形裁剪导出要素类。最先用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);
}