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

 

 

 

 

 

 

时间: 2025-01-29 13:32:24

通过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可用的数

ArcGis Engine10.1发布地图服务到Arcgis Server,出现了错误,如下

问题描述 ArcGis Engine10.1发布地图服务到Arcgis Server,出现了错误,如下 服务成功发布到了Server上,但是无法启动服务,求助大牛... 代码如下: string serverName = "http://localhost:6080/arcgis/admin"; string mxdFilePath = @"D:southGisDataxyz.mxd"; string serviceName = "tiles02223&q

raphael绘制动态交互地图

问题描述 raphael绘制动态交互地图 raphael绘制动态交互地图,用raphael绘制中国地图,然后想实现一个效果:点击某个区域,在这个区域上弹出一个柱状图,或者怎样用raphael来获取点击区域的位置坐标呢,谢谢哈 解决方案 内部执行查询的动态交互图----------------------

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

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

10 1 arcpy-arcgis 10.1,使用arcpy发布地图服务,怎么同时指定启用wms服务呢?

问题描述 arcgis 10.1,使用arcpy发布地图服务,怎么同时指定启用wms服务呢? arcgis 10.1,使用arcpy发布地图服务,怎么同时指定启用wms服务呢? 解决方案 已解决,具体见官方帮助:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//00s30000006q000000 解决方案二: 已解决,具体见官方帮助:http://resources.arcgis.com/zh-cn/help/main/