欢迎光临
我们一直在努力

PostGIS实现栅格数据地理配准【ST_SetGeoReference】等六大函数

全部文章内容请转公众号【时空智能计算】及交流群867520770,原创不易,求关注支持,更多开源GIS相关知识技能分享,免费提供学习问答交流。

本文全面详细介绍PostGIS处理栅格数据的地理配准相关函数,包括栅格数据的坐标系、起点、像素尺度、旋转倾斜等参数设置,ST_SetGeoReference、ST_SetRotation、ST_SetSRID、ST_SetScale、ST_SetSkew、ST_SetUpperLeft等六个核心函数。

一、ST_SetGeoReference

ST_SetGeoReference 是 PostGIS 中用于配置栅格数据 6 个核心地理配准参数的函数,决定了栅格在地理空间中的位置、像素尺度、旋转、倾斜等属性。

(一)核心原理

  • 函数语法(两种变体)
  • — 变体1:文本格式(支持GDAL/ESRI格式)
    raster ST_SetGeoReference(raster rast, text georefcoords, text format=GDAL);

    — 变体2:数值参数(精准指定6个参数,2.1.0+新增)
    raster ST_SetGeoReference(raster rast, double precision upperleftx, double precision upperlefty, double precision scalex, double precision scaley, double precision skewx, double precision skewy);

  • 地理配准 6 参数的意义
  • 栅格的地理配准本质是通过 6 个参数建立 “像素坐标” 与 “地理坐标” 的映射关系,这 6 个参数是:

    参数名核心意义
    upperleftx 栅格左上角像素的地理 X 坐标(横轴)
    upperlefty 栅格左上角像素的地理 Y 坐标(纵轴)
    scalex 每个像素在 X 方向的地理尺度(像素宽度对应的地理单位,正 / 负表示方向)
    scaley 每个像素在 Y 方向的地理尺度(像素高度对应的地理单位,正 / 负表示方向)
    skewx X 方向的倾斜 / 旋转系数(非 0 表示栅格旋转,通常为 0)
    skewy Y 方向的倾斜 / 旋转系数(非 0 表示栅格旋转,通常为 0)

    ST_SetGeoReference 的核心作用是批量设置这 6 个参数,替代逐个调用ST_SetUpperLeftX、ST_SetScaleX等单参数函数,提升效率。

    (二)关键参数

  • 核心参数解析
  • 参数名类型说明
    rast raster 待设置地理配准的栅格对象(必填)
    georefcoords text 变体 1 专用:6 个参数的文本字符串,以空格分隔(缺少则返回 NULL)
    format text 变体 1 专用:配准格式,可选GDAL(默认)/ESRI,决定坐标计算逻辑
    upperleftx double precision 变体 2 专用:直接指定左上角 X 坐标
    upperlefty double precision 变体 2 专用:直接指定左上角 Y 坐标
    scalex double precision 变体 2 专用:X 方向像素尺度
    scaley double precision 变体 2 专用:Y 方向像素尺度
    skewx double precision 变体 2 专用:X 方向倾斜系数
    skewy double precision 变体 2 专用:Y 方向倾斜系数
  • GDAL vs ESRI 格式核心差异
  • 两种格式的参数顺序完全相同,但upperleftx/upperlefty的计算逻辑不同(这是最容易错误的点):

    格式参数顺序(文本字符串)upperleftx/upperlefty 计算逻辑
    GDAL scalex skewy skewx scaley upperleftx upperlefty 直接使用传入的upperleftx/upperlefty作为栅格左上角像素的地理坐标
    ESRI scalex skewy skewx scaley upperleftx upperlefty 传入的upperleftx/upperlefty是像素中心的坐标,需转换为像素左上角坐标:实际upperleftx = 传入值 – scalex×0.5 ;实际upperlefty = 传入值 – scaley×0.5

    示例对比:

    若传入文本’10 0 0 -10 5.1 -4.9’(ESRI 格式):

    • scalex=10,scaley=-10
    • 实际 upperleftx = 5.1 – 10×0.5 = 0.1
    • 实际 upperlefty = -4.9 – (-10)×0.5 = 0.1
    • 最终效果与 GDAL 格式’10 0 0 -10 0.1 0.1’一致(示例中因浮点精度显示为 0.0999999999999996)。

    (三)使用场景

  • 校正栅格地理配准偏差
  • 当栅格的空间位置偏移时,通过该函数批量调整 6 个参数,修正地理坐标映射:

    — 校正遥感影像的地理配准偏差(GDAL格式)
    UPDATE satellite_img
    SET rast = ST_SetGeoReference(rast, '10 0 0 -10 100.5 200.8', 'GDAL')
    WHERE rid = 1;

  • 统一多源栅格的地理参考
  • 将不同来源、不同尺度的栅格统一为相同的地理配准参数,便于拼接 / 叠加分析:

    — 批量设置所有栅格为相同的地理配准(数值参数变体)
    UPDATE raster_collection
    SET rast = ST_SetGeoReference(rast, 100, 200, 5, 5, 0, 0)
    WHERE srid = 4326;

  • 导入外部栅格后的配准
  • 从 GDAL/ESRI 格式的栅格文件导入数据后,按源文件的配准参数还原空间位置:

    — 从ESRI格式的文本参数还原地理配准
    SELECT ST_SetGeoReference(rast, '5 0 0 -5 105.2 305.8', 'ESRI') AS registered_rast
    FROM imported_raster;

    (四)注意事项

  • 外部波段的风险
  • 若栅格包含数据库外存储的波段(如外部文件),修改地理参考可能导致无法访问外部数据。解决方案:修改前先通过ST_AddBand将外部波段转为数据库内存储,或确认外部文件的地理参考与新参数兼容。

  • 格式选择的易错点
    • 不要混淆 GDAL/ESRI 格式的坐标逻辑,尤其是 ESRI 格式的upperleftx/upperlefty是像素中心坐标,需提前转换;
    • 优先使用数值参数变体,避免文本格式的解析错误,且参数含义更直观。
  • 倾斜系数(skewx/skewy)的使用
    • 大部分场景下 skewx/skewy 为 0(栅格无旋转),仅在处理倾斜 / 旋转栅格时设置;
    • 非 0 倾斜系数会导致栅格像素不再是轴对齐,可能增加后续空间分析的计算开销。
  • 浮点精度问题
    • 示例中 rid=2 的结果出现0.0999999999999996而非精确 0.1,是浮点运算的正常现象,可通过ROUND函数修正显示:

    SELECT rid, ROUND((ST_Metadata(rast)).upperleftx, 1) AS upperleftx FROM foo;

    (五)最佳实践

  • 优先使用数值参数变体
  • 数值参数无需解析文本,避免格式错误,且参数顺序明确(upperleftx→upperlefty→scalex→scaley→skewx→skewy):

    — 推荐:数值参数(直观、无解析错误)
    ST_SetGeoReference(rast, 0.1, 0.1, 10, 10, 0, 0)

    — 不推荐:文本格式(需记忆参数顺序,易出错)
    ST_SetGeoReference(rast, '10 0 0 -10 0.1 0.1', 'GDAL')

  • 验证地理配准结果
  • 修改后通过ST_Metadata/ST_GeoReference验证参数是否正确:

    — 验证地理配准参数
    SELECT
    ST_GeoReference(rast) AS georef_text, — 返回文本格式的6参数
    (ST_Metadata(rast)).scalex,
    (ST_Metadata(rast)).upperleftx
    FROM raster_table;

  • 结合 SRID 设置
  • 地理配准后需设置正确的 SRID,否则栅格的地理坐标无空间参考意义:

    — 先设置地理配准,再设置SRID(WGS84)
    UPDATE raster_table
    SET rast = ST_SetSRID(ST_SetGeoReference(rast, 0.1, 0.1, 10, 10, 0, 0), 4326);

    二、ST_SetRotation

    1. 函数签名

    raster ST_SetRotation(raster rast, float8 rotation);

    2. 函数描述

    均匀旋转栅格,旋转以弧度为单位。

    三、ST_SetSRID

    1. 函数签名

    raster ST_SetSRID(raster rast, integer srid);

    2. 函数描述

    将栅格上的 SRID 设置为特定整数值。

    注意:此函数不会以任何方式转换栅格 – 它只是设置定义其当前所在坐标参考系统的空间参考的元数据。对于以后的转换很有用。

    四、ST_SetScale

    1. 函数签名

    raster ST_SetScale(raster rast, float8 xy);
    raster ST_SetScale(raster rast, float8 x, float8 y);

    2. 函数描述

    以坐标参考系为单位设置像素的 X 和 Y 大小。 数字单位/像素宽度/高度。 如果只传入一个单位,则假设 X 和 Y 是相同的数字。

    注意:ST_SetScale 与ST_Rescale 的不同之处在于 ST_SetScale 不会对栅格重新采样以匹配栅格范围。 它仅更改栅格的元数据(或地理参考)以纠正最初错误指定的缩放比例。 ST_Rescale 会生成具有不同宽度和高度的栅格,计算结果以适合输入栅格的地理范围。 ST_SetScale 不修改栅格的宽度或高度。

    五、ST_SetSkew

    1. 函数签名

    raster ST_SetSkew(raster rast, float8 skewxy);

    raster ST_SetSkew(raster rast, float8 skewx, float8 skewy);

    2. 函数描述

    设置地理参考 X 和 Y 倾斜(或旋转参数)。 如果只传入一个,则将X和Y设置为相同的值。

    六、ST_SetUpperLeft

    1. 函数签名

    raster ST_SetUpperLeft(raster rast, double precision x, double precision y);

    2. 函数描述

    将栅格像素左上角的值设置为投影的 X 和 Y 坐标。

    赞(0)
    未经允许不得转载:171主机测评 » PostGIS实现栅格数据地理配准【ST_SetGeoReference】等六大函数
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址