根据格网进行数据统计与分析是一种常用的方法,相比自然地理边界与行政管理边界而言,使用格网有如下特点:

每个格网之间地位相等,没有上下级之分。

每个格网的面积都相等。

相邻两个格网单元中心点之间距离相等。

适用于将数据从“空间”计算领域转换到“非空间”领域。

生成格网数据的方法其实有很多,例如在之前的PostGIS中可以写一个plpgsql function根据起点,终点,cell分辨率快速生成格网等,由于格网数据比较常用,所以PostGIS3.1直接提供了ST_SquareGrid()(正方形网格)与ST_HexagonGrid()(蜂窝网格)两种格网方法。

稍微不同的是,PostGIS3.1中生成的网格是具有统一的特征的:

生成网格的原点是固定的,指向平面坐标(0,0)。注意:这个原点是根据实际数据来的,生成网格一般要指定一个地理范围,在该范围内生成所定义的网格,那么如果输入的地理范围是epsg:4326坐标系,则指向经纬度0 0,如果输入是epsg:3857,则指向墨卡托的0 0。

指定网格单元的size,即可固定该网格的地理坐标,使用时只使用cell编号而不需要使用真实地理边界。

ST_SquareGrid()

ST_SquareGrid(size,bounds)方法以墨卡托坐标0 0为原点,以size声明网格大小,以bounds指定地理范围。

示例sql:

SELECT (ST_SquareGrid(400000, ST_Transform(a.geom, 3857))).* FROMadmin 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

https://eng.uber.com/h3/

示例sql:

SELECT (ST_HexagonGrid(100000, ST_Transform(a.geom, 3857))).* FROMadmin a WHEREname = 'Germany';

结果可视化如下:

格网统计

生成格网一般用于进行统计分析然后汇总可视化的,使用PostGIS时,不需要实际生成网格并存储,而是通过生成器动态创建网格然后与其他空间数据做叠加统计分析。

示例:假设有点数据集places,geom是geometry(Point,4326)类型,该数据集有字段pop_max定义每个palces点的最大人口数,根据蜂窝网格统计汇总每个格网的最大人口数:

SELECTsum(pop_max) as pop_max, hexes.geomFROM ST_HexagonGrid(4.0, ST_SetSRID(ST_EstimatedExtent('places', 'geom'), 4326) ) AS hexesINNERJOIN places AS pON ST_Intersects(p.geom, hexes.geom)GROUP BY hexes.geom;

可视化结果如下:

这种动态统计分析是非常快速的,结果可以通过Postgis的矢量切片函数做成动态矢量切片服务,也可以使用pg_tileserv(https://github.com/crunchydata/pg_tileserv)做动态矢量切片服务,配合MapboxGL等能快速实现成果可视化。

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。