skyline TE 二次开发-基于arcgis server进行最短路径规划

想用开源免费的路径规划方法,请移步:用Postgis进行最短路径规划

Skyline TerraExplorer对三维数据的分析还是不错的,视域分析等功能应有尽有,但是二维分析功能上skyline就基本上只有几何分析、缓冲区分析等基础功能,要想在skyline TE二次开发中进行复杂的二维分析就要借助强大的arcgis(或开源GIS三剑客)了。

最近需要在skyline中实现路径规划功能,本来说想重温一下大学学习的迪杰斯特拉最短路径算法的,先从shape图层中能够获取到道路的几何信息,包括路径的长度,折点,端点,然后根据折点和端点计算出路网的连通性拓扑结构......但是成本太高,人又懒,还是算了。最快最靠谱的方法是调用arcgis server的路网分析功能,只用了一天就走通技术路线了,接下来的事就是调优效果。

0.准备工作

skyline本文用的是6.6.1

部署好arcgis for server:......;(这里用的10.2)

准备好路径分析的shape图层数据:所有需要参与路径规划的道路应当放入一个shape图层之中,图层的属性字段中最好包含道路的限速信息,以便计算通行时间。图层中互相连通的两条道路在交汇处应当有折点,否则就会出现看起来连通实则计算无法到达的情况,而虽然交叉但是不能连通的两条道路则不能在其交叉处有折点,例如高架桥交汇处。

1.arcgis网络分析服务发布

开启arcMap网络分析功能:工具栏上Customize(自定义)→Extensions(扩展),在对话框中勾选上Network Analyst,这样arcMap就有了网络分析功能。


网络分析勾选开启

导入路径图层:可以从文件夹连接或数据库连接中获取,考虑到路径图层不需要实时地同步数据或其他特殊要求,数据来源(使用拷贝的表、拷贝的文件或arcMap和server共享表等)可根据具体情况参考arcgis官方说明进行选择。我们这里采用文件夹连接的方式。在Catalog(目录)中打开文件夹连接,找到需要进行网络分析的道路图层,对图层点击右键,

待分析图层

选择新建数据集,然后点一通下一步,

新建网络数据集

注意,在选择连通性的地方,由默认的在端点处连通修改为在任何折点处连通。

修改连通性

到这里会进行属性的设置,由于我的道路不具有限速等属性,这里就只设置道路长度了(默认就有道路长度)。设置道路限速可以计算驾驶耗费时间。

属性设置

道路方向我暂时不设置。(还没有研究清楚)

道路方向设置

→网络分析完成。

导入网络分析结果文件到图层:Layers右键→Add Data,选择刚刚生成的.nd文件加入。

加入网络分析结果

调出网络分析面板:Customize(自定义)→Toolbars(工具栏)→勾选上Network Analyst。

调出网络分析面板

点击刚刚调出的Network Analyst下拉框→New Route,创建路径分析图层,这样我们就可以进行路径分析了。

创建路径分析图层

2.发布服务前先测试一下

先打开网络分析窗口↓,选择刚刚建立的路径分析(Route)项,

打开网络分析窗口

选择stops→点击添加点(添加停靠点)→在地图上选择停靠点(最少一个起点一个终点,中间可以加中间站)→点击分析路径按钮,即可查看分析出的路径,可以在这里调试道路的连通性是否正常。

选择停靠点

正常分析出路径:

路径

3.发布路径分析功能为HTTP REST服务

发布为服务后,skyline端用ajax请求一下就可以实现路径规划功能。

开始发布:File→Share As→Service,

发布服务

publish a service,发布一个新服务

publish a service

选择arcgis server连接,填好服务名字,如果没有arcgis server的话要自己部署一个。

服务器选择

下一步,下一步......→选择服务功能,选择上Network Analysis,然后点击进入Network Analysis项填写具体参数。

勾选网络分析功能

参数设置完毕,点击Analyze,分析一下服务状况,报错和警告按照提示处理即可,没错后点击Publish进行发布。

发布前一秒

→发布成功!

4.REST接口测试

进入网络分析接口(solveroute是资源存放的目录名称),

接口入口

填入一个起点一个终点试试,格式如图,然后勾选好参数,

参数填写

点击按钮测试效果。

开始按钮

成功了就返回如下结果,返回的路径点在paths里面,错误了就再换几个点试试。

返回JSON结果

下面这个GET请求在前端ajax一下就可以得到JSON结果了,主要参数stops,f=pjson(返回json结果)填对就行了,其他参数以后针对具体需求来。

