一、背景
项目需要热力图的效果,对比了各种结合cesium生成的热力图效果和数据量大的局限性,决定采用切片加载的方式加载热力图,原因如下:
1.数据量大的话,从前端通过后台查询比较费时,3000条就很卡了,对动辄上万多数据可行性不高。
2.前端对大数据添加渲染压力也大
如果所有的数据在服务端生成渲染图片输出到前端,这两个问题都迎刃而解。
3.Geoserver可以将矢量图层,发布成栅格图层,通过设置sld(geoserver的样式文件),能够将图层显示成热力图的效果
想要这种效果
二、步骤
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 验证所必需的
三、结果
四、出现的问题
1.关于热力图周边透明色和数据区域内0值的颜色区分,我想要的效果是只在我的数据区域内0值颜色是深蓝色,数据范围之外是透明色,不然已加载整个地球都是深蓝色,不好看
解决思路一:修改数据区域的范围,没找到解决方式
解决思路二:把数据区域的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.生成的热力图放大之后数据变成格子了,不好看 ,加上三维模型没有想要的效果
将样式文件中的
<ogc:Literal>pixelsPerCell</ogc:Literal> <ogc:Literal>20</ogc:Literal>
放大之后整体样式就不好看了,一坨
怎么办塞??????
3.Qgis可以生成热力图效果,但是不支持导出sld文件,阿欧!
参考:www.freesion.com/article/244…
大家也可以关注我的csdn博客,地址
今天的文章geoserver发布热力图服务分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20531.html