接触geoserver有一段时间了,也发布过几次图层,一般是通过postgis表或者shp文件发布。也没有遇到过什么问题,也许是我们这边实现的功能比较简单,也或许我的视野比较窄,一直没有发现其他的方式。
今天因为另外的一个项目,我发现有其他的大神通过sqlview来发布了图层,我觉得挺新奇的。这样的话就不用每一个表都发布成一个图层了,如果有需要可以把需要发布图层的表都发布为一个图层,这样会不会速度上也更快一些(只是猜测)。关于通过sqlview来发布图层的方法可以来看一下大神的札记:
文章链接地址如下(为防止文章被删除,故将文章copy至此):http://blog.youkuaiyun.com/freeland1/article/details/49737793
GeoServer的SQL Views详解
众所周知,Geoserver支持发布shp,postgis数据库数据。通过各种扩展,可以发布oracle spatial,myspatial数据库数据。在日常应用中发现使用者只是简答的发布了数据库的表,还有视图。而Geoserver的SQL Views能做的更多,体现如下:
数据库view可以在geoserver中当做表完全一样的发布,而Geoserver的SQLViews不仅能实现简单的查询发布,还能输入参数作为查询视图的条件。
geoserver的views可以发布数据库的存储过程或者function,执行更加复杂的逻辑操作与查询。
SQL Views是对数据库操作与查询的一个结果,不能使用wfs_t去操作它,但是wfs,wms都可以正常请求或者查询,具体见下文。
创建简单的SQL Views
这里写图片描述
这里写图片描述
这里创建了一个视图,从road表中只返回gid小于100的记录。
这里写图片描述
一般可以将数据库中主键比如gid设置为标识符,返回的图形要手动选择类型和srid。其他发布操作和其他的一模一样。
创建带查询条件的SQL Views
定义参数化Views
这里写图片描述
这里使用%%定义了两个参数,一个是下限low,一个是上限high。该视图用于传入这两个参数,查询结果。
这里写图片描述
点击 ‘从sql中猜想参数’,自动弹出以上内容。可以在默认值中赋值,后面正则表达式用于验证参数格式,防止sql注入,具体细节请学习正则表达式。任何不符合表达式规定的参数,验证都不会通过。(新手练习可以删除正则表达式内容,为空即可。避免因为正则不通过,导致视图使用不了)。发布的其他操作见上文。
使用参数化Views
在正常的wms的getMap请求中或者wfs的getFeature请求的url中加入viewparams参数,用来向视图传递参数值。上文中我们定义了两个参数,即low和high,下面看如何在请求中将参数传递给服务器。
正常getMap语句:
http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259&height=512&srs=EPSG:3857&format='image.png'
可传递参数的getMap
http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259
&format=’image.png’
&viewparams=low:200;high:400
`正常wfs的请求url后加上viewparmas即可。
viewparams格式一般是viewparams=p1:v1;p2:v2;…可以加若干个参数。不同参数之间以;隔开,单个参数是键值对,即p1是参数名称,v1是参数值。
很明显如’,’,’ ;’都是特殊符号,用来区分参数的,可是有人要问,要是我的参数值是字符串,并且就有特殊符号怎么办?当然有办法–转义!转义符号是’\’。
比如,v1值比如是’adsf;sdfjsdf’,那么viewparams就要这么写viewparams=p1:’adsf\;sdfjsdf’,注意’,’,’:’都是特殊符号。
创建数据库的Function视图
在postgis中定义Function
CREATE OR REPLACE FUNCTION zj_showjgnsr(
IN p_idcode text,
OUT swglm text,
OUT geom geometry)
RETURNS SETOF record AS
$BODY$
DECLARE
sql text;
rec record;
the_geom geometry;
BEGIN
execute 'select geom from grid where idcode=$1' using p_idcode into the_geom;
for rec in execute 'select * from jgnsr where ST_Within(geom,$1)' using the_geom loop
swglm:=rec.swglm;
geom:=rec.geom;
return next;
end loop;
return;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT;
这个function接受一个参数,根据该参数从grid表中查询出图形,然后以该图形为查询条件,查询这个jgnsr 表中与其相交的所有记录,并返回出去。function一般处理比较复杂的逻辑和过程。
发布Function
这里写图片描述
这里写图片描述
使用:发布成功之后,该视图图层和普通表在查询时几乎都是一模一样的操作,不同的是,表发布的图层可以通过wfs_t修改,而视图图层不可以。此外,视图图层有参数的,在正常请求的wfs,wms的url中要加上viewparams参数。
后记
我们发布了function是有geometry类型的,但实际上,任何数据库function都可以发布,哪怕返回值没有图形,geo 发布了图层了,按理说应该就可以预览了,但是。。。。
通过跟大神的一番交流,才知道个中端倪:
首先通过数据表发布图层的时候,geoserver会自动计算图层的边界值。然而视图的边界值是有条件的(因为sqlview中是可以预留条件的%%),所以geoserver是不会计算发布图层的边界值的,但是我看到geoserver通过sqlview发布的图层也是 有边界值的啊,年轻人你被骗了,这里计算的边界值是不正确的,所以在预览的时候才会出现一大片空白。
特此,谢谢大神的指导!!!
本文介绍了在使用geoserver通过sqlview发布图层时遇到的预览不可见问题。通常,geoserver会自动计算图层边界,但视图的边界依赖于条件,导致geoserver无法正确计算,从而在预览时显示为空白。作者通过与大神交流了解到,这种情况下计算的边界值是不准确的。
666

被折叠的 条评论
为什么被折叠?



