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动态发布地图图层的方法,希望对大家有所帮助!

时间: 2024-09-16 09:41:43

Sqlview动态发布地图图层的方法的相关文章

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

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

通过sqlview动态发布地图图层

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

arcgis-ArcMap发布地图时,提示:00037 无法将底图图层直接发布到地图服务

问题描述 ArcMap发布地图时,提示:00037 无法将底图图层直接发布到地图服务 ArcMap发布地图时,提示:00037 无法将底图图层直接发布到地图服务. 我的地图含底图图层,帮助文档说将底图图层和业务图层分开发布,最后在聚合在一起,请问怎么聚合在一起呢,具体怎么操作?或者有别的解决方案没? ArcGIS版本10.2 解决方案 ## 求解答 求教育 求抱大腿_

动态创建地图文档MXD并发布地图服务

原文:动态创建地图文档MXD并发布地图服务  1.动态创建MXD private bool CreateMxd(string MxdPath, string MxdName) { IMapDocument pMapDocument = CreateObject("esriCarto.MapDocument") as IMapDocument; if (MxdPath.Substring(MxdPath.Length - 1) != @"\") MxdPath +=

关于JSP发布地图服务

js <b>关于JSP发布地图服务</b>首先介绍下用于发布地图服务的ArsIMSArsIMS是一个由Presentation层,Business Logic层,data层组成的多层架构,另外,它还有一个用于管理地图网页发布的应用程序集.(1)presentation 层是ArcIMS的客户端,可以获得,浏览和分析地理数据(geographic data)(2)business logic 层的组件用于请求处理和ArcIMS的网页管理(3)data 层包含了所有ArcIMS可用的数

【百度地图API】如何自定义地图图层?实例:制作麻点图(自定义图层+热区)

原文:[百度地图API]如何自定义地图图层?实例:制作麻点图(自定义图层+热区) 摘要:自定义地图图层的用途十分广泛.常见的应用,比如制作魔兽地图和清华校园地图(使用切图工具即可轻松实现).今天我们来学习,当地图上有大量标注,比如600万个的时候,我们如何用"麻点图"来实现标注的展示. -----------------------------------------------------------------------------------------------------

动态加载js的方法汇总_javascript技巧

本文实例汇总了动态加载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

Axure添加动态弹出框的方法制作生动的演示

文章描述:交互不求人-Axure弹出动态面板使用方法. 作为一名互联网产品设计人员,相信很多同行每天上班电脑上都会运行着一个软件--Axure,她能帮助网站需求设计者,快捷而简便的创建基于网站构架图的带注释页面示意图.操作流程图.以及交互设计,并可自动生成用于演示的网页文件和规格文件,以提供演示与开发. 随着互联网展品的发展,交互元素越来越多的在页面中体现,常见的就有很多的弹出框,大家在使用微波的时候就会深有体会. (新浪微博的各种弹出框) 随之而来的问题就是产品设计师如何在原型设计或者demo