网络数据集环境下的最短路径计算

更新时间:2023-12-25 20:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. 调用ArcEngine中网络分析模块的注意事项

ArcGIS中进行用于网络分析的数据模型主要有两类:Geometry Network(几何网络)和Network Dataset(网络数据集),分别适用于效用网络建模和交通网络建模,处理这两种网络的扩展模块分别是Network Analysis和Network Analyst。本次课程主要介绍基于网络数据集的分析应用,在ArcObjects中有一系列的组件和接口用来实现对网络数据集的各种操作,但是在ArcEngine中要调用这些功能,需要在LicenseControl中启用Network Analyst模块,具体方法是:

图1. 设置LicenseControl的属性

图2. 启用Network Analyst模块

2. Geodatabase模式下矢量数据库的基本组织结构

目前ArcGIS系列产品统一在Geodatabase模式下基于关系数据库模型的概念存储和管理地理数据,从最底层开始,一个单独的地理对象就是一条记录(row),同类对象的集合构成一个数据集(dataset)或者称为数据表(table),多个相关的数据集组成一个工作空间(workspace),workspace相当于一个数据库,或者说是一种相关数据集的容器。上述概念在不同的应用类型中也有不同的名称,例如在矢量数据模型环境下,地理对象称为“要素”(feature),数据集对应于要素集(feature dataset)或者要素类(feature class)。

在统一的Geodatabase模式下,获取地理数据或者创建地理数据都遵循统一的操作模式:首先打开(或创建)相应的工作空间,然后利用这个工作空间创建新的数据集(创建数据表)、或者打开该空间所包含的数据集(数据表),最后,通过数据集获取或者创建地理数据。

在shapefile数据模型下,一个workspace对应于存储了shapefiles的一个文件目录其中的每一组shapefile文件(包括同名的.shp、.shx、.dbf等文件)构成一个数据集,其中的数据构成一个要素类(feature class),单独的矢量要素就作为记录在要素类中逐条管理。

3. ArcObjects中与Geodatabase相关的主要组件和接口,及其使用方法 3.1. 与workspace相关的组件和接口、打开和创建workspace的方法

在AO组件库中有多个处理workspace的组件,如图4所示,它们对应于不同类型的空间数据存储模型,共同点是都实现了IWorkspace接口,这个接口中定义了多种常用的workspace相关操作方法,列表见图3所示。其中最常用组件是Workspace和

RasterWorkspace,分别对应于矢量数据模型和栅格数据模型下的空间信息管理,由于网络数据集主要基于矢量数据模型,因此本课程主要讨论Workspace组件的相关操作。

图3. IWorkspace接口的方法列表

图4. AO库中操作workspace的各种组件

除了图4所展现的组件分类,workspace的另一种、也是更常用的分类规则是按照数据存储方式来划分,按这种方法分类后的主要workspace类别定义在AO组件库的枚举型常数esriWorkspaceType中,其中包括的类别和说明见图5所示:

图5. 按存储方式来划分的workspace类别

其中,

esriFileSystemWorkspace对应于以文件形式存储信息的工作空间,例如converage、shapefiles等;

esriLocalDatabaseWorkspace对应于在本地(本机)关系型数据库中存储信息的工作空间,例如在Access中存储的各种Personal数据库;

esriRemoteDatabaseWorkspace对应于在远程数据库中存储信息的工作空间,例如存储在大型数据库系统(如Oracle、SQLServer等)中ArcSDE或者OLE DB等。

AO在workspace方面的设计特点是,同一种workspace组件往往可以提供操作不同类型workspace的功能,而且由于是同一种workspace组件,因此功能调用的形式都是相同的,AO用这种方式实现了在具体应用中屏蔽数据存储细节的效果。例如,无论矢量要素以shapefiles还是Personal Geodatabase或者是ArcSDE的方式存储,最终都是利用Workspace组件实现数据管理。这样当然在开发中带来了很多便利,但也产生了一个问题:当我们创建了Workspace组件对象之后,如何才能识别其面对的具体的数据存储模式呢?简单的想法是设置某个Type属性的值,但这种方案实际上有很多缺陷,AO为我们提供的方案是运用一种称为“对象工厂(object factory)”的设计模式,在这种模式下,我们所需要的对象不是通过new的方式创建的,而是通过一种特定的、与具体环境相关的“工厂对象”所生产(创建)出来的,虽然创建出来的对象属于同一个类(class),具有同样的调用形式,但如果

创建它们的“工厂”不同,则对象的行为实质也不同。这一模式在AO中的具体体现就是,AO组件库提供了大量的workspace工厂(workspace factory)组件,用来针对不同数据存储模式创建所需的workspace组件对象,例如AccessWorkspaceFactory组件可以创建一个操作存储在access数据库中的Geodatabase数据的Workspace组件对象,

PCCoverageWorkspaceFactory组件可以创建一个操作PC上的Coverage文件的Workspace组件对象,ShapefileWorkspaceFactory组件可以创建一个操作shapefiles文件的Workspace组件对象,等等。所有的workspace工厂组件都实现了IWorkspaceFactory接口,可以通过这个接口在帮助文档中查找所有的workspace工厂组件,查找结果如图5中的表结构所示。

