private void cmdSolve_Click(object sender, EventArgs e) { try { this.lstOutput.Items.Clear(); this.lstOutput.Items.Add("Solving..."); this.SetSolverSettings(); IGPMessages messages = new GPMessagesClass(); if (!this.m_pNAContext.Solver.Solve(this.m_pNAContext, messages, null)) { this.GetCFOutput("CFRoutes"); } else { this.lstOutput.Items.Add("Partial Result"); } if (messages != null) { for (int i = 0; i < messages.Count; i++) { esriGPMessageType type = messages.GetMessage(i).Type; if (type != esriGPMessageType.esriGPMessageTypeWarning) { if (type != esriGPMessageType.esriGPMessageTypeError) { goto Label_0116; } this.lstOutput.Items.Add("Error " + messages.GetMessage(i).ErrorCode.ToString() + " " + messages.GetMessage(i).Description); } else { this.lstOutput.Items.Add("Warning " + messages.GetMessage(i).Description); } continue; Label_0116: this.lstOutput.Items.Add("Information " + messages.GetMessage(i).Description); } } IGeoDataset dataset = this.m_pNAContext.NAClasses.get_ItemByName("CFRoutes") as IGeoDataset; IEnvelope extent = dataset.Extent; if (!extent.IsEmpty) { extent.Expand(1.1, 1.1, true); } (this.m_pFocusMap as IActiveView).Extent = extent; (this.m_pFocusMap as IActiveView).Refresh(); } catch (Exception exception) { MessageBox.Show(exception.Message); this.cmdSolve.Text = "Find Closest Faclities"; } }
private void btnGO_Click(object sender, System.EventArgs e) { int facilityCount = 0, cutOffVal = 0; if (txtFacilityCount.Text.Length > 0) { facilityCount = Convert.ToInt32(txtFacilityCount.Text); } if (txtCutOff.Text.Length > 0) { cutOffVal = Convert.ToInt32(txtCutOff.Text); } pGISHelper.SetSolverSettings(ref m_pNAContext, cutOffVal, facilityCount, cmbCost.Text, chkOneWay.Checked, chkHierachy.Checked); IGPMessages pGPMessages = new GPMessagesClass(); IGPMessage pGPMessage = null; if (m_pNAContext.Solver.Solve(m_pNAContext, pGPMessages, null) == false) { for (int ii = 0; ii < pGPMessages.Count; ii++) { pGPMessage = pGPMessages.GetMessage(ii); MessageBox.Show(pGPMessage.Description); } pGISHelper.GetCFOutput("CFRoutes", ref m_pNAContext); } //'Zoom to the extent of the route IGeoDataset pGDS; IEnvelope pEnv; pGDS = m_pNAContext.NAClasses.get_ItemByName("CFRoutes") as IGeoDataset; pEnv = pGDS.Extent; if (!pEnv.IsEmpty) { pEnv.Expand(1.1, 1.1, true); pMainFrm.getMapControl().Extent = pEnv; } pMainFrm.getMapControl().Refresh(); }
//��ʼ��������������� private void NetworkSolve() { try { IGPMessages gpMessages = new GPMessagesClass(); IFeatureClass pFeatCls = null; IGeoDataset geoDataset = null; if (!m_NAContext.Solver.Solve(m_NAContext, gpMessages, null)) { for (int i = 0; i <= m_NAContext.NAClasses.Count - 1; i++) { string sName = m_NAContext.NAClasses.get_Name(i); if (sName == "Routes") { geoDataset = m_NAContext.NAClasses.get_ItemByName("Routes") as IGeoDataset; pFeatCls = geoDataset as IFeatureClass; // LoadNANetworkLocations("Routes", pFeatCls, 5000); } if (sName == "CFRoutes") { geoDataset = m_NAContext.NAClasses.get_ItemByName("CFRoutes") as IGeoDataset; pFeatCls = geoDataset as IFeatureClass; } } IEnvelope pEnvelope = geoDataset.Extent; if (!pEnvelope.IsEmpty) pEnvelope.Expand(1.1, 1.1, true); axMapControl1.Extent = pEnvelope; axMapControl1.Refresh(); } else { if (gpMessages != null) { for (int i = 0; i < gpMessages.Count; i++) { switch (gpMessages.GetMessage(i).Type) { case esriGPMessageType.esriGPMessageTypeError: MessageBox.Show("Error " + gpMessages.GetMessage(i).ErrorCode.ToString() + " " + gpMessages.GetMessage(i).Description); break; case esriGPMessageType.esriGPMessageTypeWarning: MessageBox.Show("Warning " + gpMessages.GetMessage(i).Description); break; default: MessageBox.Show("Information " + gpMessages.GetMessage(i).Description); break; } } } } } catch (Exception ee) { MessageBox.Show(ee.Message); } }
/// <summary> /// Call the OD cost matrix solver and display the results /// </summary> /// <param name="sender">Sender of the event</param> /// <param name="e">Event</param> private void cmdSolve_Click(object sender, EventArgs e) { this.toolStripStatusLabel1.Text = "Working..."; Initialize(); try { lbOutput.Items.Clear(); cmdSolve.Text = "Solving..."; SetSolverSettings(); // Solve IGPMessages gpMessages = new GPMessagesClass(); if (!m_NAContext.Solver.Solve(m_NAContext, gpMessages, null)) { // Get the ODLines output GetODOutput(); } else { lbOutput.Items.Add("Partial Result"); } // Display Error/Warning/Informative messages if (gpMessages != null) { for (int i = 0; i < gpMessages.Count; i++) { switch (gpMessages.GetMessage(i).Type) { case esriGPMessageType.esriGPMessageTypeError: lbOutput.Items.Add("Error " + gpMessages.GetMessage(i).ErrorCode.ToString() + " " + gpMessages.GetMessage(i).Description); break; case esriGPMessageType.esriGPMessageTypeWarning: lbOutput.Items.Add("Warning " + gpMessages.GetMessage(i).Description); break; default: lbOutput.Items.Add("Information " + gpMessages.GetMessage(i).Description); break; } } } // Zoom to the extent of the route IGeoDataset gDataset = m_NAContext.NAClasses.get_ItemByName("ODLines") as IGeoDataset; IEnvelope envelope = gDataset.Extent; if (!envelope.IsEmpty) { envelope.Expand(1.1, 1.1, true); axMapControl.Extent = envelope; } axMapControl.Refresh(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { cmdSolve.Text = "Find OD Cost Matrix"; } this.toolStripStatusLabel1.Text = "Done!"; }
private void btnGO_Click(object sender, System.EventArgs e) { int facilityCount=0,cutOffVal=0; if(txtFacilityCount.Text.Length>0) facilityCount=Convert.ToInt32(txtFacilityCount.Text); if(txtCutOff.Text.Length>0) cutOffVal=Convert.ToInt32(txtCutOff.Text); pGISHelper.SetSolverSettings(ref m_pNAContext,cutOffVal,facilityCount,cmbCost.Text,chkOneWay.Checked,chkHierachy.Checked); IGPMessages pGPMessages=new GPMessagesClass(); IGPMessage pGPMessage=null; if(m_pNAContext.Solver.Solve(m_pNAContext, pGPMessages, null)==false){ for(int ii=0;ii<pGPMessages.Count;ii++) { pGPMessage=pGPMessages.GetMessage(ii); MessageBox.Show(pGPMessage.Description); } pGISHelper.GetCFOutput("CFRoutes",ref m_pNAContext); } //'Zoom to the extent of the route IGeoDataset pGDS; IEnvelope pEnv; pGDS = m_pNAContext.NAClasses.get_ItemByName("CFRoutes") as IGeoDataset; pEnv = pGDS.Extent; if(!pEnv.IsEmpty) { pEnv.Expand(1.1, 1.1, true); pMainFrm.getMapControl().Extent = pEnv; } pMainFrm.getMapControl().Refresh(); }
/// <summary> /// 最短路径分析 /// </summary> /// <param name="mapControl">地图控件</param> /// <param name="gdbfileName">数据库文件</param> /// <param name="featureDatasetName">要素集名字</param> /// <param name="ndsName">网络数据集名字</param> /// <param name="featureClasses">参数要素类及其阈值,其中键值包括:Stops(路线经过结点),Barriers,PolylineBarriers,PolygonBarriers</param> /// <param name="isShowDataBase">是否显示网络数据集</param> /// <param name="isShowNalayer">是否显示网络分析图层</param> /// <param name="routeLayer">最近路线图层</param> public static bool Short_Path(AxMapControl mapControl, string gdbfileName, string featureDatasetName, string ndsName, IDictionary <string, DecorateRouteFeatureClass> featureClasses, bool isShowDataBase, bool isShowNalayer, ref ILayer routeLayer) { //首先判断输入的参数要素类是否合法 if (!FeatureClassKeyIsRight(featureClasses)) { throw new Exception("参数字典错误"); } // mapControl.ClearLayers(); //打开工作空间 IFeatureWorkspace pFeatureWorkspace = OpenWorkspace(gdbfileName) as IFeatureWorkspace; if (pFeatureWorkspace == null) { return(false); } //获取网络数据集 INetworkDataset pNetworkDataset = OpenNetworkDataset(pFeatureWorkspace as IWorkspace, featureDatasetName, ndsName); if (pNetworkDataset == null) { Debug.Print("无法获取网络数据集"); return(false); } //获取网络分析上下文 INAContext pNAContext = CreateNAContext(pNetworkDataset); //打开节点图层 一般和网络数据集放置在一起 名称是xxx_Junctions IFeatureClass pVertexFC = pFeatureWorkspace.OpenFeatureClass(ndsName + "_Junctions"); ILayer pLayer = null; // 显示网络数据集图层 if (isShowDataBase) { INetworkLayer pNetworkLayer = new NetworkLayerClass(); pNetworkLayer.NetworkDataset = pNetworkDataset; pLayer = pNetworkLayer as ILayer; pLayer.Name = "网络数据集"; mapControl.AddLayer(pLayer, 0); } //创建网络分析图层 INALayer naLayer = pNAContext.Solver.CreateLayer(pNAContext); //显示网络分析图层 if (isShowNalayer) { pLayer = naLayer as ILayer; pLayer.Name = pNAContext.Solver.DisplayName; pLayer.SpatialReference = mapControl.SpatialReference; mapControl.AddLayer(pLayer, 0); IActiveView pActiveView = mapControl.ActiveView; IMap pMap = pActiveView.FocusMap; IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer; mapControl.Refresh(); } INASolver naSolver = pNAContext.Solver; //插入相关数据 foreach (var value in featureClasses) { LoadNANetWorkLocations(pNAContext, value.Key, value.Value.FeatureClass, value.Value.SnapTolerance); } //插入经过点 //LoadNANetWorkLocations(pNAContext,"Stops", stopFeatureClass, 30); //插入障碍点 // LoadNANetWorkLocations(pNAContext, "Barriers", barriesFeatureClass, 30); IGPMessages gpMessages = new GPMessagesClass(); // SetSolverSettings(pNAContext); //寻找最短路径 try { pNAContext.Solver.Solve(pNAContext, gpMessages, new CancelTrackerClass()); routeLayer = naLayer.get_LayerByNAClassName("Routes"); } catch (Exception e) { Debug.Print("无法找到最短路径:" + e.Message); return(false); } mapControl.Refresh(); if (gpMessages != null) { for (int i = 0; i < gpMessages.Count; i++) { switch (gpMessages.GetMessage(i).Type) { case esriGPMessageType.esriGPMessageTypeError: Debug.Print("错误 " + gpMessages.GetMessage(i).ErrorCode.ToString() + " " + gpMessages.GetMessage(i).Description); break; case esriGPMessageType.esriGPMessageTypeWarning: Debug.Print("警告 " + gpMessages.GetMessage(i).Description); break; default: Debug.Print("信息 " + gpMessages.GetMessage(i).Description); break; } } } return(true); }
//路径分析 private void toolStripButton3_Click(object sender, EventArgs e) { if (global.networkAnalysis && global.clickedcount > 1) { global.networkAnalysis = false; listBox1.Items.Add("开始进行路径分析求解..."); IGPMessages gpMessages = new GPMessagesClass(); loadNANetworkLocations("Stops", global.inputFClass, 80); naSolver = global.m_NAContext.Solver; naSolver.Solve(global.m_NAContext, gpMessages, null); listBox1.Items.Add("done!"); //获取路径结果 INAStreetDirectionsAgent2 streetAgent; streetAgent = global.m_NAContext.Agents.get_ItemByName("StreetDirectionsAgent") as INAStreetDirectionsAgent2; //设置处理结果为中文 //streetAgent.Language = "zh-CN"; streetAgent.Execute(null, null); INAStreetDirectionsContainer directionsContainer; directionsContainer = streetAgent.DirectionsContainer as INAStreetDirectionsContainer; //directionsContainer.SaveAsXML("route.xml"); int directionsCount = directionsContainer.DirectionsCount; string routeIdName = string.Empty; string routeString; for (int index = 0; index < directionsCount; index++) { INAStreetDirections naStreetDirections = directionsContainer.get_Directions(index); routeString = getDirectionsString(naStreetDirections); getDataTableFromRouteString(routeString); } //解决完后,删除图层内容 ITable pTable_inputFClass = global.inputFClass as ITable; pTable_inputFClass.DeleteSearchedRows(null); (global.p2DMap as IActiveView).Refresh(); if (gpMessages != null) { for (int i = 0; i < gpMessages.Count; i++) { switch (gpMessages.GetMessage(i).Type) { case esriGPMessageType.esriGPMessageTypeError: listBox1.Items.Add("错误 " + gpMessages.GetMessage(i).ErrorCode.ToString() + " " + gpMessages.GetMessage(i).Description); break; case esriGPMessageType.esriGPMessageTypeWarning: listBox1.Items.Add("警告 " + gpMessages.GetMessage(i).Description); break; default: listBox1.Items.Add("信息 " + gpMessages.GetMessage(i).Description); break; } } } (global.p2DMap as IActiveView).Refresh(); } else if (global.clickedcount == 1) { MessageBox.Show("未选取终点,请继续定位!"); } else { MessageBox.Show("未选取或更新起点和终点,请重新定位!"); } }