一、类型定义与结构
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等函数能有效解决栅格 - 矢量混合分析场景中的数据交互问题。