GeoServer系列之SqlView

本文介绍如何利用GeoServer结合PostgreSQL及SQLView简化地图数据的发布流程,特别是针对大量室内地图的情况。通过创建参数化的SQLView,可以有效减少重复工作,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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都可以正常请求或者查询。

创建简单的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参数。

内容概要:本文主要介绍了基于PostGIS环境在GeoServer平台之上建立自定义SQL视图的具体方法。首先对如何利用PostGIS数据库创建存储函数进行了说明,详细讲解了包括参数传递机制(如字符型和整型),到函数体内部查询操作编写的所有细节。紧接着针对创建好的PostGIS函数阐述了在GeoServer平台配置过程中关于图层新增时选择相应工作区、定制化SQL视图界面以及设定SQL查询命令和参数设置等一系列关键环节。此外还强调了参数格式的验证对于预防SQL注入攻击的重要性。 适用人群:地理信息系统管理员,地图开发者,WebGIS应用集成人员,从事空间数据分析工作者。 使用场景及目标:旨在使开发者能够独立地将复杂的后端PostGIS查询结果呈现给前端GIS系统,提高地理信息服务的数据灵活性和服务响应速度的同时,加强了数据安全管理措施。例如,在线绘制特定条件筛选的空间要素图形,为用户提供定制化的空间查询服务等功能。 其他说明:通过本教程,不仅可以加深对PostGIS扩展的强大支持的理解,更能掌握使用GeoServer作为开源地理信息服务平台搭建的基础技能。这使得读者可以更高效地管理和展示地理位置相关的大规模矢量数据集。文中所涉及的内容涵盖了从理论介绍到具体实操指引两方面,对于想深入研究PostGIS同GeoServer协作机制的学习者非常有帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值