当前位置:首页 > ARCGIS最短路径 VB代码
毕业设计(论文)专用纸第四章最短路径分析的实现
本章是文章的核心部分,将介绍利用湖北省交通路网的网络数据集,以ArcEngine为平台并通过VB6.0编写程序来实现最短路径分析。文中将给出主要的代码及相关说明,并在最后贴出运行效果图。最短路径分析程序的编写大致通过六个步骤来实现。4.1程序初始化及打开工作空间并加载网络数据集4.1.2打开工作空间
'新建一个ShapefileWorkspaceFactory对象,不同类型的数据库使用不同的工作空间对象DimpWorkspaceFactoryAsIWorkspaceFactorySetpWorkspaceFactory=NewShapefileWorkspaceFactorySetOpenWorkspace=pWorkspaceFactory.OpenFromFile(strGDBName,0)'使用shapefile的空间对象连接到shapefile数据库4.1.3加载网络数据集
打开网络数据集是通过OpenNetworkDataset函数实现的。PublicFunctionOpenNetworkDataset(ByValpWorkspaceAsIWorkspace,ByValsNDSNameAsString)AsINetworkDatasetDimpWorkspaceExtensionManagerAsIWorkspaceExtensionManagerDimpWorkspaceExtensionAsIWorkspaceExtensionDimiAsLongDimcountAsLongDimpDatasetContainer2AsIDatasetContainer2'获取扩展工作空间SetpWorkspaceExtensionManager=pWorkspacecount=pWorkspaceExtensionManager.ExtensionCountFori=0To(count-1)SetpWorkspaceExtension=pWorkspaceExtensionManager.Extension(i)If(pWorkspaceExtension.Name=\Dataset\ThenSetpDatasetContainer2=pWorkspaceExtensionSetOpenNetworkDataset17=毕业设计(论文)专用纸pDatasetContainer2.DatasetByName(esriDTNetworkDataset,sNDSName)ExitFunctionEndIfNextEndFunction4.2创建网络分析上下文对象NAContext和网络分析决策对象NASlover
网络数据集打开后,可以根据网络数据集对象创建NAContext网络分析上下文对象和网络分析决策对象NASlover,CreateSolverContext函数完成了该功能。PublicFunctionCreateSolverContext(pNetDatasetAsINetworkDataset)AsINAContext'得到数据元素DimpDENDSAsIDENetworkDatasetSetpDENDS=GetDENetworkDataset(pNetDataset)DimpNASolverAsINASolverDimpContextEditAsINAContextEditSetpNASolver=NewesriNetworkAnalyst.NARouteSolverSetpContextEdit=pNASolver.CreateContext(pDENDS,\pContextEdit.BindpNetDataset,NewGPMessagesSetCreateSolverContext=pContextEditEndFunction其中GetDENetworkDataset函数定义如下:PublicFunctionGetDENetworkDataset(pNetDatasetAsINetworkDataset)AsIDENetworkDataset'从网络数据集到数据集组件DimpDSComponentAsIDatasetComponentSetpDSComponent=pNetDataset18毕业设计(论文)专用纸'得到数据元素SetGetDENetworkDataset=pDSComponent.DataElementEndFunction4.3加载位置点并创建最短路径图层
4.3.1加载位置点
在这里要用到LoadNANetworkLocations函数,其作用主要是根据点图层在网络拓扑图层上确定用户需要查找最优路径所要经历的点PublicSubLoadNANetworkLocations(ByRefpContextAsINAContext,_ByValstrNAClassNameAsString,_ByValpInputFCAsIFeatureClass,_ByValSnapToleranceAsDouble)DimpNAClassAsINAClassDimpClassesAsINamedSetSetpClasses=pContext.NAClassesSetpNAClass=pClasses.ItemByName(strNAClassName)'删除已经存在的映射关系pNAClass.DeleteAllRows'创建一个NAClassLoader对象并设定亢差值DimpLoaderAsINAClassLoaderSetpLoader=NewNAClassLoaderSetpLoader.Locator=pContext.LocatorIfSnapTolerance>0ThenpLoader.Locator.SnapTolerance=SnapToleranceSetpLoader.NAClass=pNAClass'新建一个图层根据输入的类自动生成图层。DimpFieldMapAsINAClassFieldMap19毕业设计(论文)专用纸SetpFieldMap=NewNAClassFieldMappFieldMap.CreateMappingpNAClass.ClassDefinition,pInputFC.FieldsSetpLoader.FieldMap=pFieldMap'读取网络位置点DimrowsInAsLongDimrowsLocatedAsLongpLoader.LoadpInputFC.Search(Nothing,True),Nothing,rowsIn,rowsLocatedEndSub4.3.2点击查询
将点图层中的点映射到网络拓扑中参与最短路径分析并生成一个新的图层显示。IfMe.Option1.Value=TrueThenSetmyFeatureLayer=NewFeatureLayerIfpNewFeatureClassIsNothingThenMsgBox\请先确认点的位置\ExitSubEndIfIfpNewFeatureClass.FeatureCount(Nothing)<2ThenMsgBox\至少要输入两个位置点\ExitSubEndIfSetmyFeatureLayer.FeatureClass=pNewFeatureClassmyFeatureLayer.Name=\MapControl1.AddLayermyFeatureLayerSetpInputFClass=pNewFeatureClassLoadNANetworkLocationsm_pNAContext,\pInputFClass,10000'Stop表示点图层中的点表示的是节点'pInputFClass点图层的特征类20
共分享92篇相关文档