NAClass是一个要素类,它存储了类似于站点(stops)、障碍(barriers)、突发事故(incidents)、路径(routes)、cfpaths的要素。NAClass的工作空间就是NAContext,NAClass并没有一个固定的存储数据源,因此也被称作“缓存要素类(in-memory)”(临时生成,记录其详细的属性数据,通过NAClassFieldMap对象来获得相应的属性字段)。但是如果需要的话,它也可以保存在磁盘上。可以通过以下两种方式访问NAClass:
INALayer::LayerByNAClassName(“Stops”)::FeatureClass或 INAContext::NAClasses::ItemByName(“Stops”).
NAClass提供NALocationObjects和NALocationFeatures,INALocationObject接口可以明确NAClass在网络中的位置。
NAClassDefinition定义了对于扩展有帮助的类的附加信息。当solver创建NAContext和NAClasses时,NAClassDefinition被初始化。可通过INAClass:: ClassDefinition来访问。它有可以决定solver要求的最大/最小行数的方法,它也可以每个字段是否可以输入、输出、不可见、不可编辑等。
除非我们自定义solver(可以定制吗?可以选择不同的算法?),否则不用修改NAClassDefinition属性除了CandidateFieldNames。
(2)Locating and Loading
此子系统表达了用来加载NAClass(如站点、障碍等)的对象,它的本质是取出要素,通过检查要素在网络数据集中的side和position来确定要素在网络中的位置,并且通过这种新信息在NAClass中创建新要素。
完成
locating
的对象包括
NALocator、NALocatorFeatureAgent、
NALocatorLocationFieldsAgent,将要素导入一个NAClass的对象包括一个NALocator(NAClassLoader、NAClassFieldMap)。
如果你有自己的locating要素的方法,那就意味着你能够在NAClass里插入行,就不需要使用这个子系统里的对象。
NALocation对象确定要素在网络上的位置: SourceID是要素类在网络数据集上的SourceID SourceOID是定位要素的ObjectID Side是左边或右边
SourcePosition确定了网络位置离source feature的距离。
默认的NALocator是当solver创建NAContext时,由NAContext创建的,可以通过设置INAContextEdit接口的NALocator属性来改变默认的locator。
NALocator由很多locator agents(代理),NALocator的任务是反复浏览agents并且决定那个agent返回的是最佳位置。大多数情况下,agents是NALocatorFeatureAgents。
如果数据源的要素类中已经有了定位的字段,并且你希望使用这些替代在网络中生成的位置,则可以使用NALocatorLocationFieldsAgent对象。
NAClassLoader和NAClassFieldMap对象可以一起使用,并通过NALoactor来将INALocationObjects从输入要素类加载到NAClass中。
3、Solvers
Solver用来描述一个对象并且执行真正的网络分析,在9.1版本里有以下四个solvers:
NARouteSolver:在多个站点之间寻找最佳路径;
NAClosestFacilitySolver:寻找事故点和设施间的最佳路径; NAServiceAreaSolver:服务区域(我理解)
NAODCostMatrixSolver:在起点和终点之间寻找最小的花费
Solver有很多特殊的属性,例如cutoff、impedance attribute(路程或时间)等,配置这些属性以便决定分析如何执行。
在将来的版本中,ESRI将发现其他附加的solvers。我们也可以写自己的solver,但是那是一项耗值(non-trivial)的工作。
Solver的工作就是判断分析工作需要的东西(如需要什么类型的网络位置,需要输入什么属性信息等),solver需要创建NAContext和NALayer,并且如果它们的属性发生变化,也需要solver来更新 。通常的模式就是创建一个新的分析时候需要调用INASolver::CreateLayer。
另外,创建一个保存执行结果(INAResult)的对象也是solver的工作。
INASolver::CreateContext,
INADataset::Bind,
and
then
4、Traversal(Z形攀登) Results
ESRI的四个solvers均输出一个ANTraversalResult对象,它记录了分析的结果。最基本的情况Traversal result可以看作记录了所有的连接信息的下面三个要素类。
Edges:包含在分析中用到的每个边(edge Traversed),有明确FromJunction和ToJunction的字段;
Junctions:包含每个junction和输入网络位置(input network location traversed);
Turns:包含每个转弯(turn Traversed)。
这三个要素所返回特殊的要素类,除了执行普通的Feature接口外,也可以执行INATraversalResultElement接口。
INAResult接口有得到输出属性和输出context的方法。
在NATraversalResult里有一个间接的标准,由于这个标准,我们必须使用INATraversalResult接口中的方法去查找不同数据源(traversal result和相应的geodatabase或者NAClass source)形成的地图。
INATraversalResultQuery用来从一个traversal result element traverse到另一traversal result element。可以通过SearchConnected方法查找与某个TraversalResultElement连接的NATraversalResultElement,或者,既然它们都是feature class,我们可以得到某一类型(例如edges)的所有traversal result的feature class,并且仅仅打开一个search cursor。
NATraversalResult并不存储在NAContext里,如果有需要可以将其存储在外部的数据结构里面。
5、Directions
Directions被模拟为在NAContext中的NAAgent,它们通过读取NATraversalResults去
构建drivetime directions。