bool ArcmapDataBase::checkLayerTopology(dan::Object<iDataPlugin::IPGLayer> layer, const dan::DString &featureDatasetname, const dan::DString &topologyName, const dan::DString &topologyRuleName)
{/*参数含义:layer :需要进行拓扑检查的图层  featureDatasetname :所需创建的要素数据集名称 topologyName: 表示新建的拓扑名称 topologyRuleName :表示创建拓扑规则的名称;*//*拓扑检查步骤:1. 新建要素数据集2. 导入要素类(单个/多个)3. 新建拓扑4. 添加拓扑规则5. 验证拓扑6. 导入拓扑图层*///得到当前要素工作空间mdbIFeatureWorkspacePtr ipFeatureWorkspace = getWorkspace();  dan::Object<ArcmapLayer> aLayer = layer;//获取当前空间参照(get ISpatialReference)IFeatureClassPtr ipFeatureClass = aLayer->getFeatureClass();IGeoDatasetPtr ipGeoDataset = ipFeatureClass;ISpatialReferencePtr ipSpatialRefrence;ipGeoDataset->get_SpatialReference(&ipSpatialRefrence);  //得到空间参照SpatialReference//创建要素数据集---(1.判断要素类是否存在要素数据集--(1)存在便无需创建 (2)不存在时则需创建相应要素数据集IFeatureDatasetPtr ipFeatureDataset;ipFeatureClass->get_FeatureDataset(&ipFeatureDataset); //判断是否存在该数据集;if (ipFeatureDataset == nullptr)  {/*1. 创建要素数据集 */ipFeatureWorkspace->CreateFeatureDataset(_bstr_t((LPCTSTR)featureDatasetname.utf16()), ipSpatialRefrence, &ipFeatureDataset);      /*2. 导入要素类到要素数据集 */IDatasetContainerPtr ipDatasetContainer = ipFeatureDataset;IDatasetPtr ipInDataset = ipFeatureClass;      //ipFeatureClass为同一工作空间下的要素类;ipDatasetContainer->AddDataset(ipInDataset);/*3. 新建拓扑  */ //相关变量定义ITopologyContainerPtr ipTopologyContainer = ipFeatureDataset; //将数据集存入iTopology--用于创建拓扑ITopologyPtr ipTopology; double ipClusterTolerance;  //返回默认容差ipTopologyContainer->get_DefaultClusterTolerance(&ipClusterTolerance);ipTopologyContainer->CreateTopology(_bstr_t((LPCTSTR)topologyName.utf16()), ipClusterTolerance, -1, L"", &ipTopology);long featureId;dan::DString ipJoinLayerName = layer->layerName();IFeatureClassPtr ipJoinFeatureClass;ipFeatureWorkspace->OpenFeatureClass(_bstr_t((LPCTSTR)ipJoinLayerName.utf16()), &ipJoinFeatureClass);ipJoinFeatureClass->get_FeatureClassID(&featureId);IClassPtr ipClass = ipJoinFeatureClass;ipTopology->AddClass(ipClass,5, 1, 1, VARIANT_FALSE);  //添加参与拓扑的图层  /*3. 添加拓扑规则 */ITopologyRulePtr ipGapTopologyRule(CLSID_TopologyRule);  //空隙ipGapTopologyRule->put_OriginClassID(featureId);ipGapTopologyRule->put_TopologyRuleType(esriTRTAreaNoGaps);   //层内要素是否有空隙;ipGapTopologyRule->put_Name(_bstr_t((LPCTSTR)topologyRuleName.utf16())); //dstring转BSTRipGapTopologyRule->put_AllOriginSubtypes(VARIANT_TRUE);ITopologyRuleContainerPtr ipTopologyRuleContainer = (ITopologyRuleContainerPtr)ipTopology;VARIANT_BOOL checkTopoRule;ipTopologyRuleContainer->get_CanAddRule(ipGapTopologyRule, &checkTopoRule);if (checkTopoRule == VARIANT_TRUE){ipTopologyRuleContainer->AddRule(ipGapTopologyRule);  //添加拓扑规则;}else{return false;}/*4. 验证拓扑 */IGeoDatasetPtr ipCurGeoDataset = ipTopology;IEnvelopePtr ipEnvelope;ipCurGeoDataset->get_Extent(&ipEnvelope);IPolygonPtr ipPolygon(CLSID_Polygon);ISegmentCollectionPtr ipSegmentCollection = ipPolygon;ipSegmentCollection->SetRectangle(ipEnvelope);IPolygonPtr ipCurPolygon;ipTopology->get_DirtyArea(ipPolygon, &ipCurPolygon);if (ipCurPolygon != nullptr){IEnvelopePtr ipAreaToValidate; ipPolygon->get_Envelope(&ipAreaToValidate);IEnvelopePtr ipAreaEffectValidated;ipTopology->ValidateTopology(ipAreaToValidate, &ipAreaEffectValidated);}//验证规则是否实现if (ipSegmentCollection == nullptr){return false;}else{return true;}}else{ITopologyContainerPtr ipTopologyContainer = ipFeatureDataset; //将数据集存入iTopology--用于创建拓扑ITopologyPtr ipTopology;double ipClusterTolerance;  //返回默认容差ipTopologyContainer->get_DefaultClusterTolerance(&ipClusterTolerance);ipTopologyContainer->CreateTopology(_bstr_t((LPCTSTR)topologyName.utf16()), ipClusterTolerance, -1, L"", &ipTopology);//添加参与拓扑的图层:long featureId;dan::DString ipJoinLayerName = layer->layerName();IFeatureClassPtr ipJoinFeatureClass;ipFeatureWorkspace->OpenFeatureClass(_bstr_t((LPCTSTR)ipJoinLayerName.utf16()), &ipJoinFeatureClass);ipJoinFeatureClass->get_FeatureClassID(&featureId);IClassPtr ipClass = ipJoinFeatureClass;ipTopology->AddClass(ipClass, 5, 1, 1, VARIANT_FALSE);  //添加参与拓扑的图层 /* 添加拓扑规则 */ITopologyRulePtr ipGapTopologyRule(CLSID_TopologyRule);ipGapTopologyRule->put_TopologyRuleType(esriTRTAreaNoGaps);   //层内要素不能有空隙ipGapTopologyRule->put_Name(_bstr_t((LPCTSTR)topologyRuleName.utf16())); //dstring转BSTRipGapTopologyRule->put_OriginClassID(featureId);ipGapTopologyRule->put_AllOriginSubtypes(VARIANT_TRUE);ITopologyRuleContainerPtr ipTopologyRuleContainer = ipTopology;VARIANT_BOOL checkTopoRule;ipTopologyRuleContainer->get_CanAddRule(ipGapTopologyRule, &checkTopoRule);if (checkTopoRule == VARIANT_TRUE)                // 判断能否添加该规则{ipTopologyRuleContainer->AddRule(ipGapTopologyRule);  //添加拓扑规则;}else{return false;}/* 验证拓扑 */IGeoDatasetPtr ipCurGeoDataset = ipTopology;IEnvelopePtr ipEnvelope;ipCurGeoDataset->get_Extent(&ipEnvelope);IPolygonPtr ipPolygon(CLSID_Polygon);ISegmentCollectionPtr ipSegmentCollection = ipPolygon;ipSegmentCollection->SetRectangle(ipEnvelope);IPolygonPtr ipCurPolygon;ipTopology->get_DirtyArea(ipPolygon, &ipCurPolygon);if (ipCurPolygon != nullptr){IEnvelopePtr ipAreaToValidate;ipPolygon->get_Envelope(&ipAreaToValidate);IEnvelopePtr ipAreaEffectValidated;ipTopology->ValidateTopology(ipAreaToValidate, &ipAreaEffectValidated);}//验证规则是否实现;if (ipSegmentCollection == nullptr){return false;}else{return true;}}return false;}

拓扑检查C++(ArcObject)相关推荐

  1. AE开发 创建Feature后,需要进行拓扑检查

    在创建完Feature并赋予Geometry后,需要对当前的Feature.shape进行拓扑检查.利用 ITopologicalOperator接口中的IsSimple属性进行拓扑检查. 检查失败后 ...

  2. 测绘界超强工具箱!CADCASS实用插件合集,各种功能应有尽有!断面、高程点、等高线、三角网、拓扑检查...

    插件下载: QTools for AutoCAD 插件简介 "QTools for AutoCAD"是一款CAD/CASS辅助工具,功能主要涉及测绘.设计行业,含拓扑检查.缝隙修复 ...

  3. FME数据处理04:面自相交拓扑检查

    在ArcGIS中仅提供了线要素的自相交拓扑检查,并未找到关于面要素自相交的相关表述:本文结合FME2019.列举了几种面自相交的情形,并介绍了FME中三个转换器及其设置方法. 关于ArcEngine的 ...

  4. ArcGIS矢量化并进行拓扑检查

    土地利用数据每年都在发生变化,故每年都要根据去年的数据进行修改.请根据以下要求,修改A区域的数据并对B区域已做好的数据进行拓扑检查. 01 数据说明 1. 地类图斑A.shp:A区域需要编辑修改的图斑 ...

  5. 【板栗糖GIS】arcmap如何进行拓扑检查并输出结果

    arcmap如何进行拓扑检查并输出结果 目录 1.创建文件地理数据库 2.新建要素数据集 3.输入要素数据集的名称 4.设置要素数据集的地理坐标 5.设置z轴坐标系 6.对于容差一般选择默认 7.导入 ...

  6. Arcmap拓扑检查:重叠或者有空隙的面

    有时候我们拿到的面数据,两个面之间有相互覆盖或者有空隙,想要消除这种现象,需要做拓扑检查修复,达到两个面公用一条边界的效果. 1. 在Arcmap里创建个人地理数据库,自定义命名为:拓扑检查.mdb ...

  7. ArcMap 小知识(5):拓扑检查及修改

    点赞和关注是我创作的最大动力~~ 拓扑检查前的准备工作 因为拓扑检查需要在要素数据集中进行,所以要将需要拓扑检查的数据导入要素数据集. 新建个人地理数据库 新建要素数据集 导入要素类 新建拓扑 在新建 ...

  8. 使用ArcGIS进行拓扑检查

    使用ArcGIS进行拓扑检查 最近在项目中碰到一个问题:道路中心线如果有多部分组成,例如是MultiLineString的时候,由于数据采集处理的原因经常会造成,MultiLineString的各个部 ...

  9. 检查cad检查线压盖lisp_在CAD中对多段线进行拓扑检查

    4.在弹出的提示框中,点击  确定: 检查完成后,系统会弹出错误汇总提示框,便于您统计错误数量: 注意:鼠标右键单击项目可自动定位到项目. 下面,我为大家介绍每个检查项的错误原因及修改方法: 1.不是 ...

最新文章

  1. 捡垃圾、跳大绳、种花、写字,波士顿动力机器狗迎来重大升级
  2. 锁类型_ sys.dm_os_wait_stats
  3. 国内 Java 开发者必备的两个装备,你配置上了么?
  4. 【c++】26.浅谈“事件驱动”、select、poll、epoll
  5. matlab调用opencv库,matlab调用opencv库
  6. JDK 9.0.4 报错:程序包 com.sun.xml.internal.fastinfoset.stax.events 不存在/不可见
  7. 【AI视野·今日CV 计算机视觉论文速览 第152期】Fri, 9 Aug 2019
  8. 2014百度之星资格赛——Disk Schedule
  9. 函数式编程与命令式编程的学习难度比较
  10. 编程语言学习之php
  11. win10计算机性能设置,巧设置让Win10运行更流畅
  12. win7加入网络计算机,win7怎么加入局域网连接
  13. [论文阅读] 对话式推荐系统的进展与挑战:综述(Advances and Challenges in Conversational Recommender Systems: ASurvey)-01
  14. 向Android系统中添加模块及产品流程
  15. Redis 实现搜索关键词自动补全
  16. 沸点Java笔试考核
  17. norflash的基本操作
  18. 干式离合器与湿式离合器有什么区别(转载)
  19. Brendan Gregg: 一个实战派大神
  20. FPGA 的基本结构(RAM/FPGA/SOC)

热门文章

  1. 校招生大规模涨薪、再扩招10000人?大厂抢人有多野?
  2. 2021年重庆高考成绩排名查询,2021年重庆理科高考成绩排名一分一段表,重庆高考理科成绩排名查询...
  3. mysql 数据删除 索引_MySQL操作之索引创建与删除
  4. Python模块_re正则表达式模块-2
  5. 清北学堂模拟赛d1t1 位运算1(bit)
  6. 1.7见识一下什么叫Linux驱动:LED
  7. 实习面试问题整理(一)
  8. Spring学习8-Spring事务管理(注解式声明事务管理)
  9. iOS开发日记49-详解定位CLLocation
  10. oracle 字典表查询