需求如下,已经有生成好的空间数据,包括日期、小时、经度、纬度,人数,利用GeoServer生成热力图。
本文使用PostgreSQL10数据库,已添加PostGIS支持。
###创建表
create table table_test(
day varchar(8),
hour int,
lon numeric(8,5),
lat numeric(8,5),
count_people int,
geom geometry
);
###导入数据(略)
###生成geometry字段数据
update table_test set geom=(ST_GeomFromText('POINT(' || lon || ' ' || lat || ')'));
-- 如果报错:Geometry SRID (0) does not match column SRID (4326),则需要指定srid
update table_test set geom=(ST_GeomFromText('POINT(' || lon || ' ' || lat || ')',4326));
###GeoServer发布图层
-
访问本机GeoServer,http://localhost:8080/geoserver/web/。
-
选择图层–>添加新的资源,选择自己的空间数据库,单击配置新的SQL视图。
在创建新的SQL视图页面中
视图名称:table_test
SQL语句:select * from table_test where day=’%day%’ and hour=%hour%
单击从SQL猜想的参数,输入默认值,注意把验证表达式删掉。
单机刷新,SRID填写4326,单击保存。 -
在编辑图层页面中,
将定义SRS改成EPSG:4326,如果不是的话。
边框中,Native Bounding Box单击从数据中计算,纬度/经度边框单机Compute from native bounds。 -
切换到发布标签:
Default Style:选择热力图样式,单击保存。
在Layer Preview中就可以预览了。
发布图层前需要先创建热力图样式。
###在GeoServer中创建热力图样式
<?xml version="1.0" encoding="UTF-8"?>
<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>person_point_heat</Name>
<UserStyle>
<Title>person_point_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>count_people</ogc:Literal>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>radiusPixels</ogc:Literal>
<ogc:Function name="env">
<ogc:Literal>radius</ogc:Literal>
<ogc:Literal>35</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Function name="parameter">
<ogc:Literal>pixelsPerCell</ogc:Literal>
<ogc:Literal>2</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>1</Opacity>
<ColorMap type="ramp" >
<ColorMapEntry color="#FFFFFF" quantity="0" opacity="0" label="FFFFF" />
<ColorMapEntry color="#7F95E6" quantity="0.1" opacity="0.5" label="7F95E6" />
<ColorMapEntry color="#7DFC3F" quantity="0.3" opacity="0.5" label="7DFC3F" />
<ColorMapEntry color="#F6FD01" quantity="0.4" opacity="0.5" label="F6FD01" />
<ColorMapEntry color="#EF8C07" quantity="0.5" opacity="0.5" label="EF8C07" />
<ColorMapEntry color="#FE0409" quantity="0.7" opacity="0.5" label="FE0409" />
<ColorMapEntry color="#FE0409" quantity="1" opacity="0.5" label="FE0409" />
</ColorMap>
</RasterSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
注意count_people和geom字段,与表中的字段对应。