暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译文] 基于PostGIS3.1 生成格网数据

Spatial Data 2021-04-16
1270

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

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

  • 每个格网的面积都相等。

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

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

生成格网数据的方法其实有很多,例如在之前的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))).* 
    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

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

    示例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等能快速实现成果可视化。

        文章转载自Spatial Data,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论