ArcGIS Engine空间分析之拓扑分析的实现
简单介绍:
拓扑学是一门研究几何图形位置关系的科学。
GIS所关注的拓扑主要集中在拓扑关系——存在于地理实体间的拓扑关系。
拓扑关系在GIS中起着描述两个地理实体的相对空间位置的重要作用。它是GIS空间实体之间最重要的关系之一,在GIS空间数据建模、空间查询、空间分析、空间推理、制图综合等过程中起着重要的作用。拓扑关系对GIS具有以下重要意义:
(1)不需要利用坐标或者计算距离,能够清楚地反映某一要素与另一要素的空间位置关系。
(2)某些空间分析功能是基于拓扑关系而实现的。例如,要求某条河流的流域面积、流经的城市,查询有哪些国家与某个国家相邻等等。
(3)在进行某些空间分析之前必须检查数据的拓扑关系的合理性。这样的空间分析功能有计算最佳路径、缓冲分析、裁剪、建立封闭多边形等。
拓扑元素是拓扑关系的描述单元。
GeoDatabase数据模型包括一般性的常见3类要素类:点状要素类、线状要素类和面状要素类。
在二维空间中,它们分别对应的是3种拓扑元素,即结点、弧和面域(多边形)。
拓扑关系是不考虑度量和方向的空间实体之间的空间关系,它讲究的是拓扑元素彼此间的相对位置关系。
拓扑邻接、拓扑关联、拓扑包含是三种最基本的拓扑关系。
最终效果图:

对于拓扑分析,其思路可以概括如下:
①创建拓扑数据集
②设置拓扑参数(拓扑规则)
③检查拓扑错误
④显示拓扑结果
①创建拓扑数据集
/// <summary>
/// 创建拓扑数据集
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCreateTopo_Click(object sender, EventArgs e)
{
//设置指针处于等待状
this.Cursor = Cursors.WaitCursor;
//创建拓扑数据集(前提是要素集内没有数据集)
Global.GlobalTopology = create_topology(Global.pWorkSpace, "Road_Analysis", "Topology_Dataset");
//如果Flag为true则打开
if (Flag)
{
//打开拓扑数据集
Global.GlobalTopology = OpenToplogyFromFeatureWorkspace((IFeatureWorkspace)Global.pWorkSpace, "Road_Analysis", "Topology_Dataset");
//Flag为true表示已经存在拓扑数据集
MessageBox.Show("已经存在拓扑数据集");
//设置指针为默认状态
this.Cursor = Cursors.Default;
//返回
return;
}
//创建要素类
IFeatureClass pTempFt = null;
//向拓扑数据集中添加拓扑元素,可以添加多个
AddSingleElement(Global.GlobalTopology, "Road_Analysis", "南宁路网", out pTempFt);
//添加单个要素的拓扑规则, 相同图层内的先不能相交
AddRuleToTopology(Global.GlobalTopology, esriTopologyRuleType.esriTRTLineNoIntersection, "NoIntersection", pTempFt);
//Global.GlobalTopology将强转为IGeoDataset获得Extent
IGeoDataset GDS = Global.GlobalTopology as IGeoDataset;
//调用自定义方法添加拓扑规则
ValidateTopology(Global.GlobalTopology, GDS.Extent);
MessageBox.Show("拓扑数据集创建成功!");
this.Cursor = Cursors.Default;
}
一些参数:
/// <summary>
/// 判断拓扑数据集是否存在,true表示存在拓扑数据集,false表示拓扑数据集为空
/// </summary>
private bool Flag = false;
class Global
{
public static string GdbPath = Application.StartupPath + @"\网络分析\网络分析.mdb";
public static IWorkspace pWorkSpace;
public static ITopology GlobalTopology;
}



