简单介绍:
拓扑学是一门研究几何图形位置关系的科学。
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 数据:实验数据 ...
随机推荐
-
idapython实现动态函数调用批量注释
部门小伙伴遇到一个样本需要对动态函数调用就行批量注释还原的问题,通过idapython可以大大的减少工作量,其实这一问题也是很多样本分析中最耗时间的一块,下面来看看如何解决这个问题(好吧这才是今年最后 ...
-
*部署与FQ教程(2016-10-28)
这篇文章是为了帮助使用*-crack来FQ的同学,主要是几个想用该项目来FQ的同学对github主页的FQ文档大力吐槽,索性写一篇详细的文档来支持一下大家,其中包含了google gae ...
-
常用的JavaScript模式
模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...
-
CURL采集
<?php $url='';//输入'网址 $ch = curl_init(); $timeout = 5;//超时时间 curl_setopt ($ch, CURLOPT_URL, $url) ...
-
SQL server 存储过程的建立和调用
存储过程的建立和调用 --1.1准备测试需要的数据库:test,数据表:物料表,采购表if not exists (select * from master.dbo.sysdatabases whe ...
-
【js】高阶函数是个什么?
所谓高阶函数,就是函数中可以传入另一个函数作为参数的函数. 简单一张图,方便理解全文. function 高阶函数(函数){} 这是一个高阶函数,f是传入的函数作为参数. 其实高阶函数用的很多.其实平 ...
-
Day14全局变量与局部变量
列表的所有方法都可以用,如remove clear 为了避免容易出错,全局变量名用大写,局部变量名用小写 nonlocal指上一级的name
-
课程四(Convolutional Neural Networks),第二 周(Deep convolutional models: case studies) —— 0.Learning Goals
Learning Goals Understand multiple foundational papers of convolutional neural networks Analyze the ...
-
连接数据库工具类DBUtil
代码如下: import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; ...
-
Rails 5 Test Prescriptions 第7章 double stub mock
https://relishapp.com/rspec/rspec-mocks/v/3-7/docs/basics/test-doubles 你有一个问题,如果想为程序添加一个信用卡程序用于自己挣钱. ...