標籤:
自己的最短路徑實現基本上是按照參考博文的1、2和3進行的,實現的時候也是問題不斷,只能是一個一個解決。
問題1:自己發布的geoserver服務無法和OSM底圖疊加到一起。
解決:參考博文2提到發布服務時需將投影設為900913,我認為大可不必,仍然用4326即可,只是openlayers載入時配置好相關的參數即可,如下:
//定義地圖邊界 //var bounds= new OpenLayers.Bounds(12960129.562300, 4788641.902700, 12986389.084400, 4817845.581900); var bounds = new OpenLayers.Bounds(116.145027, 39.756095, 116.703957, 40.027940); var options = { projection: "EPSG:900913", displayProjection: new OpenLayers.Projection(‘EPSG:4326‘), center: new OpenLayers.LonLat(116.46760559087, 39.936089796286), maxExtent:bounds.transform( new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913") ) }; map = new OpenLayers.Map(‘map_element‘, options); var osmLayer = new OpenLayers.Layer.OSM(); map.addLayer(osmLayer); var baseLayer = new OpenLayers.Layer.WMS("OpenLayers WMS", //geoserver所在伺服器位址 ‘http://localhost:8080/geoserver/ProjectLLL/wms‘, { layers: ‘ProjectLLL:beijing_line‘, format: "image/png", transparent: true, styles: ‘‘, }, { isBaseLayer: false, singleTile: true, ratio:1 } ); //var baseLayer = new OpenLayers.Layer.OSM(); map.addLayer(baseLayer); //添加control空間 map.addControl(new OpenLayers.Control.MousePosition()); map.addControl(new OpenLayers.Control.ScaleLine()); map.addControl(new OpenLayers.Control.Scale); map.zoomToExtent(bounds);
OSM底圖的投影是900913,設定代碼:
projection: "EPSG:900913", displayProjection: new OpenLayers.Projection(‘EPSG:4326‘),
就能將兩者摞到一起。
問題2:navigation圖層的參數問題
解決:參數按照下面設定即可,navigation也是一個圖層,只不過是一個加了SQL語句的空圖層,向geoserver發出請求時,會自動執行SQL語句,得到圖層。
result = new OpenLayers.Layer.WMS("navLayer",
‘http://localhost:8080/geoserver/ProjectLLL/wms‘,
{ FORMAT: ‘image/png‘,
transparent: true,
LAYERS: ‘ProjectLLL:navigation‘,
viewparams:viewparams,
styles:‘shortpath‘
},
{isBaseLayer:false,
opacity: 1,
}
);
問題1中把自己發布的圖層也載入到了osm底圖上,可以不用載入它,直接在osm底圖上操作,geoserver會返回最短路徑的結果顯示到osm底圖上。
問題3:最短路徑的SQL語句怎麼寫?很關鍵
解決:核心演算法採用dijkstra演算法,一開始主要參考1和4兩篇文章寫SQL語句,但總是得不到最後的結果,嘗試了很多很多次,都以失敗告終,其間的心情三言兩語說不清楚啊。4中的方法條理邏輯很清晰,思路明確,但總是出錯。1中的方法總體來說較為粗糙,也說的通,考慮的不夠周全,但也是不知道出現了什麼鬼錯誤,調試了無數次都沒結果。最後的最後在萬分絕望中,無意之間,看到了writing a pl/pgsql wrapper(http://workshop.pgrouting.org/chapters/wrapper.html)這是官方出的一個協助說明,裡面也說到一個方法和1中的方法差不多,我用這個嘗試了一個,突然就成了,太突然了都,官網的東西都沒怎麼看,現在看來,官網的東西還是很實用的嘛。
最後,主要是按照3中給出的代碼架構,對參數等進行調整,最後可以實現最短路徑查詢,只是SQL的演算法寫的有點粗糙,以後有時間再改一改。
參考博文:
1、基於pgrouting的任意兩點間的最短路徑查詢函數
2、最短路徑規劃中建立基於geoserver的wms服務
3、基於openlayers的最短路徑規劃(1、2和3和上一篇的1和2是一個系列的,這個系列基本上涵蓋了整個流程,但自己實現的時候也是問題不斷。最好的辦法就是看懂別人的思路,根據自己機器環境修改或者重寫別人的代碼,最後得到實現)
4、使用pgrouting求任意兩點的最短路徑(和我上一篇的4是一個系列的,這一篇文章裡面的思路是很好的,但自己嘗試了很多次沒實現,只能含恨而終)
postgresql+postgis+pgrouting實現最短路徑查詢(2)---openlayers+geoserver實現最短路徑