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 数据:实验数据 ...
随机推荐
- 【ADO.NET基础】后台获取前台控件
C# 后台获取前台 input 文本框值.string aa=Request.Form[headself]; 那么要是后台给前台input文本框赋值呢? 后台 public string Headse ...
- Chrome浏览器启动报错:应用程序无法启动,因为应用程序的并行配置不正确。
因为国庆节了,难得关一次机(可能搞IT的习惯吧),结果给祖国庆祝完70寿辰之后归来,启动电脑,就打不开Chrome浏览器了,报错如下: 应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请 ...
- spring5 源码深度解析----- 创建AOP代理之获取增强器
在上一篇的博文中我们讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看 ...
- Redis Cluster 原理相关说明
背景 之前写的 Redis Cluster部署.管理和测试 和 Redis 5.0 redis-cli --cluster help说明 已经比较详细的介绍了如何安装和维护Cluster.但关于Clu ...
- jq方法写选项卡的基本原理以及三种方法
使用jq写选项卡,告别了繁琐的循环以及命名规范 基本原理: 1.当某一个btn被选中时,将这个btn的背景颜色设为橘色,其余兄弟btn背景颜色设为空(none) 2.如果子div与btn的索引相同,就 ...
- javascript基础修炼(13)——记一道有趣的JS脑洞练习题
目录 一. 题目 二. 解法风暴 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址 ...
- 一步步剖析spring bean生命周期
关于spring bean的生命周期,是深入学习spring的基础,也是难点,本篇文章将采用代码+图文结论的方式来阐述spring bean的生命周期,方便大家学习交流. 一 项目结构及源码 1. ...
- js时间查询补充
先来看下JS中的日期操作: var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年 ...
- Maya零基础新手入门教程第一部分:界面
第1步:菜单 如果您曾经使用过一个软件,那么您将习惯菜单!在Maya中,菜单包含用于在场景中工作的工具和操作.与大多数程序一样,主菜单位于Maya窗口的顶部,然后还有面板和选项窗口的单独菜单.您还可以 ...
- PHP 插入排序 -- 希尔排序
1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值 ...