本文来自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); //求解

好了,进行到这里的时候就能看到导航效果了。附图一张

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemRiMzMwOTA2NTMx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

遇到的问题:因为不存在 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

ArcEngine 地图导航 查找路径 经纬度坐标导航 最优路径分析的更多相关文章

  1. 利用百度地图API,获取经纬度坐标

    利用百度地图API,获取经纬度坐标 代码很简单,但在网上没找到现成的获取地图经纬度的页面. 就是想,给当前页面传递一个经纬度,自动定位到此经纬度.然后可以重新选择,选择完返回经纬度. 效果如下: 源代 ...

  2. 百度地图 echarts tooltip属性 经纬度坐标不显示

    中国地图.散点图结合点击后显示当前城市数量 不显示经纬度坐标 echarts.appMap = function (id, opt) { // 实例 var chart = this.init(doc ...

  3. 批量调用百度地图API获取地址经纬度坐标

    1 申请密匙 注册百度地图API:http://lbsyun.baidu.com/index.php?title=webapi 点击左侧 “获取密匙” ,经过填写个人信息.邮箱注册等,成功之后在开放平 ...

  4. iOS第三方地图-高德地图(导航sdk路径规划)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  5. Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!

    Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...

  6. ArcEngine下投影坐标和经纬度坐标的相互转换

    jojojojo2002 原文 ArcEngine下投影坐标和经纬度坐标的相互转换 投影转经纬度 private IPoint PRJtoGCS( double x, double y) { IPoi ...

  7. 地图经纬度坐标与屏幕坐标的转换(android版)

    我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...

  8. iOS 屏幕原点坐标 && 导航栏风格的自定义

    其一 屏幕原点坐标 (x ,y) 受 self.navigationController. navigationBar 的 setTranslucent (BOOL) 属性控制 在 iOS7 以后   ...

  9. baidu地图api , 地理位置转 经纬度接口

    更多可以查看    http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding 地理编码示例: 以下是关于地理编 ...

随机推荐

  1. c++ valarray 实现矩阵与向量相乘

    #include <iostream>#include <valarray> template<class T> class Slice_iter { std::v ...

  2. JavaI/O 系统

    1.JavaI/O 系统概述 A.  输入输出(I/O):指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口 B. 流的概念(流:Stream) 流的基本特性:有数据.有方向 2. 流的 ...

  3. [Apple开发者帐户帮助]五、管理标识符(3)删除应用程序ID

    您可以在不再需要时删除App ID.但是,您无法删除上载到App Store Connect的应用程序的显式应用程序ID . 所需角色:帐户持有人或管理员. 在“ 证书”,“标识符和配置文件”中,从左 ...

  4. [Apple开发者帐户帮助]二、管理你的团队(7)管理服务器帐户

    如果在配置机器人以在多个设备上运行应用程序时向团队添加服务器,允许Xcode Server为您管理签名,或者配置机器人以创建iOS App文件,则服务器可以访问您的资产并显示在您的开发人员帐户 您可以 ...

  5. TP5.x——聊天列表查询

    前言 查询聊天列表,并返回最后一条聊天记录.这个有一个比较尴尬的点就是,一个是你主动发出的,一个是你接收的. 所以这个SQL会比较长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长 ...

  6. .Net Core 学习(二)上篇

    用Visual Studio和ASP.NET Core MVC创建Web API 1.启动Visual Studio.从文件菜单,选择新建>项目.选择ASP.NET Core Web Appli ...

  7. 5.26 idea生成javadoc

  8. backface-visibility当元素不面向屏幕时是否可见

    html代码 <h1>div1可见</h1> <div class="div1">div---1</div> <h1>d ...

  9. linux 新添加的硬盘格式化并挂载到目录下

    需求: 新增加一块硬盘sdb,将sdb分区,只分一个区,格式化,挂载到目录/ssd下. 1.  查看现在已有的分区状态 # df –l 图中显示,没有看到sdb硬盘 2.  查看服务器安装的硬盘状态( ...

  10. SQL Server 置疑、可疑、正在恢复

    一.出错情况 有些时候当你重启了数据库服务,会发现有些数据库变成了正在恢复.置疑.可疑等情况,这个时候DBA就会很紧张了,下面是一些在实践中得到证明的方法. 在一次重启数据库服务后,数据库显示正在恢复 ...