想用開源免費的路徑規(guī)劃方法瓣窄,請移步:用Postgis進行最短路徑規(guī)劃
Skyline TerraExplorer對三維數(shù)據(jù)的分析還是不錯的虫溜,視域分析等功能應(yīng)有盡有任内,但是二維分析功能上skyline就基本上只有幾何分析键袱、緩沖區(qū)分析等基礎(chǔ)功能鹉动,要想在skyline TE二次開發(fā)中進行復雜的二維分析就要借助強大的arcgis(或開源GIS三劍客)了再菊。
最近需要在skyline中實現(xiàn)路徑規(guī)劃功能爪喘,本來說想重溫一下大學學習的迪杰斯特拉最短路徑算法的,先從shape圖層中能夠獲取到道路的幾何信息纠拔,包括路徑的長度秉剑,折點,端點稠诲,然后根據(jù)折點和端點計算出路網(wǎng)的連通性拓撲結(jié)構(gòu)......但是成本太高侦鹏,人又懶,還是算了臀叙。最快最靠譜的方法是調(diào)用arcgis server的路網(wǎng)分析功能略水,只用了一天就走通技術(shù)路線了,接下來的事就是調(diào)優(yōu)效果劝萤。
0.準備工作
skyline本文用的是6.6.1
部署好arcgis for server:......渊涝;(這里用的10.2)
準備好路徑分析的shape圖層數(shù)據(jù):所有需要參與路徑規(guī)劃的道路應(yīng)當放入一個shape圖層之中,圖層的屬性字段中最好包含道路的限速信息床嫌,以便計算通行時間跨释。圖層中互相連通的兩條道路在交匯處應(yīng)當都有折點,否則就會出現(xiàn)看起來連通實則計算無法到達的情況厌处,而雖然交叉但是不能連通的兩條道路則不能在其交叉處有折點鳖谈,例如高架橋交匯處。
1.arcgis網(wǎng)絡(luò)分析服務(wù)發(fā)布
開啟arcMap網(wǎng)絡(luò)分析功能:工具欄上Customize(自定義)→Extensions(擴展)阔涉,在對話框中勾選上Network Analyst缆娃,這樣arcMap就有了網(wǎng)絡(luò)分析功能。
導入路徑圖層:可以從文件夾連接或數(shù)據(jù)庫連接中獲取瑰排,考慮到路徑圖層不需要實時地同步數(shù)據(jù)或其他特殊要求贯要,數(shù)據(jù)來源(使用拷貝的表、拷貝的文件或arcMap和server共享表等)可根據(jù)具體情況參考arcgis官方說明進行選擇椭住。我們這里采用文件夾連接的方式郭毕。在Catalog(目錄)中打開文件夾連接,找到需要進行網(wǎng)絡(luò)分析的道路圖層函荣,對圖層點擊右鍵显押,
選擇新建數(shù)據(jù)集,然后點一通下一步傻挂,
注意乘碑,在選擇連通性的地方,由默認的在端點處連通修改為在任何折點處連通金拒。
到這里會進行屬性的設(shè)置兽肤,由于我的道路不具有限速等屬性,這里就只設(shè)置道路長度了(默認就有道路長度)绪抛。設(shè)置道路限速可以計算駕駛耗費時間资铡。
道路方向我暫時不設(shè)置。(還沒有研究清楚)
→網(wǎng)絡(luò)分析完成幢码。
導入網(wǎng)絡(luò)分析結(jié)果文件到圖層:Layers右鍵→Add Data笤休,選擇剛剛生成的.nd文件加入。
調(diào)出網(wǎng)絡(luò)分析面板:Customize(自定義)→Toolbars(工具欄)→勾選上Network Analyst症副。
點擊剛剛調(diào)出的Network Analyst下拉框→New Route店雅,創(chuàng)建路徑分析圖層,這樣我們就可以進行路徑分析了贞铣。
2.發(fā)布服務(wù)前先測試一下
先打開網(wǎng)絡(luò)分析窗口↓闹啦,選擇剛剛建立的路徑分析(Route)項,
選擇stops→點擊添加點(添加驮樱靠點)→在地圖上選擇颓戏埽靠點(最少一個起點一個終點,中間可以加中間站)→點擊分析路徑按鈕酱畅,即可查看分析出的路徑琳袄,可以在這里調(diào)試道路的連通性是否正常。
正常分析出路徑:
3.發(fā)布路徑分析功能為HTTP REST服務(wù)
發(fā)布為服務(wù)后挚歧,skyline端用ajax請求一下就可以實現(xiàn)路徑規(guī)劃功能。
開始發(fā)布:File→Share As→Service,
publish a service吁峻,發(fā)布一個新服務(wù)
選擇arcgis server連接滑负,填好服務(wù)名字,如果沒有arcgis server的話要自己部署一個用含。
下一步矮慕,下一步......→選擇服務(wù)功能,選擇上Network Analysis啄骇,然后點擊進入Network Analysis項填寫具體參數(shù)痴鳄。
參數(shù)設(shè)置完畢,點擊Analyze缸夹,分析一下服務(wù)狀況痪寻,報錯和警告按照提示處理即可螺句,沒錯后點擊Publish進行發(fā)布。
→發(fā)布成功橡类!
4.REST接口測試
進入網(wǎng)絡(luò)分析接口(solveroute是資源存放的目錄名稱)蛇尚,
填入一個起點一個終點試試,格式如圖顾画,然后勾選好參數(shù)取劫,
點擊按鈕測試效果。
成功了就返回如下結(jié)果研侣,返回的路徑點在paths里面谱邪,錯誤了就再換幾個點試試。
下面這個GET請求在前端ajax一下就可以得到JSON結(jié)果了庶诡,主要參數(shù)stops惦银,f=pjson(返回json結(jié)果)填對就行了,其他參數(shù)以后針對具體需求來灌砖。
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二次開發(fā)要做的部分
本文只討論最簡單的路徑規(guī)劃Demo基显,只將路徑畫了出來蘸吓。
開發(fā)思路:通過鼠標點擊或者其他方式在地圖中獲取起點終點兩個坐標點,然后將坐標點填寫到get請求當中撩幽,ajax一下库继,從獲取的json中取得路徑點,然后用
SGWorld.Creator.CreatePolylineFromArray(paths,lineColor,2,group,description);
繪制出路徑即可窜醉,或者干點其他事情宪萄。
下面的代碼示范了從發(fā)送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<data.routes.features[0].geometry.paths[0].length;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)+"米");
}
});
}
鼠標獲取坐標點拜英、改變鼠標狀態(tài)、注冊時間監(jiān)聽器琅催、繪制線段等方法可以從Programmer's Guide入手居凶,個人認為Skyline二次開發(fā)能實現(xiàn)的東西實現(xiàn)起來調(diào)用的接口還是比較友好的。如果你還不知道哪里找接口文檔的話藤抡,就是Resources中的TerraExplorer Programmer's Guide侠碧。
路徑規(guī)劃效果:
總結(jié):
Skyline配合Arcgis Server可以實現(xiàn)不少二維分析功能,上面說的弄好以后缠黍,改一改還可以實現(xiàn)最近設(shè)施分析弄兜、設(shè)施服務(wù)區(qū)分析等基于網(wǎng)絡(luò)分析的功能。