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 数据:实验数据 ...
随机推荐
- 在网页中打印一个99乘法表--JavaScript描述
99乘法表使用for循环,在很多公司的面试中常会要求面试者手写这个算法,算是比较经典的for循环的应用 <!DOCTYPE html><html lang="en" ...
- httpd2.4
更换网站主页目录 1.在httpd.conf文件中更改documentroot为新的路径,并为其相应的路径给与相应的权限. Documentroot "/www/http" < ...
- [WP8.1]给Pivot的Header加上颜色
先上个效果图 以前想实现这个给Pivot加颜色时只找到8的,通过参考8的实现方式,8.1的实现如下,在Pivot的样式上做一些修改,如下图的红框处 另外如果要改Pivot的Header里文字的颜色又要 ...
- js中的toString和valueOf
数据的转换 基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题 所有对象继承了两个转换方法: 第一个是toStri ...
- 安装VMworkstation和Centos虚拟机
1.安装VMware workstation. 2.下一步. 3.可以选择安装位置,下面选项不选. 4.这两个选项不需要选. 5.下一步 6.安装 7. 8.点击许可证输入密钥,密钥在网上搜,然后就完 ...
- 前端深入之css篇丨2020年前,彻底掌握css动画【animation】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- C++ 利用template给函数中的变量赋初值
#include <iostream> template<int base> void echo(int add) { int sum=add+base; std::cout& ...
- [网络流 24 题] luoguP2763 试题库问题
[返回网络流 24 题索引] 题目描述 假设一个试题库中有 nnn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 mmm 道题组成试卷.并要求试卷包含指定类型的试题. ...
- Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?
当前时间:2019年10月24日.距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate.o ...
- CentOS6.5下搭建FTP服务
一.FTP协议 FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一.FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端.其中FT ...