PostGIS栅格数据类型解析-栅格矢量化复合类型【geomval】

0 阅读4分钟

一、类型定义与结构

geomval是PostGIS中用于表示栅格矢量化结果的复合数据类型,包含两个核心字段:

  • .geom:几何对象(点、线、多边形等),表示栅格像素的空间范围
  • .val:double precision类型的像素值,对应几何对象所在位置的栅格值

该类型主要用于将栅格数据转换为带属性值的几何要素集合,比如常用的函数ST_DumpAsPolygons和栅格交集函数(如ST_Intersection),后续章节会详解这两个函数

二、核心应用场景

1. 栅格矢量化

  • 将栅格每个像素或连续同值区域转换为多边形,保留像素值作为属性。
with dp as (
select (ST_DumpAsPolygons(rast, 1)).* from srtm_90 where rid = 1
)
SELECT dp.geom,dp.val
FROM dp;

2. 栅格 - 矢量交集分析

计算几何对象与栅格的交集,获取交集中的几何形状及对应像素值。

SELECT si.geom AS intersection_geom, si.val AS pixel_value
FROM ST_Intersection(geom, rast, 1) AS si;

三、字段解析与操作

1. .geom 字段

  • 几何类型: 可以是任意PostGIS几何类型(点、线、多边形、几何集合等),取决于栅格矢量化方式或交集结果
    • 单像素矢量化:多边形(表示单个像素范围)
    • 连续同值区域:合并的多边形(如ST_MapAlgebra后的区域)
  • 空间参考:
    • 与原始栅格的SRID一致,可通过*ST_SRID(geom)*查询

2. .val 字段

  • 值类型: 双精度浮点数,直接映射栅格像素值(可能经过类型转换,如整数型像素值转为浮点)
  • NoData处理: 若几何对应栅格区域为NoData,则.val为NULL

四、使用示例

示例 1:栅格矢量化为多边形集合

WITH dem_polygons AS (
  SELECT (dp).geom AS poly, (dp).val AS elev
  FROM (select (ST_DumpAsPolygons(rast, 1)).* from srtm_90 where rid = 1) as dp
)
-- 统计不同高程范围的多边形面积
SELECT 
  CASE 
    WHEN elev < 100 THEN '低海拔'
    WHEN elev < 500 THEN '中海拔'
    ELSE '高海拔'
  END AS elevation_class,
  SUM(ST_Area(poly)) AS total_area
FROM dem_polygons
GROUP BY elevation_class;

示例 2:提取线几何穿过的栅格值

WITH profile_line AS (
  SELECT ST_GeomFromText('LINESTRING(100 200, 500 600)') AS line
),
intersection_data AS (
  SELECT (si).geom AS segment, (si).val AS dem_value
  FROM profile_line, ST_Intersection(line, dem_rast, 1) AS si
)
-- 生成剖面线与高程值的关联数据
SELECT ST_AsText(segment), dem_value
FROM intersection_data
ORDER BY ST_LineLocatePoint(line, segment);

五、与其他类型的转换

1. 提取几何与值

  • 从geomval中分离几何和值:
SELECT 
  (gv).geom AS the_geom,
  (gv).val AS the_value
FROM geomval_table AS gv;

2. 转换为普通表

  • 将geomval集合转换为带几何列和值列的普通表:
CREATE TABLE raster_vector AS
SELECT (gv).geom AS geom, (gv).val AS val
FROM ST_Intersection(geom, rast, 1) AS gv;

3. 与矢量函数结合

  • 在geomval的几何字段上使用矢量操作函数:
SELECT 
  ST_Buffer((gv).geom, 10) AS buffered_geom,
  (gv).val AS val
FROM geomval_collection AS gv;

六、性能与优化

1. 大数据量处理

高分辨率栅格矢量化后geomval数量庞大,建议先分块处理:

WITH tiles AS (
  SELECT (ST_Tile(rast, 512, 512)).* FROM large_raster
),
vector_tiles AS (
  SELECT (ST_DumpAsPolygons(rast, 1)).* FROM tiles
)
SELECT geom, val FROM vector_tiles;

2. 空间索引

对geomval的.geom字段创建 GIST 索引,加速后续查询:

CREATE TABLE vector_raster AS ...;  -- 先创建表
CREATE INDEX ON vector_raster USING GIST (geom);

3. 值过滤

提前通过ST_Intersects或值条件过滤,减少数据量:

SELECT gv.*
FROM ST_Intersection(geom, rast, 1) AS gv
WHERE (gv).val > 100;  -- 仅保留值>100的交集

七、应用场景

1. 生态与环境科学

  • 将植被指数栅格矢量化,结合保护区多边形分析植被分布

2. 城市规划

  • 矢量化人口密度栅格,与规划道路网交集,评估交通流量影响

3. 灾害应急

  • 洪水栅格(值为水深)与居民地多边形交集,快速统计受淹区域及深度

4. 农业监测

  • 作物长势栅格与农田多边形交集,计算各农田的平均长势指数

八、注意事项

1. 栅格分辨率影响

  • 高分辨率栅格矢量化后产生海量geomval,可能导致内存不足或查询缓慢

2. NoData 处理

  • 矢量化时NoData区域会生成.val=NULL的geomval,需通过条件判断来过滤,如WHERE val IS NOT NULL

3. 几何精度

  • 栅格像素的几何表示为规则矩形(如像素坐标系中的正方形),与实际地理形状可能存在微小差异

九、总结

通过geomval类型,PostGIS 实现栅格数据与矢量数据的灵活转换与融合,为结合栅格值属性的空间分析提供了强大工具。合理使用该类型,结合ST_Intersection、ST_DumpAsPolygons等函数能有效解决栅格 - 矢量混合分析场景中的数据交互问题。