想用开源免费的路径规划方法,请移步:用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,发布一个新服务
选择arcgis server连接,填好服务名字,如果没有arcgis server的话要自己部署一个。
下一步,下一步......→选择服务功能,选择上Network Analysis,然后点击进入Network Analysis项填写具体参数。
参数设置完毕,点击Analyze,分析一下服务状况,报错和警告按照提示处理即可,没错后点击Publish进行发布。
→发布成功!
4.REST接口测试
进入网络分析接口(solveroute是资源存放的目录名称),
填入一个起点一个终点试试,格式如图,然后勾选好参数,
点击按钮测试效果。
成功了就返回如下结果,返回的路径点在paths里面,错误了就再换几个点试试。
下面这个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可以实现不少二维分析功能,上面说的弄好以后,改一改还可以实现最近设施分析、设施服务区分析等基于网络分析的功能。