geoserver发布热力图服务

一、背景

项目需要热力图的效果,对比了各种结合cesium生成的热力图效果和数据量大的局限性,决定采用切片加载的方式加载热力图,原因如下:

1.数据量大的话,从前端通过后台查询比较费时,3000条就很卡了,对动辄上万多数据可行性不高。

2.前端对大数据添加渲染压力也大

如果所有的数据在服务端生成渲染图片输出到前端,这两个问题都迎刃而解。

3.Geoserver可以将矢量图层,发布成栅格图层,通过设置sld(geoserver的样式文件),能够将图层显示成热力图的效果

想要这种效果

pic_1f088cc0.png

二、步骤

sld设置参考网址为:docs.geoserver.org/latest/en/u…

首先要有一个具有 权重的矢量图层,根据矢量图层中的字段,确定热力图的影响范围,后边主要内容就是设置sld的样式,参考网址上有一个sld的样式,下边列举一下关键参数:

<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="vec:Heatmap">
               <ogc:Function name="parameter">
                 <ogc:Literal>data</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>weightAttr</ogc:Literal>
                 <ogc:Literal>value</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>radiusPixels</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>radius</ogc:Literal>
                   <ogc:Literal>10</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>the_geom</ogc:PropertyName></Geometry>
              <Opacity>0.6</Opacity>
              <ColorMap type="ramp" >
                <ColorMapEntry color="#FFFFFF" quantity="0" label="nodata"
                  opacity="0"/>
                <ColorMapEntry color="#FFFFFF" quantity="0.02" label="nodata"
                  opacity="0"/>
                <ColorMapEntry color="#4444FF" quantity=".1" label="nodata"/>
                <ColorMapEntry color="#FF0000" quantity=".5" label="values" />
                <ColorMapEntry color="#FFFF00" quantity="1.0" label="values" />
              </ColorMap>
            </RasterSymbolizer>
           </Rule>
         </FeatureTypeStyle>
       </UserStyle>
     </NamedLayer>
    </StyledLayerDescriptor>

SLD 的主要方面是:

第 14-15 行定义了渲染转换,使用过程vec:Heatmap.

第 16-18 行提供输入数据参数,data在此过程中命名。

第 19-22 行为过程weightAttr参数提供了一个值,该值指定为每个数据点提供权重的输入属性。

第 23-29 行提供了radiusPixels参数值,它控制着热图在每个点周围的“传播”。在此 SLD 中,此参数的值可由名为 的 SLD 替换变量提供,radius默认值为100像素。

第 30-33 行提供pixelsPerCell参数,该参数控制计算热图栅格的分辨率。

第 34-38 行提供了outputBBOX参数,该参数给出了标准 SLD 环境变量的值wms_bbox。

第 40-45 行提供了outputWidth参数,该参数给出了标准 SLD 环境变量的值wms_width。

第 46-52 行提供了outputHeight参数,该参数给出了标准 SLD 环境变量的值wms_height。

第 55-70 行指定 aRasterSymbolizer来设置计算栅格表面的样式。符号包含数据范围 [0..1] 的渐变颜色图。

第 58 行指定输入要素类型的几何属性,这是通过 SLD 验证所必需的

三、结果

pic_191254ab.png

四、出现的问题

1.关于热力图周边透明色和数据区域内0值的颜色区分,我想要的效果是只在我的数据区域内0值颜色是深蓝色,数据范围之外是透明色,不然已加载整个地球都是深蓝色,不好看

pic_9d017bc6.png

解决思路一:修改数据区域的范围,没找到解决方式

解决思路二:把数据区域的0值用数据库批量改为0.1,容易实现,暂用这种方式

各位有更好的思路请留言或者私信我交流

步骤1:将数据库数据0值批量改为0.1

步骤2:修改样式,将0值透明度设置为0,0.1值的范围设置为深蓝色

最终的样式sld如下:

<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>dc_heat</Name>
       <UserStyle>
         <Title>dc_heat</Title>
         <Abstract>A heatmap </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>value1</ogc:Literal>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>radiusPixels</ogc:Literal>
                 <ogc:Function name="env">
                   <ogc:Literal>radius</ogc:Literal>
                   <ogc:Literal>2</ogc:Literal>
                 </ogc:Function>
               </ogc:Function>
               <ogc:Function name="parameter">
                 <ogc:Literal>pixelsPerCell</ogc:Literal>
                 <ogc:Literal>20</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>the_geom</ogc:PropertyName>
              </Geometry>
              <Opacity>1</Opacity>
                <ColorMap type="ramp" >             
                  <ColorMapEntry color="#0055ff" quantity="0" label="0000FF" opacity="0"/>
                  <ColorMapEntry color="#0028ff" quantity="0.0001"  label="00ffff" />
                  <ColorMapEntry color="#6fc8dc" quantity="0.1" label="6fc8dc" />
                  <ColorMapEntry color="#00ffb2" quantity="0.3"  label="00ff00" />
                  <ColorMapEntry color="#ffff00" quantity="0.4"  label="ffff00" />
                  <ColorMapEntry color="#ff9900" quantity="0.7"  label="ff9900" />
                  <ColorMapEntry color="#ff0000" quantity="1" label="ff0000" />
                  </ColorMap>
            </RasterSymbolizer>
           </Rule>
         </FeatureTypeStyle>
       </UserStyle>
     </NamedLayer>
    </StyledLayerDescriptor>

2.生成的热力图放大之后数据变成格子了,不好看 ,加上三维模型没有想要的效果

pic_27781809.png

将样式文件中的

<ogc:Literal>pixelsPerCell</ogc:Literal> <ogc:Literal>20</ogc:Literal>

放大之后整体样式就不好看了,一坨

pic_482c9bb5.png 怎么办塞??????

3.Qgis可以生成热力图效果,但是不支持导出sld文件,阿欧!

pic_5cc0b958.png

pic_122b80f4.png

参考:www.freesion.com/article/244…

大家也可以关注我的csdn博客,地址

原文地址:https://www.cnblogs.com/hustshu/p/15056258.html