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博客,地址

  • 相关阅读:
    <数据结构基础学习>(四)链表 Part 2
    <Android基础> (四) Fragment Part 2
    swagger忽略方法里参数的方法
    ActiveMq
    Tomcat日志归档
    java代理的实现
    包装类型和基础类型是如何比较的
    hashmap
    可达性分析中,可以作为GcRoots的对象
    使用Navicat 连接oracle出现 “ORA-03135: Connection Lost Contact”
  • 原文地址:https://www.cnblogs.com/hustshu/p/15056258.html
Copyright © 2011-2022 走看看