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

时间:2021-11-17 09:42:34

自己的最短路径实现基本上是按照参考博文的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是一个系列的,这一篇文章里面的思路是很好的,但自己尝试了很多次没实现,只能含恨而终)