GeoServer之SqlView

原文:http://www.cnblogs.com/hanhuibing/articles/5642703.html

Geoserver+postgresql+openlayers是目前主流的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参数。

版权声明:本文为u014529917原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014529917/article/details/72677699

智能推荐

Geoserver问题汇总

转`自:http://blog.csdn.net/mygisforum/article/details/8249093 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中、居左、居右 SmartyPants 创建一个自定义列表 如何创建一个注脚 注释也...

GeoServer发布OSM地图

参考顺序: CentOS7安装Postgresql10.5和PostGIS CentOS7部署GeoServer CentOS7部署osm2pgsql GeoServer发布OSM地图 1. 创建图层数据表 osm_db中包含了planet_osm_line,planet_osm_point,planet_osm_polygon和planet_osm_roads四个有数据的表,我们要为各个图层分别...

geoserver jms集群部署

1 集群节点运行架构图 官网集群介绍: https://docs.geoserver.org/latest/en/user/community/jms-cluster/index.html 节点之间通过jms消息通信,A节点增删数据(workspace、store、layers)等,其余节点数据同步。jms服务通过activeMQ消息中间件,实现集群节点之间数据互通。官网架构图直观地解释了集群运行...

geoserver图层样式

Styled Layer Descriptor  标准描述了稳当的结构合使用规则。一个文档包含了符号定义和绘制规则,那么这个文档就叫做Styled Layer Desciptor(SLD)样式,它是一个text/Xml文件,扩展名为.sld。SLD基于XML标记语言,附加的标准是一个XSD schema,XSD schema定义了SLD语法。 样式文档结构  样式最外层不分包含...

Geoserver 影像去黑边

geoserver 影像去黑边 geoserver发布tif文件进行切片,展示的时候影像周边会有黑色底。如图黑色区域 方法1:手动设置 方法2:geoserver REST 服务设置...

猜你喜欢

开始学习微服务(二)

Eureka 1. 来源  Netflix公司开发,不是Spring公司 2.组件  EurekaServer(独立项目)用于定位服务,实现中间层服务器负载均衡和故障转移。 EurekaClient(微服务)和Server交互,简化交互,通过服务标识符获得服务 3. 关系 用来实现服务的注册与发现,C-S架构(客户端和服务端)  4. 使用小坑 2.0之前依...

React Native开发之——组件DrawerLayoutAndroid

前言 封装了平台DrawerLayout(仅限安卓平台)的React组件。抽屉(通常用于导航切换)是通过renderNavigationView方法渲染的,并且DrawerLayoutAndroid的直接子视图会成为主视图(用于放置你的内容)。导航视图一开始在屏幕上并不可见,不过可以从drawerPosition指定的窗口侧面拖拽出来,并且抽屉的宽度可以使用drawerWidth属性来指定。(借鉴...

CentOS7引导Windows7

简单说下吧 一开始是直接在 boot/grub2/grub.cfg里作如下变动: 找到  ### BEGIN /etc/grub.d/30_os-prober ###,在后面添加 grub2从1计数,win7装在C盘上的(可以在终端里输入 fdisk -l 来确定下,一般win都是装在C的吧) OK,保存后,启动画面里出现了win7的选项 接下来是修改等待时间和默认启动项 这里有个问题,...

尚硅谷2020周阳老师SpringCloud学习整理笔记第二部分

第一部分:尚硅谷周阳老师SpringCloud学习整理笔记第一部分 经过5天的学习,目前学到了P92,刚刚结束了SpringCloud Stream,由于还有一些别的事情所以进度有点慢,笔记也整理得有点潦草。第一部分篇幅逐渐臃肿,故下面的笔记,分享于这篇博客。 笔记供自己日后复习,若有需要也供大家参考。若有不足,还请指正。 十三、Hystrix Hystrix介绍 在微服务场景中,通常会有很多层的...

python随机森林

准备在天池新人赛中使用随机森林。 网上搜索了一个博客: http://blog.csdn.net/lulei1217/article/details/49583287 下面是自己实现的代码: from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor import...