地理网格编码概述

1. 简介

地理网格编码是将连续的地理空间划分为规则的网格单元,并为每个网格赋予唯一编码的技术。通过将空间对象(点、线、面、三维模型等)转换为网格编码,可以在网格空间中高效地管理和查询空间数据。

GeoSOT网格剖分

Yukon 的地理网格编码能力由 yukon_geogridcoder 扩展模块提供。此模块提供了地理网格类型的空间操作函数、空间关系判断函数,以及与 geometry 等数据类型的转换计算函数。

使用前请先确认是否已创建 yukon_geogridcoder扩展。

CREATE EXTENSION yukon_geogridcoder;

主要应用场景

  • 高效空间查询:Yukon中基于网格的空间过滤查询,是将 geometry 对象从地理空间转换到网格空间,落在相同网格的对象即为可能有交点的对象,将作为检索结果输出。在智慧城市、国土空间规划等应用中,需要同时检索多个专题图层(如建筑物、道路、地下管线、行政区划)在某一范围内的地物信息。将各图层对象统一转换为网格编码并建立索引,可实现一次查询快速关联所有图层,替代传统的逐图层空间过滤。

  • 时空统计与分析:在城市治理、物流调度等场景中,常以固定空间单元进行统计汇总。将地物或轨迹数据转换为网格编码后,可按网格单元快速聚合人口密度、设施分布、事件热度等指标,生成多级尺度的统计视图。

  • 低空航线规划:在城市低空物流、应急物资投运、电力设施巡检等应用中,飞行器需要在复杂城市三维环境中规避障碍物等。通过将障碍物空间离散化为三维网格编码,可在网格空间中直接搜索安全航线,替代复杂的三维几何实时求交计算。


2. 编码体系

在 Yukon yukon_geogridcoder 模块中,当前支持 GeoSOT 和北斗两种网格编码。两种编码体系之间可以使用 ``ST_GridConvert` 函数相互转换。

编码类型

GeoSOT

GeoSOT 是基于地球剖分模型的空间网格编码,支持二维和三维场景。GeoSOT 将地球表面空间进行递归四叉剖分,形成 1-32 级的层次网格体系,精度可达厘米级。数据类型为 GeoSOTGridGeoGridCode,编码格式如 geosot;G001310322-230230(15 级网格编码)。

GeoSOT网格编码示例图

北斗网格

北斗网格位置码标准,支持二维和三维场景,适用于与北斗定位系统对接的业务需求,层级范围 1-10 级。数据类型为 GeoGridCode,编码格式如 beidou;N050K0040010700(4 级网格编码)。

北斗网格

索引

合理的索引策略能够显著加速网格编码的空间检索,避免大数据量场景下的全表扫描。yukon_geogridcoder 模块支持 B-TreeGIN 两种索引类型,两者分别适用于不同的数据类型与查询模式。

索引类型

适用数据类型

支持的查询操作符

典型应用场景

创建语法

B-Tree

单个网格编码值(GeoSOTGridGeoGridCode

=ORDER BY

已知目标网格编码,精确匹配单条记录

CREATE INDEX idx_btree_grid
ON sample_grid_table USING BTREE (grid);

GIN

网格编码数组(GeoSOTGrid[]GeoGridCode[]

&&(相交)、@>(包含)、<@(被包含)

一个空间对象对应多个网格编码时,判断对象集合与目标网格是否存在交集

CREATE INDEX idx_gin_grid
ON sample_grid_table USING GIN (grid);

选用建议: 若数据列存储的是单个网格编码值,使用 B-Tree 索引;若列存储的是网格编码数组(如 ST_AsGeoGridCode 的返回结果),使用 GIN 索引。

坐标系

GeoSOT 和北斗网格编码均基于 China2000(EPSG:4490) 坐标系。待编码的空间对象若处于其他坐标系,需先转换至 EPSG:4490 再执行编码。

坐标值区间

不同网格支持的坐标值区间可能存在差异,具体取决于编码体系的设计和实现。请根据实际使用的编码体系参考相关文档确认坐标值区间限制。


3. 快速入门

简介

快速入门文档帮助用户快速理解 Yukon 地理网格编码的基本用法,包括建表、插入数据、计算网格编码、创建索引、查询。

更多网格函数见 接口参考

语法说明

  • 创建具有网格编码的表

    CREATE TABLE t_gridcode (
        id integer,
        geom geometry,              -- 几何对象
        grid geogridcode[]          -- 通用网格编码数组
    );
    
  • 插入几何数据

    -- 插入点数据
    INSERT INTO t_gridcode (id, geom)
    VALUES (1, ST_GeomFromText('POINT(116.31522216796875 39.910277777777778)', 4490)),
           (2, ST_GeomFromText('POINT(116.31522217796875 39.910277776777778)', 4490));
    
    -- 插入面数据
    INSERT INTO t_gridcode (id, geom)
    VALUES (3, 'SRID=4490;POLYGON((116.31 39.90, 116.32 39.90, 116.32 39.91, 116.31 39.91, 116.31 39.90))'::geometry);
    
  • 计算网格编码

    -- 生成指定层级的 GeoSOT 网格编码
    UPDATE t_gridcode
    SET grid = ST_AsGeoGridCode(geom, 15, 'geosot');
    
    -- 生成指定层级的北斗网格编码
    UPDATE t_gridcode
    SET grid = ST_AsGeoGridCode(geom, 4, 'beidou');
    
  • 对网格码创建索引

    -- 对网格编码数组列创建 GIN 索引
    CREATE INDEX idx_gridcode_gin
        ON t_gridcode USING GIN (grid);
    
  • 查询

    -- 与某个网格相交
    SELECT id
    FROM t_gridcode
    WHERE grid && ARRAY['geosot;G001310322-230230'::geogridcode];
    
    -- 网格编码转换为 WKT 几何对象
    SELECT ST_AsText(ST_GeomFromGeoGridCode(unnest(grid)))
    FROM t_gridcode
    WHERE id = 1;