最近设施点学习笔记

2026/1/17 19:29:26

至此,Initialize部分完。我们回过头看看这部分代码里面主要发生了什么:打开工作数据集和网络数据集,建立分析用的NAContext,载入网络位置点(即将featureClass映射成NAClass),将网络数据集添加到MapControl里面显示,将NAContext里面的东西作为一个图层添加到MapControl里面显示。

想想,如果我们不用这种硬编码的方式,而是借助于toolbarcontrol控件来向MapControl中加载地图的话,我们所要做的可能仅仅只是载入网络位置点了。

3.4 cmdSolve_Click

前面初始化的工作已经完成了,并且我们相信用户已经根据自己的需求对于程序界面上的checkbox、textbox之类都进行了操作,已经将自己的需求写在窗体界面上了。就像我们已经用高级语言写好了一个数学函数计算程序,并设置好了各变量的值,剩下求解的事情便由计算机来完成了。那么,多说无益,我们直接按下求解按钮,开始求解吧。

(1)设置Solver属性。

此子函数为 public void SetSolverSettings()。需要设置的属性有:ClostFacility特定属性(目标个数、cutoff、Outputline、TravelDirection)和一般属性(阻抗、单行限制、Uturn限制、Hierachy)。

INASolver naSolver = m_NAContext.Solver;

INAClosestFacilitySolver cfSolver = naSolver as INAClosestFacilitySolver;

其实我的理解是再定义一个cfSolver是没有太大必要的,因为前面定义naSolver的时候,就已经将其设置为INAClosestFacilitySolver了。

设置时候,一般都是根据checkbox和textbox为这些属性赋值或者给一个枚举型的值,都比较简单。有些意思的是单行限制和Hierachy的设定。

// 单行限制设定 IStringArray restrictions;

restrictions = naSolverSettings.RestrictionAttributeNames; restrictions.RemoveAll(); if (chkUseRestriction.Checked) restrictions.Add(\);

naSolverSettings.RestrictionAttributeNames = restrictions;

很多人会疑问,什么是Hierachy呢?在NA模块中,Hierachy默认支持三级,其通过int型值对边界元素的等级进行划分(在建立Network Dataset的时候做的),例如整个道路网络划分为主干道、次干道、支路。这和一般城市将市政道路划分为一级、二级、三级道路有相似之处。

它的目的是什么呢?Hierachy的主要目的——让NA模块以最高的效率求解出最适宜的解决路径。这个最适宜的路径并不一定是距离最短,但是,从现实生活来讲,往往更方便。譬如开车从某城市A地到B地,你有好几种选择,一种是沿着“小路”慢慢溜达,另一种是在最近的地方上外环线或者上高速,到离B地的地方再下外环线,沿着“小路”溜达。显然,更多的人都倾向于第二种方案,尤其A离B较远的时候。那么使用Hierachy的目的,也就在于此。

NA模块的基础算法是Dijsktra算法。在使用Hierachy的时候,一旦由low level到了更高一级,那么NA模块就可以忽略low level的计算,这也就是使用Hierachy可以提高计算效率的原因。

// Set the Hierachy attribute

naSolverSettings.UseHierarchy = chkUseHierarchy.Checked; if (naSolverSettings.UseHierarchy) {

naSolverSettings.HierarchyAttributeName = \; naSolverSettings.HierarchyLevelCount = 3; naSolverSettings.set_MaxValueForHierarchy(1, 1); naSolverSettings.set_NumTransitionToHierarchy(1, 9); naSolverSettings.set_MaxValueForHierarchy(2, 2); naSolverSettings.set_NumTransitionToHierarchy(2, 9); }

set_MaxValueForHierarchy方法的签名如下:

//设置某一等级的边界元素的int型值。(

The maximum value for the specified hierarchy level

in the network dataset.

public void set_MaxValueForHierarchy ( int level, int Value ); set_NumTransitionToHierarchy方法的签名如下:

// 再跳入更高一级前,在本级中浏览的junctions数量(The number of lower level junctions to explore before searching the next hierarchy level.) public void set_NumTransitionToHierarchy ( int toLevel, int Value ); NumTransitionToHierarchy这个属性应该设置起来也要靠经验才行。否则:太小了,计算出来的路径不理想;太大了,则计算的效率又低了。

OK,在全部属性设置完成之后,把NAContext更新一下吧。

naSolver.UpdateContext(m_NAContext, GetDENetworkDataset(m_NAContext.NetworkDataset), new GPMessagesClass());

(2)求解

好了,准备工作都做完了,求解吧。

IGPMessages gpMessages = new GPMessagesClass();

if (!m_NAContext.Solver.Solve(m_NAContext, gpMessages, null)) GetCFOutput(\); else

lstOutput.Items.Add(\);

Solve方法之后得到的结果如果返回True,说明部分解决,返回False,说明全部解决。 如果问题全部解决,自然有Incident点到Facility点的路径信息子函数GetCFOutput的作用就在于此。必须注意GetCFOutput(\)中的\字符串也是固定的。此子函数将NAContext这个容器里面生成好的CFRoutes作为一个表格,并将这些表格中的信息表现在Listbox控件中。当然,你也可以想方法,把这些信息存入数据库中,或者导入到excel文件中等等。

gpMessages的作用在于告诉用户是否有错误发生。当然,如果你不想让这些错误信息堂而皇之的出现在程序主界面上,你也可以将这些信息添加到日志管理器如Log4net中。


最近设施点学习笔记.doc 将本文的Word文档下载到电脑
搜索更多关于: 最近设施点学习笔记 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219