1.sql views简介
geoserver+postgresql+openlayers(leaflet)是目前主流的gis开发工具。postgresql用于存储地图数据,geoserver用于发布地图数据,openlayers或者leaflet用于访问发布地图。正常情况下当shapefile格式的数据导入postgresql数据库中之后,我们需要通过geoserver把所有的数据发布出去,这样才能访问。常规情况下这种操作方式是没有问题的,因为地图作为基础服务,一旦发布出去是不会变化的。但是对于室内地图来说就不行了,假如一个商场有5层,每一楼层又层有5个地图图层,对于这样一个商场需要把这25个地图图层在geoserver中全部发布出来才能访问该商场的全部地图。假如发布这一个商场的25个图层你还能忍受的话,那发布成千上万个商场的地图你还能忍受吗?既然忍受不了那就要想办法解决。由于发布地图是机械的重复的工作,我们是否能想一些办法来帮我们完成这些工作呢。这时候就是我们的sqlview出场了。
首先介绍一下sql view,通过sqlviews可以做如下事情:
(1)数据库view可以在geoserver中当作表完全一样的发布,而geoserver的sqlviews不仅能实现简单的查询发布,还能输入参数作为查询视图的条件。
(2)sqlviews可以发布数据库的存储过程或者function,执行更加复杂的逻辑操作与查询。
(3)sql views查询可以通过字符串替换的方式进行参数化,参数值可以在wms和wfs请求总使用,输入值可以通过设置的正则表达式进行验证从而消除sql 注入攻击的风险。
(4)sqlviews是对数据库操作与查询的一个结果,不能使用wfs_t去操作它,但是wfs,wms都可以正常请求或者查询。
2.创建带查询条件的sql views视图:
(1)登录geoserver,点击图层,选择工作空间,新建图层。
(2)新建sql views视图图层,并发布。
这里创建了一个视图,发布传入的表名数据。
tbl的默认值设置为数据库中一直会存在的表格,设置的正则表达式为只允许输入字母数字和下划线。
在属性值对输出结果的类型和坐标系做了设置。
(3)图层访问
在通过wms获取地图的时候只需要把tbl的值通过viewparams传递过去就行了
http://10.20.135.14/geoserver/parking/wms?service=wms&version=1.3.0&request=getmap&format=image%2fpng&transparent=true&layers=parking%3avtingchewei&crs=epsg%3a4326&styles=&width=2700&height=1200&bbox=20.02708134918213%2c110.33805803565978%2c20.03351865081787%2c110.3525419643402&viewparams=tbl%3awanghaiguojia_b2_tingchewei
viewparams格式一般是viewparams=p1:v1;p2:v2;…可以加若干个参数。不同参数之间以;隔开,单个参数是键值对,即p1是参数名称,v1是参数值。
通过wms方式访问发布的视图方法为:
var params = { layers:'parking:vtingchewei', format:'image/png' }; varviewparams = [ 'tbl:wanghaiguojia_b2_tingchewei' ]; params.viewparams= viewparams; varvtingchewei = new ol.layer.image({ source:new ol.source.imagewms({ url:'http://10.20.135.14/geoserver/parking/wms', params:params, servertype:'geoserver', }) });
通过这种方式,再多的商场只需要在geoserver中发布5次视图即可,而且该发布视图的代码可以预先写入geoserver中打包进去。这样该系统在任何商场使用都不需要发布地图了。
3.创建包含function的sql view视图
解决了图层发布的问题,终于可以松一口气了。但是,没想到棘手的问题还在后面。领导让做室内导航功能。做就做吧,谁让咱是苦逼的码农呢。那该怎么做室内导航呢,做这个功能之前,咱还是要规划一下的。首先要写最短路径查询算法;然后查询路径的时候只需要把起点和终点的位置输入算法查询即可;最后把查询的结果通过wms或wfs方式获取,显示在地图上。
编写最短路径规划算法的时候我们需要的输入有:用户所在楼层的道路名,起点和终点的位置,然后我们吭哧吭哧,大战3天三夜,搞定。
接着查询,好办,直接按照上面的放吧,把该商场的5个楼层都发布一个基于对应楼层的结果路径视图,机智吧?no,no,no!简直遇事情不懂脑子啊。这个时候肯定需要换一个新的方法,把最短路径规划算法写成一个function嵌入到postgresql数据库中,该function的输入参数为:用户所在楼层,起点位置,终点位置;输出参数为起点和终点直接经过的点坐标。
最后,通过wms或者wfs的方式获取得到的最短路径结果即可。
以上所述实现www.887551.com给大家介绍的sqlview动态发布地图图层的方法,希望对大家有所帮助!