根据格网进行数据统计与分析是一种常用的方法,相比自然地理边界与行政管理边界而言,使用格网有如下特点:
生成格网数据的方法其实有很多,例如在之前的PostGIS中可以写一个plpgsql function根据起点,终点,cell分辨率快速生成格网等,由于格网数据比较常用,所以PostGIS3.1直接提供了ST_SquareGrid()(正方形网格)与ST_HexagonGrid()(蜂窝网格)两种格网方法。
稍微不同的是,PostGIS3.1中生成的网格是具有统一的特征的:
ST_SquareGrid()
ST_SquareGrid(size,bounds)方法以墨卡托坐标0 0为原点,以size声明网格大小,以bounds指定地理范围。
示例sql:
SELECT (ST_SquareGrid(400000, ST_Transform(a.geom, 3857))).*
FROM admin a
WHERE name = 'Brazil';
该示例获取巴西的国界,并转平面墨卡托坐标,以0 0为边界,以巴西国界的bbox为生成网格地理边界,生成一些列网格,结果如下:
ST_HexagonGrid()
ST_HexagonGrid(size,bounds)方法的参数与ST_SquareGrid(size,bounds)参数定义完全一致。
蜂窝网格目前非常流行,在某些制图表达和统计建模上具有一些特定场景的优势,一开始应该出现在Uber提出的H3格式:
H3: Uber’s Hexagonal Hierarchical Spatial Index
示例sql:
SELECT (ST_HexagonGrid(100000, ST_Transform(a.geom, 3857))).*
FROM admin a
WHERE name = 'Germany';
结果可视化如下:
格网统计
生成格网一般用于进行统计分析然后汇总可视化的,使用PostGIS时,不需要实际生成网格并存储,而是通过生成器动态创建网格然后与其他空间数据做叠加统计分析。
示例:假设有点数据集places,geom是geometry(Point,4326)类型,该数据集有字段pop_max定义每个palces点的最大人口数,根据蜂窝网格统计汇总每个格网的最大人口数:
SELECT sum(pop_max) as pop_max, hexes.geom
FROM
ST_HexagonGrid(
4.0,
ST_SetSRID(ST_EstimatedExtent('places', 'geom'), 4326)
) AS hexes
INNER JOIN
places AS p
ON ST_Intersects(p.geom, hexes.geom)
GROUP BY hexes.geom;
可视化结果如下:
这种动态统计分析是非常快速的,结果可以通过Postgis的矢量切片函数做成动态矢量切片服务,也可以使用pg_tileserv(https://github.com/crunchydata/pg_tileserv)做动态矢量切片服务,配合MapboxGL等能快速实现成果可视化。