/// <summary> /// Occurs when this command is clicked /// </summary> public override void OnClick() { string name = NetWorkAnalysClass.getPath(path) + "\\data\\HuanbaoGeodatabase.gdb"; //得到数据库文件路径 IFeatureWorkspace pFWorkspace = NetWorkAnalysClass.OpenWorkspace(name) as IFeatureWorkspace; //打开要素工作空间 //"RouteNetwork","BaseData"参数不可更改 networkDataset = NetWorkAnalysClass.OpenPathNetworkDataset(pFWorkspace as IWorkspace, "RouteNetwork", "BaseData"); //打开网络数据集 m_NAContext = NetWorkAnalysClass.CreatePathSolverContext(networkDataset); //通过网络数据集创建网络分析上下文 inputFClass = pFWorkspace.OpenFeatureClass("Stops"); //根据名字打开站点要素类 barriesFClass = pFWorkspace.OpenFeatureClass("Barries"); //根据名字打开障碍点要素类 if (IFLayerExist("NetworkDataset") == false) //若不存在NetworkDataset图层就执行 { //创建名为“NetworkDataset”的图层 ILayer layer; INetworkLayer networkLayer; networkLayer = new NetworkLayerClass(); networkLayer.NetworkDataset = networkDataset; layer = networkLayer as ILayer; layer.Name = "NetworkDataset"; m_hookHelper.ActiveView.FocusMap.AddLayer(layer); layer.Visible = false; } //检查是否存在名为“Route”的图层。若存在则删除 if (IFLayerExist(m_NAContext.Solver.DisplayName) == true) { for (int i = 0; i < m_hookHelper.FocusMap.LayerCount; i++) { if (m_hookHelper.FocusMap.get_Layer(i).Name == m_NAContext.Solver.DisplayName) { m_hookHelper.FocusMap.DeleteLayer(m_hookHelper.FocusMap.get_Layer(i)); } } } INALayer naLayer = m_NAContext.Solver.CreateLayer(m_NAContext); ILayer pLayer = naLayer as ILayer; pLayer.Name = m_NAContext.Solver.DisplayName; m_hookHelper.ActiveView.FocusMap.AddLayer(pLayer);//往当前地图中添加该图层 int featureCount = inputFClass.FeatureCount(null); //得到站点要素类中要素的个数 if (featureCount < 2) //若少于两个则不能进行分析 { MessageBox.Show("只有一个站点,不能进行路径分析!"); return; } IGPMessages gpMessages = new GPMessagesClass();//定义一个地理处理结果信息返回对象 //加载站点要素,并设置容差 NetWorkAnalysClass.LoadNANetworkLocations("Stops", inputFClass, m_NAContext, 80); //加载障碍点要素,并设置容差 NetWorkAnalysClass.LoadNANetworkLocations("Barriers", barriesFClass, m_NAContext, 50); INASolver naSolver = m_NAContext.Solver;//创建网络分析对象 try { naSolver.Solve(m_NAContext, gpMessages, null);//执行最短路径分析 } catch (Exception ex) { MessageBox.Show("未能找到有效路径" + ex.Message, "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); return; } //将“Routes”图层组下的“Stops”、“Point Barriers”图层设为不可见 for (int i = 0; i < m_hookHelper.FocusMap.LayerCount; i++) { if (m_hookHelper.FocusMap.get_Layer(i).Name == m_NAContext.Solver.DisplayName) { //ICompositeLayer Interface Provides access to members that work with a collection of layers that behaves like a single layer. //CompositeLayer为图层组类型 ICompositeLayer pCompositeLayer = m_hookHelper.FocusMap.get_Layer(i) as ICompositeLayer; for (int t = 0; t < pCompositeLayer.Count; t++) { ILayer pResultLayer = pCompositeLayer.get_Layer(t); if (pResultLayer.Name == "Stops" || pResultLayer.Name == "Point Barriers") { pResultLayer.Visible = false; continue; } } } } //接下来将地图的视图范围缩放至最短路径的显示范围 IGeoDataset geoDataset; //地理数据集 IEnvelope envelope; //最小边界矩形 geoDataset = m_NAContext.NAClasses.get_ItemByName("Routes") as IGeoDataset; //The IGeoDataset::Extent property returns an envelope representing the maximum extent of data which has been stored in the dataset. envelope = geoDataset.Extent; if (!envelope.IsEmpty) { envelope.Expand(1.1, 1.1, true); } //将地图的显示的范围设置为“Routes”图层的数据范围 m_hookHelper.ActiveView.Extent = envelope; //刷新视图 m_hookHelper.ActiveView.Refresh(); //获取最短路径“Routes”要素 ITable table = m_NAContext.NAClasses.get_ItemByName("Routes") as ITable; ICursor cursor = table.Search(null, false); IRow row = cursor.NextRow(); for (int i = 0; i < table.Fields.FieldCount; i++) { if (table.Fields.get_Field(i).AliasName == "Total_Shape_Length") { //获取最短路径的总长度 total_Length_str = row.get_Value(i).ToString(); } } }