http://localhost:6080/arcgis/rest/services/solveroute/MyMapService3/NAServer/Route/solve?stops=106.963773%2C26.467088%3B106.956641%2C26.470443&barriers=&polylineBarriers=&polygonBarriers=&outSR=&ignoreInvalidLocations=true&accumulateAttributeNames=&impedanceAttributeName=Length&restrictionAttributeNames=&attributeParameterValues=&restrictUTurns=esriNFSBAllowBacktrack&useHierarchy=false&returnDirections=false&returnRoutes=true&returnStops=false&returnBarriers=false&returnPolylineBarriers=false&returnPolygonBarriers=false&directionsLanguage=en&directionsStyleName=&outputLines=esriNAOutputLineTrueShapeWithMeasure&findBestSequence=false&preserveFirstStop=false&preserveLastStop=false&useTimeWindows=false&startTime=0&outputGeometryPrecision=&outputGeometryPrecisionUnits=esriDecimalDegrees&directionsOutputType=esriDOTComplete&directionsTimeAttributeName=&directionsLengthUnits=esriNAUMiles&returnZ=false&f=pjson

到此为止,剩下的工作就在Skyline那边进行了。

5.Skyline TE二次开发要做的部分

本文只讨论最简单的路径规划Demo,只将路径画了出来。

开发思路:通过鼠标点击或者其他方式在地图中获取起点终点两个坐标点,然后将坐标点填写到get请求当中,ajax一下,从获取的json中取得路径点,然后用

SGWorld.Creator.CreatePolylineFromArray(paths,lineColor,2,group,description);

绘制出路径即可,或者干点其他事情。

下面的代码示范了从发送GET请求到绘制路径的过程。

function onSolveRoute(x1,y1,x2,y2,desc){

var URL="http://localhost:6080/arcgis/rest/services/solveroute/MyMapService3/NAServer/Route/solve?stops="+x1+"%2C"+y1+"%3B"+x2+"%2C"+y2+

"&barriers=&polylineBarriers=&polygonBarriers=&outSR=&ignoreInvalidLocations=true&accumulateAttributeNames=&impedanceAttributeName=Length&restrictionAttributeNames="+

"&attributeParameterValues=&restrictUTurns=esriNFSBAllowBacktrack&useHierarchy=false&returnDirections=false&returnRoutes=true&returnStops=false&returnBarriers=false"+

"&returnPolylineBarriers=false&returnPolygonBarriers=false&directionsLanguage=en&directionsStyleName=&outputLines=esriNAOutputLineTrueShapeWithMeasure"+

"&findBestSequence=true&preserveFirstStop=false&preserveLastStop=false&useTimeWindows=false&startTime=0&outputGeometryPrecision=&outputGeometryPrecisionUnits=esriDecimalDegrees"+

"&directionsOutputType=esriDOTComplete&directionsTimeAttributeName=&directionsLengthUnits=esriNAUMiles&returnZ=false&f=pjson";

$.getJSON(URL,function(data,status){

if(status=="success"){

if("error" in data){

alert("无路径到达!");

SGWorld.ProjectTree.DeleteItem(nAGroup);

return false;

}

console.log(data);

// if(data.geometry.paths==null)

// return false;

var paths=[];//one route by default

for(var i=0;i

paths[i*3]=data.routes.features[0].geometry.paths[0][i][0];

paths[i*3+1]=data.routes.features[0].geometry.paths[0][i][1];

paths[i*3+2]=0;

}

var lineColor = 0xFF00FF00; // Abgr value -> solid green

SGWorld.Creator.CreatePolylineFromArray(paths,lineColor,2,nAGroup,desc);

alert("路程长度:"+Math.floor(data.routes.features[0].attributes.Total_Length)+"米");

}

});

}

鼠标获取坐标点、改变鼠标状态、注册时间监听器、绘制线段等方法可以从Programmer's Guide入手,个人认为Skyline二次开发能实现的东西实现起来调用的接口还是比较友好的。如果你还不知道哪里找接口文档的话,就是Resources中的TerraExplorer Programmer's Guide。

接口文档

路径规划效果:

规划出的路径

总结:

Skyline配合Arcgis Server可以实现不少二维分析功能,上面说的弄好以后,改一改还可以实现最近设施分析、设施服务区分析等基于网络分析的功能。

你可能感兴趣的:(skyline TE 二次开发-基于arcgis server进行最短路径规划)