ArcEngine 地图导航 查找路径 经纬度坐标导航 最优路径分析
来源:互联网 发布:建房成本计算器软件 编辑:程序博客网 时间:2024/06/05 19:10
本文来自CSDN博客,转载请标明出处 http//blog.csdn.net/zdb330906531
需求:根据经纬度坐标,取得两个起点与终点,显示最优路径实现导航。
参考官方例子后,我在arcMap上已实现效果,要求改为代码实现。
实现思路:1、创建路径 2、添加位置 3、求解
代码如下:
① 创建路径
public INAContext CreateSolverContext(INetworkDataset networkDataset){ IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset); INASolver naSolver = new NARouteSolver();//路径(NAClosestFacilitySolver 最近设施) INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit; contextEdit.Bind(networkDataset, new GPMessagesClass()); return contextEdit as INAContext;}public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset){ IDatasetComponent dsComponent = networkDataset as IDatasetComponent; return dsComponent.DataElement as IDENetworkDataset;}调用方法:
ILayer ilayer = MapLayerHelper.GetLayerByName(axMapControl1.Map, "道路_ND");INetworkDataset networkDataset = (ilayer as INetworkLayer).NetworkDataset;//网络数据集INAContext m_NAContext = CreateSolverContext(networkDataset);
② 添加位置
/// <summary>/// 在内存中创建图层/// </summary>/// <param name="DataSetName">数据集名称(所建图层名称)</param>/// <param name="AliaseName">别名</param>/// <param name="SpatialRef">空间参考</param>/// <param name="GeometryType">几何类型</param>/// <param name="PropertyFields">属性字段集合</param>/// <returns>IfeatureLayer</returns>public static IFeatureLayer CreateFeatureLayerInMemeory(string DataSetName, string AliaseName, ISpatialReference SpatialRef, esriGeometryType GeometryType, IFields PropertyFields){ ESRI.ArcGIS.Geodatabase.IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.InMemoryWorkspaceFactoryClass(); ESRI.ArcGIS.Geodatabase.IWorkspaceName workspaceName = workspaceFactory.Create("", "MyWorkspace", null, 0); ESRI.ArcGIS.esriSystem.IName name = (IName)workspaceName; ESRI.ArcGIS.Geodatabase.IWorkspace inmemWor = (IWorkspace)name.Open(); IField oField = new FieldClass(); IFields oFields = new FieldsClass(); IFieldsEdit oFieldsEdit = null; IFieldEdit oFieldEdit = null; IFeatureClass oFeatureClass = null; IFeatureLayer oFeatureLayer = null; try { oFieldsEdit = oFields as IFieldsEdit; oFieldEdit = oField as IFieldEdit; if (PropertyFields != null) { for (int i = 0; i < PropertyFields.FieldCount; i++) { oFieldsEdit.AddField(PropertyFields.get_Field(i)); } } IGeometryDef geometryDef = new GeometryDefClass(); IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef; geometryDefEdit.AvgNumPoints_2 = 5; geometryDefEdit.GeometryType_2 = GeometryType; geometryDefEdit.GridCount_2 = 1; geometryDefEdit.HasM_2 = false; geometryDefEdit.HasZ_2 = false; geometryDefEdit.SpatialReference_2 = SpatialRef; oFieldEdit.Name_2 = "SHAPE"; oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; oFieldEdit.GeometryDef_2 = geometryDef; oFieldEdit.IsNullable_2 = true; oFieldEdit.Required_2 = true; oFieldsEdit.AddField(oField); oFeatureClass = (inmemWor as IFeatureWorkspace).CreateFeatureClass(DataSetName, oFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", ""); (oFeatureClass as IDataset).BrowseName = DataSetName; oFeatureLayer = new FeatureLayerClass(); oFeatureLayer.Name = AliaseName; oFeatureLayer.FeatureClass = oFeatureClass; } catch {} finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(oField); System.Runtime.InteropServices.Marshal.ReleaseComObject(oFields); System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldsEdit); System.Runtime.InteropServices.Marshal.ReleaseComObject(oFieldEdit); System.Runtime.InteropServices.Marshal.ReleaseComObject(name); System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceFactory); System.Runtime.InteropServices.Marshal.ReleaseComObject(workspaceName); System.Runtime.InteropServices.Marshal.ReleaseComObject(inmemWor); System.Runtime.InteropServices.Marshal.ReleaseComObject(oFeatureClass); GC.Collect(); } return oFeatureLayer;}
INAClassLoader classLoader = new NAClassLoader();classLoader.Locator = m_NAContext.Locator;classLoader.Locator.SnapTolerance = 100;classLoader.NAClass = m_NAContext.NAClasses.get_ItemByName("Stops") as INAClass;//添加起点与终点位置string[] startCoordinate = textBox1.Text.Split(',');string[] endCoordinate = textBox2.Text.Split(',');double x1 = SpatialReferenceHelper.ConvertDegreesToDigital(startCoordinate[0]);double y1 = SpatialReferenceHelper.ConvertDegreesToDigital(startCoordinate[1]);double x2 = SpatialReferenceHelper.ConvertDegreesToDigital(endCoordinate[0]);double y2 = SpatialReferenceHelper.ConvertDegreesToDigital(endCoordinate[1]);IPoint startPoint = new PointClass();startPoint.PutCoords(x1, y1);startPoint.SpatialReference = LocateHelper.GeoCoordinateSystem;startPoint.Project(mainForm.MapForm.axMapControl1.SpatialReference);IPoint endPoint = new PointClass();endPoint.PutCoords(x2, y2);endPoint.SpatialReference = LocateHelper.GeoCoordinateSystem;endPoint.Project(mainForm.MapForm.axMapControl1.SpatialReference);IFeatureLayer featurelayer = MapApi.CreateFeatureLayerInMemeory("点图层", "点图层", LocateHelper.GeoCoordinateSystem, esriGeometryType.esriGeometryPoint, null);IFeature feature = featurelayer.FeatureClass.CreateFeature();feature.Shape = startPoint;feature.Store();feature = featurelayer.FeatureClass.CreateFeature();feature.Shape = endPoint;feature.Store();
③ 求解(这里建议 try catch 一下)
int rowsIn = 0, rowsLocated = 0;IFeatureCursor featureCursor = featurelayer.FeatureClass.Search(null, true);classLoader.Load((ICursor)featureCursor, null, ref rowsIn, ref rowsLocated);((INAContextEdit)m_NAContext).ContextChanged();IGPMessages gpMessages = new GPMessagesClass();m_NAContext.Solver.Solve(m_NAContext, gpMessages, null); //求解
好了,进行到这里的时候就能看到导航效果了。附图一张
遇到的问题:由于不存在 Network Analyst 许可,操作失败。
参考官方例子 ClosestFacilitySolver 重新授权即可
参考资料:
http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//00470000005w000000
http://download.csdn.net/download/PMC_520/766131
http://blog.csdn.net/chanyinhelv/article/details/15498845
0 0
- ArcEngine 地图导航 查找路径 经纬度坐标导航 最优路径分析
- 百度地图SDK导航(路径规划+实时导航)
- 网站导航路径实现
- angularjs路径跳转/导航
- 导航和路径规划
- 导航、路径规划、SLAM
- 导航地图中Routing路径规划模块相关概念
- 高德地图---路径规划---语音导航的开发
- IOS 高德地图获取用户导航路径
- 调起地图App实现路径规划导航等
- ArcEngine 经纬度坐标 画线
- Android:简易路径导航条
- 22.路径导航与分页
- 【18】Bootstrap — 路径导航
- 路径规划和导航算法
- 百度地图api坐标转换,两点导航
- App外部跳转百度地图,高德地图,进行导航,路径规划等
- ArcEngine 最短路径分析(源码)
- jquery+ajax小例子。
- 1026. Table Tennis (30)
- linux下批量执行mysql指令实例
- CAD的StatusBar
- JAVA HttpURLConnection Post方式提交传递参数
- ArcEngine 地图导航 查找路径 经纬度坐标导航 最优路径分析
- iOS应用架构谈(一):架构设计的方法论
- php 手机端判断
- java并发编程汇总
- iOS应用架构谈(二):View层的组织和调用方案(上)
- 用户体验要素
- HDU ACM 1083 Courses 二分图最大匹配
- Android5.0 来电流程图
- Java中变量赋值的问题