ArcEngine中最短路径的实现
最短路径分析属于ArcGIS的网络分析范畴。而ArcGIS的网络分析分为两类,分别是基于几何网络和网络数据集的网络分析。它们都可以实现最短路径功能。下面先介绍基于几何网络的最短路径分析的实现。以后会陆续介绍基于网络数据集的最短路径分析以及这两种方法的区别。
几何网络是一种特殊的特征要素类,由一系列不同类别的点要素和线要素(可以度量并能图形表达)组成的,可在FeatureDataset下面创建, 可进行图形与属性的编辑。包括流向分析和追踪分析两大功能。主要接口是ITraceFlowSolver。我们先在一幅地图上做出一个几何网络才能进行最 短路径分析。下面是主要的一些步骤(ArcMap帮助中琐碎的说明有三四十项,被我省略很多):
1、打开ArcCatalog,连接到包含地图的文件夹。
2、在空白处,右键新建一个“Personal GeoDatabase”。
3、在生成的Personal GeoDatabase上右键新建一个feature dataset。
4、双击Personal GeoDatabase进去,找到刚才new出的feature dataset,右键Import导入Feature Class(Single),选择要建立几何网络的图层或者shape文件。
5、然后再右键新建一个Geometric Network,选择从已存在的图元中建立几何网络。
6、打开ArcMap,把刚才建立的“Personal GeoDatabase Feature Class”添加到地图中,这样几何网络就建立好了。
这样我们就建立好一个几何网络了。我们现在要通过编程来实现最短路径,用到的接口主要有 INetworkCollection,IGeometricNetwork,IPointToEID,ITraceFlowSolverGEN(它实现 了ITraceFlowSolver的接口),INetSchema,IEIDHelper等。主要步骤如下:
1、获取几何网络工作空间
2、定义一个边线旗数组,把离点串最近的网络元素添加进数组
3、设置开始和结束边线的权重
4、进行路径分析
5、得到路径分析的结果
上次介绍了用几何网络实现的“最短路径”,这次用网络数据集实现真正的最短路径功能,跟上次一样,先处理下数据。
1、先打开ArcCatalog,连接到目标文件夹,假定该文件下有一个名为road的道路图层。
2、在road图层上右键新建一个网络数据集,并按照其默认设置直至完成。
3、打开该地图的工作空间,把刚才新建的网络数据集添加工作空间中。
4、在网络分析菜单中选择新建最近设施点。
这时在工作空间里,可以看到多了一个名为“Closest Facility”的图层。它下面还有4个子图层,名字分别为
“Facilities”,“Incidents”,“Barriers”,“Routes”。“Facilities”就是设施点图层,也就是目的
点,“Incidents”的意思就是出发点,“Barriers”是障碍点,意思就是地图某条道路附近有一个障碍点,如果障碍点与道路距离在容限范围
内,则表示此道路不通,“Routes”就是最终的结果。这样我们编程实现最短路径的思路就出现了:
1、添加出发点。
2、添加目的点。
3、生成最优路径,获取结果。
这里的添加出发点或者目的点,是往“Facilities”或“Incidents”图层上添加元素。获取结果也是从“Routes”中获取
Polyline。往“Facilities”或“Incidents”图层上添加元素用到的主要方法是INALocator的
QueryLocationByPoint函数,生成路径主要接口是INASolver和它的Solve方法。获取结果是按属性查找,因为
“Routes”类其实就是一个图层类,只不过只是存在于内存。
CMapControlDefault m_map;
IPointCollectionPtr m_ipPointCollection; ILayerPtr ipLayer = m_map.GetLayer(); // 网络数据集
INALayerPtr ipNaLayer = ipLayer;
if (NULL == ipNaLayer)
{
return;
} INAContextPtr ipNaContext;
HRESULT hr = ipNaLayer->get_Context(&ipNaContext);
INAClassLoaderPtr ipNAClassLoader(CLSID_NAClassLoader);
INALocatorPtr ipNALocator = NULL;
hr = ipNaContext->get_Locator(&ipNALocator);
ipNALocator->put_SnapToleranceUnits(esriMeters);
ipNALocator->put_SnapTolerance();
ipNaContext;
hr = ipNAClassLoader->putref_Locator(ipNALocator); INamedSetPtr ipNamedSet = NULL;
ipNaContext->get_NAClasses(&ipNamedSet); CString szName = "Facilities";
BSTR bstrName = szName.AllocSysString();
INAClassPtr ipNAFacilitiesClass = NULL;
hr = ipNamedSet->get_ItemByName(bstrName, (IUnknown**)&ipNAFacilitiesClass);
szName = "Incidents";
bstrName = szName.AllocSysString();
INAClassPtr ipNAIncidentsClass = NULL;
hr = ipNamedSet->get_ItemByName(bstrName, (IUnknown**)&ipNAIncidentsClass);
szName = "CFRoutes";
bstrName = szName.AllocSysString();
INAClassPtr ipNARoutesClass = NULL;
hr = ipNamedSet->get_ItemByName(bstrName, (IUnknown**)&ipNARoutesClass); INALocationPtr ipNALocation1(CLSID_NALocation);
INALocationPtr ipNALocation2(CLSID_NALocation);
ipNAClassLoader->get_Locator(&ipNALocator);
IPointPtr ipBeginPoint(CLSID_Point);
m_ipPointCollection->get_Point(, &ipBeginPoint);
IPointPtr ipEndPoint(CLSID_Point);
m_ipPointCollection->get_Point(, &ipEndPoint);
IPointPtr ipPoint1(CLSID_Point);
IPointPtr ipPoint2(CLSID_Point);
double dbLVal = 0.0;
ipNALocator->QueryLocationByPoint(ipBeginPoint, &ipNALocation1, &ipPoint1, &dbLVal);
ipNALocator->QueryLocationByPoint(ipEndPoint, &ipNALocation2, &ipPoint2, &dbLVal); INALocationObjectPtr ipNALocationObject = NULL;
IFeatureClassPtr ipFeatureClass = ipNAIncidentsClass;
IFeaturePtr ipFeature = NULL;
ipFeatureClass->CreateFeature(&ipFeature);
IRowSubtypesPtr ipRowSubtypes = ipFeature;
ipRowSubtypes->InitDefaultValues();
ipFeature->putref_Shape(ipBeginPoint);
ITablePtr ipTable = NULL;
ipFeature->get_Table(&ipTable);
long nIndex = ;
szName = "Sequence";
bstrName = szName.AllocSysString();
ipTable->FindField(bstrName, &nIndex);
VARIANT var_int;
var_int.intVal = ;
var_int.vt = VT_INT;
ipFeature->put_Value(nIndex, var_int);
szName = "Name";
bstrName = szName.AllocSysString();
ipTable->FindField(bstrName, &nIndex);
ipFeature->put_Value(nIndex, COleVariant("Start Point"));
ipNALocationObject = ipFeature;
ipNALocationObject->put_NALocation(ipNALocation1);
ipFeature->Store();
IFieldsPtr ipFields(CLSID_Fields);
hr = ipTable->get_Fields(&ipFields);
long nFieldCount = ;
hr = ipFields->get_FieldCount(&nFieldCount);
for (int k = ; k < nFieldCount; k++)
{
IFieldPtr ipField(CLSID_Field);
ipFields->get_Field(k, &ipField);
BSTR bstrFieldName;
ipField->get_Name(&bstrFieldName);
CString szFieldName = bstrFieldName;
} ipFeatureClass = ipNAFacilitiesClass;
ipFeatureClass->CreateFeature(&ipFeature);
ipRowSubtypes = ipFeature;
ipRowSubtypes->InitDefaultValues();
ipFeature->putref_Shape(ipEndPoint);
ipTable = NULL;
ipFeature->get_Table(&ipTable);
nIndex = ;
szName = "Sequence";
bstrName = szName.AllocSysString();
ipTable->FindField(bstrName, &nIndex);
var_int.intVal = ;
ipFeature->put_Value(nIndex, var_int);
szName = "Name";
bstrName = szName.AllocSysString();
ipTable->FindField(bstrName, &nIndex);
ipFeature->put_Value(nIndex, COleVariant("End Point"));
ipNALocationObject = ipFeature;
ipNALocationObject->put_NALocation(ipNALocation2);
ipFeature->Store(); INAClosestFacilitySolverPtr ipNACFSolver = NULL;
ArcEngine中最短路径的实现的更多相关文章
- ArcEngine中打开各种数据源(WorkSpace)的连接
(SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源.在开发过程中我们使用了如下几种数据源 1.企业数据库(SDE) 企业 ...
- ArcEngine中打开各种数据源(WorkSpace)的连接(转)
ArcEngine中打开各种数据源(WorkSpace)的连接 (SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源.在开 ...
- ArcEngine中打开各种数据源(WorkSpace)的连接http://www.cnblogs.com/feilong3540717/archive/2011/08/07/2129906.html
ArcEngine中打开各种数据源(WorkSpace)的连接 ArcEngine中打开各种数据源(WorkSpace)的连接 (SDE.personal/File.ShapeFile.CAD数据.影 ...
- [转] ArcEngine中打开各种数据源(WorkSpace)的连接
原文 ArcEngine中打开各种数据源(WorkSpace)的连接(SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源. ...
- c#+ArcEngine中的IGroupLayer的用法
转自羊子雄起原文c#+ArcEngine中的IGroupLayer的用法 在AE开发中,我们知道axMapControl.LayerCount能获取图层的数量,但是这种方法不能获取到图层组里面的图层, ...
- ArcEngine中使用上下左右键移动地图
转自愿文ArcEngine中使用上下左右键移动地图 因项目需要,需对mapcontrol控件响应上下左右键,从网上找的方法都一样,都值提到了需要设置axMapControl1的KeyIntercept ...
- C#+ArcEngine中com对象的释放问题
1.问题描述 最近在写C#下AE的开发,在循环获取数据并修改时碰到了两个问题"超出系统资源"和"超出打开游标最大数":在网上看了一些资料,发现都是说在循环中没有 ...
- ArcEngine中COM对象与其基础RCW分开后就不能再使用
操作ArcEngine中的COM对象时,为了减少内存的增长,用掉的对象要手动释放常用的方法是ReleaseComObject System.Runtime.InteropServices.Marsha ...
- ArcEngine中多边形内外环的处理(转)
ArcEngine中多边形内外环的处理 原创 2012年09月06日 22:49:11 标签: object / null / 数据库 3462 Polylgon对象是由一个或多个Ring对象的有序集 ...
随机推荐
- CISP/CISA 每日一题 七
CISA 每日一题(答) 确保只有恰当授权的出站交易才能被处理,控制目的: 1.出站交易是基于授权而被启动: 2.出站交易包含了唯一的预先授权的交易类型: 3.出站交易只能被发送到合法的商业伙伴那里. ...
- Makefile的问题
注意包含路径的变量,可能会带有空格而使得运行失败 直接定义:DEBUG = false后面引用需要使用 $(DEBUG) 或者set DEBUG $(DEBUG)之后就可以直接引用了
- 【hihocoder 1564】同步H公司的终端
[链接]http://hihocoder.com/problemset/problem/1564 [题意] 在这里写题意 [题解] 如下图 (上图中节点旁边的红色数字为它的权值) 从叶子节点开始考虑. ...
- jquery 获取上一个兄弟元素和下一个兄弟元素
jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点 jQuery.prevAll(),返回所有之前的兄弟节点 jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点 jQu ...
- fatfs输出目录
利用fatfs文件系统, 如何输出SD卡根目录下的各个文件夹名字呢? 程序如下: u8 Dirname_i; u8 Dirname_j; DIR dir; //读取txt里的目录用,还是要把fatfs ...
- POJ 3264 Balanced Lineup 线段树RMQ
http://poj.org/problem?id=3264 题目大意: 给定N个数,还有Q个询问,求每个询问中给定的区间[a,b]中最大值和最小值之差. 思路: 依旧是线段树水题~ #include ...
- 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))
Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...
- js进阶 12-18 jquery如何实现自定义右键菜单(把问题分细)
js进阶 12-18 jquery如何实现自定义右键菜单(把问题分细) 一.总结 一句话总结:用鼠标右键事件contextmenu,阻止系统默认事件,让做好的右键菜单显示出来,并且显示在我们出现的位 ...
- C语言深度剖析-----函数与指针的分析
指针的本质 指针需要保证指向任意数据类型,所以指针变量都占用32位bit即4字节. PS:不同机器上,指针占用内存不一 ...
- 使用wepy开发微信小程序商城第二篇:路由配置和页面结构
使用wepy开发微信小程序商城 第二篇:路由配置和页面结构 前言: 最近公司在做一个微信小程序的项目,用的是类似于vue的wepy框架.我也借此机会学习和实践一下. 小程序官方文档:https://d ...