zoukankan      html  css  js  c++  java
  • 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博客,地址

  • 相关阅读:
    【基础算法】- 全排列
    【基础算法】- 2分查找
    区块链培训
    Static Binding (Early Binding) vs Dynamic Binding (Late Binding)
    test
    No data is deployed on the contract address!
    "throw" is deprecated in favour of "revert()", "require()" and "assert()".
    Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
    京都行
    Failed to write genesis block: database already contains an incompatible
  • 原文地址:https://www.cnblogs.com/hustshu/p/15056258.html
Copyright © 2011-2022 走看看