判断A图层完全包含B图层的要素--(2)地理处理之联合Union

空间查询操作在数据量很大的情况下速度会很慢(一切用到游标的操作都会收到数据量的影响 ),因此这里推荐使用第二种方法:首先进行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);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值