先看Global Turn 。网络数据集默认情况就会创建Global Turn ,它存在于网络数据集的每个路口。可以针对不同的道路,不同的转向设置不同的成本,或者限制其转向。转向的设置对距离和时间的Cost 属性是有差别的。
距离类型的Cost 属性,转向的赋值器有三种,Constant 和Function 比较简单,VB Script 赋值器可是一个非常强大的工具,它在分析运行时才会计算其值,因此也必然会影响网络分析的速度。但是很多时候我们还是不得不用,最近刚好有用户提出一个问题,他们发现路径计算的结果在高架上出现了掉头的现象,这是不符合实际情况的,仔细沟通了之后,发现,事实上他们原始的数据存在一定的问题,高架矢量化的是单线双向的,而规范的导航数据,对于这样级别的道路必定双线甚至是多线单向的,上下匝道也是单向。但是没办法,要实现网络分析的功能,并且还要保证结果保持一定的准确性,还不能耗费太大力气去重新纠正数据,虽然有点勉为其难,重新研究了下网络分析当中的边边角角,居然发现Global Turn 的VB Script 赋值器可以轻松应付这件事(时间类型的Cost 属性Turn 的设置还会有另外一种方式,稍后提)。
。
时间类型的Cost 属性,转向的赋值器有四种,Constant 、Function 、VB Script 已经介绍,第四种Global Turn Delay 赋值器,Global Turn Delay 只有在时间类型的Cost 属性中才会见到,你可以通过Global Turn Delay 设置不同类型转向的通行成本或者禁止某种类型的转向。可以定义不同转向的角度范围,当然最重要的是可以针对不同的转向来设置其通行成本。如果网络数据集设置了hierarchy ,那么在Global Turn Delay 对话框下部的列表中,可以对不同等级道路之间的转向赋以不同时间成本,默认情况下转向类型的列表框只列出20 种常见的Type ,要是大家仔细看下我截下的图会发现当中远远不止20 种,对的,其中列出了所有可能的类型(很简单,点击Load From File 按钮,定位至arcgis install home/NetworkAnalyst/NetworkConfiguration/AllNetworkGlobalTurnDelaySettings.xml ,就可以看到所有的转向类型了),前面提到的禁止高架掉头的问题,可以算作一个练习,大家试试如何在Global Turn Delay 中实现,应该不难;如果网络数据集没有设置hierarchy ,情况就简单多了。
我们再看Turn Feature Class 。到目前为止,我所接触到的应用网络分析的用户或者系统,极少会用到Turn Feature Class 的,但Turn Feature Class 是模拟道路实际通行状况的非常重要的元素。当然,不是不想用,而是一者可能没有精力和财力去采集实际转向的数据;二者可能自己有转向的数据,不知如何转换成网络分析的Turn Feature Class 。第一种情况,我也没办法解决;第二种情况,我想我可以。
首先看一下Turn Feature Class 的表结构。它本质上就是一个Line Feature Class ,是将Turn Feature 经过的路段ID 、路段所在Feature Class ID 等存储起来,默认情况下Turn Feature 支持5 条路段,这在大部分情况下是足够了,如果有特殊情况,Turn Feature Class 最大可以支持到20 。
其实我想,我们如果平常喜欢写程序的话,接下来的事情应该不需要我啰嗦了,一劳永逸的事情就是写个程序,根据自己定义的转向表结构生成网络分析支持的Turn Feature Class 。我已经根据下图的Turn 表结构写了生成Turn Feature Class 的Engine 程序,如果有朋友需要,可以联系我。提到这个程序,说点题外的事情,因为根据这个Turn 表生成Turn Feature Class 需要通过路段的ID 不断搜索其对应的路段Feature ,如果原始的路段图层没有建立属性索引,耗时相当厉害,我原先的程序在没有建属性索引的情况下,运行了20 多分钟才出来结果,但是建立属性索引之后,仅仅需要4 秒钟左右。