postgresql+postgis+pgrouting實現最短路徑查詢(2)---openlayers+geoserver實現最短路徑


自己的最短路徑實現基本上是按照參考博文的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是一個系列的,這一篇文章里面的思路是很好的,但自己嘗試了很多次沒實現,只能含恨而終)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM