geoserver中sqlview的强大功能探索

一、引子(function当作接口使用)

        最近有个项目需要后台调用gis超范围、进出某场所或者偏离路径的判断结果,显然,如果能直接将postgis方法的结果返回给后台程序则会效率高很多,而且不需要额外再写后台代码。

        例如,在postgis中很容易就能查出点(120.451737 120.451737)是不是在线(120.451737 120.451737,120.455636 36.520885)上,其中缓冲区为25米:

select ST_Contains(
    St_Astext(
        ST_Buffer(
            geography(ST_GeomFromText('MULTILINESTRING((120.451737 120.451737,120.455636 36.520885))')
        ),25.00)
    ) ,
    st_astext(geography(ST_GeomFromText('POINT(120.451737 120.451737)')))
) as result

其结果为t或者f,如何把结果传给后台程序呢?

        登灯邓邓,这里就用到了geoserver 的sqlview功能。sqlview可以将表视图view发布成服务供他人调用,也可以直接发布数据库函数function,这就给sqlview的应用提供了充分的想象空间。

        例如,上述点是否在线上的结果可以直接发布成服务(过程后面补),调用的方法

https://img-blog.csdnimg.cn/2019033011163011.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoYW95YW5nODkxMTE=,size_16,color_FFFFFF,t_70

 调用方法如下:

 http://localhost:8080/geoserver/hescgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=hescgis:trackOffset&maxFeatures=50&outputFormat=application%2Fjson&viewparams=x:120.69117;y:30.52860;carid:%271234567%27

        是不是发现跟普通的服务差不多?只是多了一个 viewparams参数,这个参数就是将传入的参数带入到function中,返回所需的结果。

        至此,再也不需要多余的后台来写接口了,是不是很方便?当然,上面也说了sqlview的用处不只这一点,下面再说几个。

 

二、使用sqlview实现热力图展示

        乍一看是不是觉得我在瞎说?哈哈,sqlview和热力图有毛线关系,再说直接用openlayers的ol.layer.Heatmap不就解决了吗?确实如此,对于小数据量的热力图直接前端渲染没毛病,可问题就在这,热力图一般都是用来展示大量数据,小数据量没什么意义。这就给前端造成很大渲染压力,而且读取数据的速度也会降低渲染效率。

        有没有好的解决方案?答案是肯定的,要不然我也不会说不是。上文说过使用sqlview可以直接发布视图或function。所以这里也有两种解决方案可根据实际应用场景进行选择。

      1、直接发布视图

        如果想把某张表所展示的所有点位均渲染到地图上,就可以食用该方案,如下图所示:

        其中tbl是你想展示的表名,可以动态传入,如果你想展示的表有很多个,那这个方案再适合不过了,再也不用一张一张表的去发布服务。节省大把时间有木有。

      2.发布function

        如果想更精细化的控制选择的点位呢?比如我想选择某个区域内的公测点位渲染出来,这时候一句sql语句就搞不定了,需要在存储过程中写好逻辑处理,然后发布。具体实现就不在赘述了。

        最后说一下样式,直接上热力图的样式文件heatmap.sld:

<?xml version="1.0" encoding="ISO-8859-1"?>
   <StyledLayerDescriptor version="1.0.0"
       xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
       xmlns="http://www.opengis.net/sld"
       xmlns:ogc="http://www.opengis.net/ogc"
       xmlns:xlink="http://www.w3.org/1999/xlink"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <NamedLayer>
       <Name>Heatmap</Name>
       <UserStyle>
         <Title>Heatmap</Title>
         <Abstract>A heatmap surface showing population density</Abstract>
         <FeatureTypeStyle>
           <Transformation>
             <ogc:Function name="gs:Heatmap">
               <ogc:Function name="parameter">
                 <ogc:Literal>data</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>weightAttr</ogc:Literal>
                 <ogc:Literal>jan_je</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>radiusPixels</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>radius</ogc:Literal>
                   <ogc:Literal>100</ogc:Literal>
                 </ogc:Function>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>pixelsPerCell</ogc:Literal>
                 <ogc:Literal>10</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>outputBBOX</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>wms_bbox</ogc:Literal>
                 </ogc:Function>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>outputWidth</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>wms_width</ogc:Literal>
                 </ogc:Function>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>outputHeight</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>wms_height</ogc:Literal>
                 </ogc:Function>
               </ogc:Function>
             </ogc:Function>
           </Transformation>
          <Rule>
            <RasterSymbolizer>
            <!-- specify geometry attribute to pass validation -->
              <Geometry>
                <ogc:PropertyName>geom</ogc:PropertyName></Geometry>
              <Opacity>0.6</Opacity>
				<ColorMap type="ramp" >
                <ColorMapEntry color="#0000FF" quantity="0" label="nodata" opacity="0"/>
                <ColorMapEntry color="#00FFFF" quantity="0.02" label="nodata"
                  opacity="0"/>
                <ColorMapEntry color="#00FF00" quantity=".1" label="nodata"/>
                <ColorMapEntry color="#FFFF00" quantity=".5" label="values" />
                <ColorMapEntry color="#FF0000" quantity="1.0" label="values" />
              </ColorMap>
            </RasterSymbolizer>
           </Rule>
         </FeatureTypeStyle>
       </UserStyle>
     </NamedLayer>
    </StyledLayerDescriptor>

        其中weightAttr标签指定权重字段。

        对了,设想下展示轨迹的时候加上热力图,是不是能更加直观的展示停留时间了呢。例如这种:

https://images2015.cnblogs.com/blog/656746/201704/656746-20170416150043743-61670185.png

更多应用下回再写吧。 

 

猜你喜欢

转载自blog.csdn.net/chaoyang89111/article/details/88908666