判断A图层完全包含B图层的要素--(2)地理处理之联合Union
程序员文章站
2022-06-12 16:48:29
...
空间查询操作在数据量很大的情况下速度会很慢(一切用到游标的操作都会收到数据量的影响 ),因此这里推荐使用第二种方法:首先进行Union操作,然后对Union的结果进行字段Group by并查询。
//1、连接工作空间
...ESRI.ArcGIS.Geodatabase.IWorkspace xWorkspace =...
//2、获取源图层和目标图层
...ESRI.ArcGIS.Geodatabase.IFeatureClass xFeatureClass1 = ...//源图层(FeatureClass)
...ESRI.ArcGIS.Geodatabase.IFeatureClass xFeatureClass2 =...//目标图层(FeatureClass)
//3、进行联合操作
string unionOutResultPath = @"...unionResult.gdb\union";//新建一个gdb或者mdb
IFeatureLayer xFeatureLayer1 = new FeatureLayer();
xFeatureLayer1.FeatureClass = xFeatureClass1;
IFeatureLayer xFeatureLayer2 = new FeatureLayer();
xFeatureLayer2.FeatureClass = xFeatureClass2;
List<ILayer> xLayers = new List<ILayer>();
xLayers.Add(xFeatureLayer1);
xLayers.Add(xFeatureLayer2);
Commond.UnionFeatureClass(xLayers, unionOutResultPath);//执行联合
//4、通过SQL语句查询满足条件的记录
FileGDBWorkspaceFactory pWSF = new FileGDBWorkspaceFactory();
IWorkspace pWS1 = pWSF.OpenFromFile(@"...unionResult.gdb", 0);
IFeatureWorkspace featureWorkspace = pWS1 as IFeatureWorkspace;
IQueryDef2 queryDef2 = (IQueryDef2)featureWorkspace.CreateQueryDef();
queryDef2.Tables = "union";
string subFields = "FID_Yjjbnt,count(FID_Yjjbnt)";
queryDef2.SubFields = subFields;//查询的以逗号分隔的字段名称列表
//queryDef2.PostfixClause = "group by FID_Yjjbnt having count(FID_Yjjbnt)=1";
string whereClause = $" FID_Yjjbnt in ( select FID_Yjjbnt from union where FID_Stbhhx <>-1 and FID_Yjjbnt <>-1 ) group by FID_Yjjbnt having count(FID_Yjjbnt)=1";//这是一个嵌套查询的语句
queryDef2.WhereClause = whereClause;
int id;
ESRI.ArcGIS.Geodatabase.IRow row = null;
ICursor cursor = queryDef2.Evaluate();
//int index = cursor.FindField(subFields.Trim().Split(',')[0]);
List<int> idList = new List<int>();
//返回subFields的ID/或FID/或OBJECTID
while ((row = cursor.NextRow()) != null)
{
id = (int)row.get_Value(0);
if (!idList.Contains(id))
idList.Add(id);
}
//5、获取Geometry
int[] str = idList.ToArray();
IFeatureCursor xFeatureCursor = xFeatureClass2.GetFeatures(str, false);
IFeature xFeature = xFeatureCursor.NextFeature();
List<IGeometry> listGeometry = new List<IGeometry>();
while (xFeature != null)
{
IGeometry xGeometry = xFeature.Shape;
listGeometry.Add(xGeometry);
xFeature = xFeatureCursor.NextFeature();
}
//6、最后可以将geometry按照指定要求输出
...
public class Commond
{
/// <summary>
/// 联合操作
/// </summary>
/// <param name="xLayers">图层列表</param>
/// <param name="path">联合结果的输出路径</param>
public static void UnionFeatureClass(List<ILayer> xLayers,string path)
{
//IGpValueTableObject可以为后面的联合操作提供数据
IGpValueTableObject xGpValueTableObject = new GpValueTableObjectClass();
xGpValueTableObject.SetColumns(xLayers.Count);
for (int i = 0; i < xLayers.Count; i++)
{
IFeatureClass xFeatureClass = (xLayers[i] as IFeatureLayer).FeatureClass;
object row = xFeatureClass;
xGpValueTableObject.AddRow(row);
}
//初始化Geoprocessor
Geoprocessor xGP = new Geoprocessor();
xGP.OverwriteOutput = true;
xGP.LogHistory = true;
xGP.ClearMessages();
//联合工具
Union xUnion = new Union();
xUnion.in_features = xGpValueTableObject;//输入要素
xUnion.out_feature_class = path;//输出要素(文件路径)
//执行GP工具
xGP.Execute(xUnion, null);
}
}