码迷,mamicode.com
首页 > 数据库 > 详细

postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径

时间:2015-06-11 01:41:33      阅读:561      评论:0      收藏:0      [点我收藏+]

标签:

自己的最短路径实现基本上是按照参考博文的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实现最短路径

标签:

原文地址:http://www.cnblogs.com/nidaye/p/4567842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!