如果要创建拓扑数据集,调用create_topology函数
/// <summary>
/// 创建拓扑数据集(前提是要素集内没有数据集)
/// </summary>
/// <param name="myWSp">工作空间</param>
/// <param name="FtDSName">要素集名称</param>
/// <param name="TopologyName">拓扑数据集名</param>
/// <returns></returns>
public ITopology create_topology(IWorkspace myWSp, string FtDSName, string TopologyName)
{
//实例化拓扑为null
ITopology myTopology = null;
try
{
//将工作空间强转成要素工作空间
IFeatureWorkspace pFtWsp = myWSp as IFeatureWorkspace;
//通过要素工作空间打开名字为"FtDSName"的要素数据集
IFeatureDataset myFDS = pFtWsp.OpenFeatureDataset(FtDSName);
//将要素数据集放在要素类容器中
IFeatureClassContainer myFCContainer = myFDS as IFeatureClassContainer;
//将要素类容器强转成拓扑容器
ITopologyContainer myTopologyContainer = myFDS as ITopologyContainer;
//通过拓扑容器创建一个新的拓扑
myTopology = myTopologyContainer.CreateTopology(TopologyName, myTopologyContainer.DefaultClusterTolerance, -, "");
}
catch (Exception ee)
{
//MessageBox.Show(ee.Message);
//如果拓扑已经存在,则将Flag变为true
Flag = true;
//返回null
return null;
}
//返回创建的myTopology
return myTopology; }
注:如果创建拓扑出现问题,请参考【已解决】ArcGIS Engine无法创建拓扑的问题(CreateTopology)
如果拓扑数据集已经存在,调用OpenToplogyFromFeatureWorkspace函数
/// <summary>
/// 打开拓扑数据集(如果拓扑数据集已经创建)
/// </summary>
/// <param name="featureWorkspace">工作空间</param>
/// <param name="featureDatasetName">普通数据集</param>
/// <param name="topologyName">拓扑集名</param>
/// <returns>返回拓扑数据集</returns>
private ITopology OpenToplogyFromFeatureWorkspace(IFeatureWorkspace featureWorkspace, string featureDatasetName, string topologyName)
{
//打开特征数据集
IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
//将featureDataset转换为ITopologyContainer
ITopologyContainer topologyContainer = (ITopologyContainer)featureDataset;
//ITopology get_TopologyByName(string Name);
//打开拓扑
ITopology topology = topologyContainer.get_TopologyByName(topologyName);
//返回拓扑
return topology;
}
②设置拓扑参数(拓扑规则)


//向拓扑数据集中添加拓扑元素,可以添加多个
AddSingleElement(Global.GlobalTopology, "Road_Analysis", "南宁路网", out pTempFt);
/// <summary>
/// 向拓扑数据集中添加拓扑元素
/// </summary>
/// <param name="myTopology">拓扑数据集</param>
/// <param name="DSName">数据集名</param>
/// <param name="FtName">要素名</param>
/// <param name="pFtClass">输出参与拓扑的单个元素</param>
private void AddSingleElement(ITopology myTopology, string DSName, string FtName, out IFeatureClass pFtClass)
{
//打开工作空间
IFeatureWorkspace pFtWsp = Global.pWorkSpace as IFeatureWorkspace;
//打开数据集
IFeatureDataset myFDS = pFtWsp.OpenFeatureDataset(DSName);
//在数据集中打开要素
IFeatureClassContainer myFCContainer = myFDS as IFeatureClassContainer;
IFeatureClass pTempFt = myFCContainer.get_ClassByName(FtName);
pFtClass = pTempFt;
//调用ITopology.AddClass方法添加要素
myTopology.AddClass(pTempFt, , , , false);
}


//添加单个要素的拓扑规则, 相同图层内的先不能相交
AddRuleToTopology(Global.GlobalTopology, esriTopologyRuleType.esriTRTLineNoIntersection, "NoIntersection", pTempFt);
/// <summary>
/// 添加单个要素的拓扑规则
/// </summary>
/// <param name="topology">拓扑数据集</param>
/// <param name="ruleType">拓扑规则</param>
/// <param name="ruleName">规则名称</param>
/// <param name="featureClass">参与制定规则的要素</param>
private void AddRuleToTopology(ITopology topology, esriTopologyRuleType ruleType, string ruleName, IFeatureClass featureClass)
{
//实例化拓扑规则
ITopologyRule topologyRule = new TopologyRuleClass();
//拓扑规则
topologyRule.TopologyRuleType = ruleType;
//规则名称
topologyRule.Name = ruleName;
//规则面向的要素类
topologyRule.OriginClassID = featureClass.FeatureClassID;
topologyRule.AllOriginSubtypes = true;
ITopologyRuleContainer topologyRuleContainer = (ITopologyRuleContainer)topology;
if (topologyRuleContainer.get_CanAddRule(topologyRule))
{
//调用.AddRule方法添加规则
topologyRuleContainer.AddRule(topologyRule);
}
else
{
MessageBox.Show("规则添加失败, 不适用于拓扑集");
}
}

③检查拓扑错误

//验证拓扑错误
ValidateTopology(Global.GlobalTopology, GDS.Extent);
/// <summary>
/// 验证拓扑错误
/// </summary>
/// <param name="topology">拓扑集</param>
/// <param name="envelope">t拓扑集的Extent</param>
private void ValidateTopology(ITopology topology, IEnvelope envelope)
{
//实例化一个Polygon存储Topology的Extent
IPolygon localPolygon = new PolygonClass();
//获取Topology的外接矩形
ISegmentCollection segmentCollection = (ISegmentCollection)localPolygon;
segmentCollection.SetRectangle(envelope);
//赋值Topology的阴影区域
IPolygon polygon = topology.get_DirtyArea(localPolygon);
if (!polygon.IsEmpty)
{
//赋值参数并Validate拓扑错误
IEnvelope areaToValidate = polygon.Envelope;
IEnvelope areaValidated = topology.ValidateTopology(areaToValidate);
}
}
④显示拓扑结果


/// <summary>
/// 显示拓扑结果
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDisplayTopo_Click(object sender, EventArgs e)
{
//防止没有拓扑而创建图层对象
if(Flag)
{
//设置指针处于等待状
this.Cursor = Cursors.WaitCursor;
//新建一个拓扑图层
ITopologyLayer pTpLayer = new TopologyLayerClass();
//将Global.GlobalTopology赋值给当前的拓扑图层的拓扑
pTpLayer.Topology = Global.GlobalTopology;
//拓扑图层强转成图层
ILayer pLayer = (ILayer)pTpLayer;
//将图层名字命名为"Topology_Dataset"
pLayer.Name = "Topology_Dataset";
//将图层加到axMapControl1上
axMapControl1.AddLayer(pLayer);
//设置指针为默认状态
this.Cursor = Cursors.Default;
} }
总结:

谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!
ArcGIS Engine空间分析之拓扑分析的实现的更多相关文章
- ArcGIS Engine空间分析之缓冲区分析的实现
缓冲分析(BufferAnalysis)的结果是一个面状要素——即缓冲要素,点状要素.线状要素和面状要素,被缓冲分析功能处理过之后,它们的周围产生一个缓冲区域,该区域即新产生的面状要素. 在缓冲方向上 ...
- ArcGIS Engine空间查询功能的实现(QueryFilterClass+SpatialFilterClass)
地图中包含大量的信息,为了快速地了解所需信息,必须借助为空间数据专门编写的空间查询功能. 空间查询主要有两种类型: 基于属性的查询,也称为属性查询. 基于空间位置的查询,也称为空间查询. 查询类的基本 ...
- arcgis建立拓扑分析(检验矢量图)
目的:矢量图画好后,检查是否有伪节点,悬挂节点等,线要素和面要素都可以检查.伪节点,两条线应该相交但是画的没相交:悬挂节点,两条线看似相交了但是没有节点,因此路径不同(类似于高架桥和交叉口,悬挂节点就 ...
- ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...
- ArcGIS Engine开发之旅09--几何对象和空间参考
原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...
- 基于ArcGIS for Server的服务部署分析 分类: ArcGIS for server 云计算 2015-07-26 21:28 11人阅读 评论(0) 收藏
谨以此纪念去年在学海争锋上的演讲. ---------------------------------------------------- 基于ArcGIS for Server的服务部署分析 -- ...
- Unity3D–Texture图片空间和内存占用分析(转载)
原地址:http://www.unity蛮牛.com/home.php?mod=space&uid=1801&do=blog&id=756 Texture图片空间和内存占用分析 ...
- ArcGIS案例学习笔记4_2_水文分析批处理地理建模
ArcGIS案例学习笔记4_2_水文分析批处理地理建模 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 概述 计划时间:第4天下午 目的:自动化,批量化,批处理,提 ...
- ArcGIS案例学习笔记4_1_水文分析
ArcGIS案例学习笔记4_1_水文分析 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 概述 计划时间:第4天上午 教程: pdf page478 数据:实验数据 ...
随机推荐
- .Net Core 商城微服务项目系列(九):使用Jenkins构建自动发布
1.首先通过Docker运行Consul,并保证各个服务都成功注册: 然后运行jenkins,对MI.Web项目进行发布构建,至于怎么配置之前已经写过了,和上一篇一模一样,这里贴下批处理命令: cd ...
- 洛谷:P3384 [HNOI2004]宠物收养场
原题地址:https://www.luogu.org/problemnew/show/P3384 题目简述 给定一些序列(没有重复数字),每个序列支持: 给定一些数k(对于每个序列不重复),每次在序列 ...
- Go标准库Context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...
- 【原】git如何撤销已提交的commit(未push)
输入git log,我们可以看到最近的3次提交,最近一次提交是test3,最早的一次是test1,其中一大串类似黄色的字母是commit id(版本号) 如果嫌输出信息太多,可加上--pretty=o ...
- Rust入坑指南:坑主驾到
欢迎大家和我一起入坑Rust,以后我就是坑主,我主要负责在前面挖坑,各位可以在上面看,有手痒的也可以和我一起挖.这个坑到底有多深?我也不知道,我是抱着有多深就挖多深的心态来的,下面我先跳了,各位请随意 ...
- Asp.Net Core中Session使用
web程序中,Session是一个无法避开的点. 最近新开项目,打算从开始搭建一个基础的架子,后台用户登录成功后,需要保存session. 新建的asp.net core的模板已经包含了Session ...
- Vue核心知识——computed和watch的细节全面分析
computed和watch的区别 computed特性 1.是计算值,2.应用:就是简化tempalte里面{{}}计算和处理props或$emit的传值,computed(数据联动).3.具有缓存 ...
- /usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version': Failed to extract git version from `git --version`
问题及分析 今天做项目的时候,执行pod update报了如下错误信息: /usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapo ...
- Linux提权中常见命令大全
在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 root 权限,拿在进行 Linux 提权的 ...
- [Luogu3797] 妖梦斩木棒
题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...