zoukankan      html  css  js  c++  java
  • 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是一个系列的,这一篇文章里面的思路是很好的,但自己尝试了很多次没实现,只能含恨而终)

  • 相关阅读:
    用react+redux+webpack搭建项目一些疑惑
    ajax基本原理实现
    jsonp详细原理之一
    因为文件共享不安全,所以你不能连接到文件共享
    python xml模块
    python os模块
    python tickle模块与json模块
    python datetime模块
    python sys模块
    python time模块
  • 原文地址:https://www.cnblogs.com/nidaye/p/4567842.html
Copyright © 2011-2022 走看看