Sqlview动态发布地图图层的方法

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的方式获取得到的最短路径结果即可。

以上所述实现小编给大家介绍的Sqlview动态发布地图图层的方法,希望对大家有所帮助!

(0)

相关推荐

  • Sqlview动态发布地图图层的方法

    1.SQL Views简介 Geoserver+postgresql+openlayers(leaflet)是目前主流的gis开发工具.Postgresql用于存储地图数据,geoserver用于发布地图数据,openlayers或者leaflet用于访问发布地图.正常情况下当shapefile格式的数据导入postgresql数据库中之后,我们需要通过geoserver把所有的数据发布出去,这样才能访问.常规情况下这种操作方式是没有问题的,因为地图作为基础服务,一旦发布出去是不会变化的.但是对

  • js实现动态加载脚本的方法实例汇总

    本文实例讲述了js实现动态加载脚本的方法.分享给大家供大家参考,具体如下: 最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查资料研究js动态脚本的加载,不过真让人伤心啊!,网上几乎都是同一篇文章,4种方法,讨厌其中拷贝别人成果的人,也不加个原文的链接.哎!关键是最后一种方法还有点错误.经过两天的研究查阅资料,在这里和大家分享一下. 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在

  • Nginx 实现灰度发布的三种方法总结

    Nginx 实现灰度发布的三种方法总结 灰度发布的主要原理是访问路由的控制,重点是保证每次访问的是同一个节点. 方式一:通过调节负载均衡权重 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 简单配置如下: ht

  • 动态加载js的方法汇总

    本文实例汇总了动态加载js的方法.分享给大家供大家参考.具体如下: 方法一:直接document.write(异步) 复制代码 代码如下: <script language="javascript">       document.write("<script src='res/extwidget/echarts/xx.js'><\/script>"); </script> 由于这种方式是异步加载,document.w

  • 基于Codeigniter框架实现的student信息系统站点动态发布功能详解

    本文实例讲述了基于Codeigniter框架实现的student信息系统站点动态发布功能.分享给大家供大家参考,具体如下: 既然是动态站点,肯定有数据库表的存在,在此不废话,下面我们来看一下数据库表: CREATE TABLE IF NOT EXISTS `student`( //主键id `id` int(11) NOT NULL AUTO_INCREMENT, //学生姓名 `s_name` varchar(64) NOT NULL, //学生家长的姓名 `p_name` varchar(6

  • 微信小程序动态设置图片大小的方法

    我们都知道微信小程序的组件image是用来显示图片的,它有一下几个属性: 1.src              图片资源地址 2.mode          图片裁剪.缩放的模式 3.binderror     当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'} 4.bindload     当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height

  • Spring Boot Admin 动态修改日志级别的方法步骤

    [前言] 之前关于线上输出日志一直有个困惑:如何可以动态调整的日志级别,来保证系统在正常运行时性能同时又能在出现问题时打印详细的信息来快速定位问题:最近研究一下Spring Boot Admin中动态日志级别调整,并集成项目中,在此与大家共享: [动态修改日志级别]          一.生产环境日志输出的状况 1.生产环境日志输出的困惑 A.设置日志输出级别为info: (1)优点:可以详细的打印日志,有利于排错: (2)缺点:日志消耗系统的性能较大:只能针对整个系统整体设置日志输出较多,定位

  • Docker如何给Springboot项目动态传参的实现方法

    背景 最近有些初学Docker的朋友问到,想通过docker-compose.yml来动态给微服务传参,而不是每次都要在项目配置文件硬编码,然后构建服务镜像,最后打包发布经过一些列流程才能更新配置,那能不能直接通过docker-compose.yml里把一些配置项放到环境变量,然后springboot项目自动从环境变量获取参数呢? 场景 假设现在有一个Springboot项目,它里面有一个数据库的配置项,但是不同的数据库测试环境(DEV\SIT\UAT),数据库ip有多个,想使用同一个Sprin

  • maven如何动态统一修改版本号的方法步骤

    前言 最近业务开发部门因为开发环境和测试环境共用一个maven私仓,导致他们开发环境的API包和测试环境的API包发生了覆盖现象.于是他们向我们部门提出一个需求,希望我们能帮他们实现或者提供这么一个方案,就是项目自动化构建时,项目的版本号能跟着环境变更.比如是开发环境,则项目的API包版本就形如1.0-dev,如果是测试环境,则项目的API版本就形如1.0-test 示例演示 项目层级如下 方案一:mvn -Denv.project.version=1.0-env 注:env.project.v

  • vue2项目中封装echarts地图的优雅方法

    目录 前言 能学到的知识 效果图 注意 1.vue中echarts 5.x以下版本和5.x以上版本引入的区别 2.记得在vue.config.js中开启运行时编译功能 实现 数据准备 echarts地图模块封装 页面调用 接口数据处理 代码总览 代码 总结 参考资料 前言 以前写过 vue项目中封装echarts的比较优雅的方式,大屏可视化里面,除了数据图表很常用,显示省市地图区域也是很常用到的,这是姐妹篇. 区域地图选区域时,需要弹窗展示数据,样式是各种各样的,各种排列的数据.图文混搭.视频.

随机推荐