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的应用提供了充分的想象空间。
例如,上述点是否在线上的结果可以直接发布成服务(过程后面补),调用的方法
调用方法如下:
是不是发现跟普通的服务差不多?只是多了一个 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://blog.csdn.net/chaoyang89111/article/details/88908666