ArcEngine创建拓扑并验证拓扑(20190813)

1、需求

在空间分析中,有时需要判断要素与要素之间的关系,比如,在一个国家的所有省份必须要填满整个国界,不得有缝隙,再比如,省份与省份之间不能有重叠等,这些例子网上已经很详细了,这里就不多说了。我们需要做的就是在上一篇博客(https://blog.csdn.net/weixin_41607453/article/details/98991762)建立好了要素数据集、文件地理数据库的基础之上创建拓扑并进行验证。

2、设计思路

设计思路我是参考的ArcGIS拓扑分析的模块,大致步骤如下:
(1)选择本地的文件数据库,遍历数据库中的要素数据集,选择需要建立拓扑的要素数据集(上篇博文中已提及);
(2)选择建立拓扑的要素,制定拓扑的规则(ITopoRules接口)新建拓扑(ITopologyContainer2::CreateTopology方法);
(3)验证拓扑(ITopology::ValidateTopology方法)。

3、界面设计

主窗体和上一篇博客一样,只是加了一个拓扑验证的按钮。拓扑分析模块包括五个界面,这五个界面是流程式的对话框:
(1)第一步界面(选择文件地理数据库和要素数据集):
第一步界面
(2)第二步界面(输入拓扑名称和参与拓扑的要素类):
第二步界面
(3)第三步界面(拓扑规则):
第三步界面
这一步中需要选择添加的规则,因此,对添加规则按钮也做了一个界面:
添加规则界面
(4)第四部界面(信息确认):
第四步界面

4、关键代码

(1)创建拓扑:

//创建拓扑
ITopologyContainer2 pTopoContainer = pFeatureDS as ITopologyContainer2;
ITopology2 pTopology = pTopoContainer.CreateTopology(TopoName, pTopoContainer.DefaultClusterTolerance, -1, "") as ITopology2;

(2)拓扑中添加要素,主要用到ITopology中的AddClass方法:

//添加要素
foreach(IFeatureClass pFeatureClass in FeatureClassList)
{
pTopology.AddClass(pFeatureClass, 5, 1, 1, false);
}

(3)添加要素规则(以双要素为例),如果是单要素就是没有“DestinationClassID”属性,这里一定注意,AllDestinationSubtypes 和AllOriginSubtypes两个属性一定要设置为true,我为这个问题纠结了好久,看了开发文档也不知道所以然,索性就直接记下:

        /// <summary>
        /// 添加双要素拓扑规则
        /// </summary>
        /// <param name="topology">建立的拓扑</param>
        /// <param name="FeatureClassName1">要素1的名称</param>
        /// <param name="TopoRule">拓扑规则中文描述</param>
        /// <param name="FeatureClassName2">要素2的名称</param>
        private void AddTopoRules(ITopology topology, string FeatureClassName1, string TopoRule,string FeatureClassName2)
        {
            IFeatureClass pFeatureClass1 = getFeatureClassByName(FeatureClassName1, pFeatureClassList);
            IFeatureClass pFeatureClass2 = getFeatureClassByName(FeatureClassName2, pFeatureClassList);
            esriTopologyRuleType RuleType = getTopoRuleByDescription(TopoRule);

            //创建拓扑规则
            ITopologyRule pTopoRule = new TopologyRuleClass();
            pTopoRule.OriginClassID = pFeatureClass1.FeatureClassID;
            pTopoRule.TopologyRuleType = RuleType;
            pTopoRule.DestinationClassID = pFeatureClass2.FeatureClassID;
            pTopoRule.AllDestinationSubtypes = true;
            pTopoRule.AllOriginSubtypes = true;

            ITopologyRuleContainer pTopologyRuleContainer = topology as ITopologyRuleContainer;
            if (pTopologyRuleContainer.CanAddRule[pTopoRule])
            {
                pTopologyRuleContainer.AddRule(pTopoRule);
            }
            else
            {
                throw new ArgumentException("无法添加" + pFeatureClass1.AliasName + "-" + pTopoRule.Name + "-" + pFeatureClass2.AliasName + "!");
            }
        }

(4)验证拓扑,ITopology::ValidateTopology方法

        //验证拓扑
        private void VaildateTopo(ITopology pTopology,IEnvelope pEnvelope)
        {
            double x= pEnvelope.LowerLeft.X;
            double y = pEnvelope.LowerLeft.Y;
            IGeoDataset pGeoDS = pTopology as IGeoDataset;
            pTopology.ValidateTopology(pEnvelope);
        }

(5)拓扑规则的转换,ArcEngine中拓扑规则的枚举值想必都是英文的,需要对其翻译为中文以便于在程序中选择,这部分代码过于繁琐(不是说特别难,只是规则太多太占篇幅),如果需要的小伙伴可以直接参考源码。

5、代码下载

(1)github: https://github.com/ranhongwu/190807TopoOperate ;
(2)CSDN: https://download.csdn.net/download/weixin_41607453/11541679

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值