本课程以shapefiles为例,下面简要介绍创建或打开一个shapefiles工作空间的基本方法。首先要明确的一个概念是,一个esriFileSystemWorkspace类型的工作空间(shapefiles工作空间属于这个类型)在实际的物理存储中对应于磁盘上一个存储了若干数据文件的目录,这很好理解,因为这种类型的工作空间中的数据实际上是以磁盘文件形式存储的(例如shapefiles工作空间中的数据以shapefiles文件存储),作为数据集容器的工作空间自然就应该对应于这些数据文件的父目录。在这个概念下,创建一个针对esriFileSystemWorkspace类型的工作空间实际上等价于创建一个新的目录用于存储相关数据文件;而打开一个该类型工作空间等价于打开一个保存了数据文件的目录。

那么,操作shapefiles文件工作空间的基本流程是,先创建一个

ShapefileWorkspaceFactory对象[注:AO中的ShapefileWorkspaceFactory组件是基于一种称为“单例模式”(singleton)的设计模式编写的,这种模式的组件在整个程序运行期都只具有唯一的对象实例(其它的workspace factory组件都具有这种性质)],然后通过其IWorkspaceFactory接口中定义的Create方法创建新的工作空间(新的文件目录),或者通过OpenFromFile方法打开指定的工作空间(指定名字的目录)。其中Create方法返回一个轻量级的IWorkspaceName类型对象,通过它进一步实质性的生成新的工作空间,而OpenFromFile方法直接返回一个IWorkspace类型的对象,用于后续的数据操作。由于基础数据往往来自于其他专业软件的制作,因此在二次开发中OpenFromFile是更常用的方法,该方法的参数非常简单,如图7所示,其中fileName参数表示工作空间对应的文件或者目录的名称,注意如果是目录名的话,不要在最后添加“\\\\”,hWnd参数是一个相关的窗口或者应用程序句柄,一般设置为0就可以了。

图6. AO中的workspace工厂组件列表

图7. OpenFromFile的参数列表

3.2. 与dataset相关的组件和接口、打开和创建dataset的方法

获取相应的工作空间组件对象是后续数据操作的起点,在矢量数据模型下,这个组件对象一般来说是Workspace组件对象。根据前述Geodatabase数据组织的层次化结构,工作空间的下一层是数据集对象,对应于不同类型的数据结构,AO中有不同种类的数据集组件对象,所有的数据集组件对象都实现了IDataset接口,如果查看Workspace组件对象的接口列表,可以发现它本身也具有IDataset接口,说明数据集是一个外延更广泛的概念,一个数据库本身也可以看做是一种特殊的复合数据集。通过Workspace组件对象的IWorkspace

naRouteSolver.OutputLines = esriNAOutputLineType.esriNAOutputLineTrueShape; //参数设置后更新分析环境

naSolver.UpdateContext(naContext, deNetworkDataset, new GPMessagesClass()); //将路径图层加入到地图中

axMapControl1.AddLayer(naLayer as ILayer); 5.3. 设置停靠点对象的方法

为了简化内容,我们仅以停靠点为例介绍分析对象的设置方法,设置一个分析对象相当于在路径图层中添加一个矢量要素,其数据格式由相应的NAClass对象定义,我们可以入ArcMap的操作中那样交互式的手工设置,但是更多的实际情况下是根据已有的地图数据中的某些特征位置进行设置(例如在公交查询中基于车站位置进行设置),这些已有位置往往保持在其他的shapefiles中。我们以此为例介绍设置方法:

//获取停靠点(Stops)对象类

INAClass stopsNAClass = naContext.NAClasses.get_ItemByName(\// 创建一个加载器对象用于分析对象的自动加载 INAClassLoader naLoader = new NAClassLoaderClass(); naLoader.Locator = naContext.Locator; naLoader.NAClass = stopsNAClass; int rowsInCursor = 0; int rowsLocated = 0;

// 创建一个查询条件对象用于设置停靠点的查找条件 IQueryFilter filter = new QueryFilterClass();

//设置查找条件用于在包含特征位置的矢量要素类中搜索用于最短路径分析的停靠点 // 例如:filter.WhereClause = \

// 加载停靠点,其中inputStopsFClass表示包含特征位置的矢量要素类,需要由开发者另

// 行指定

naLoader.Load(inputStopsFClass.Search(filter, true) as ICursor, new CancelTrackerClass(), ref rowsInCursor, ref rowsLocated);

5.4. 路径求解和结果显示的方法

求解过程实际上就是调用求解器组件中的Solver方法,结果显示已经在求解器的OutputLines属性中设定了。

INASolver naSolver = naContext.Solver;

naSolver.Solve(naContext, new GPMessagesClass(), new CancelTrackerClass()); 作业安排

在所给数据中实现简单的最短路径计算功能。

本文来源:https://www.bwwdw.com/article/facx.html

Top