ST_Reclassify

ST_Reclassify函数返回一个raster对象。 结果对象空间参考、分辨率与原始影像相同,波段数量通过reclassexpr进行指定。

语法

raster ST_Reclassify(raster raster_obj,
        cstring reclassexpr default NULL
         cstring storageOption default '')

参数

参数名称

描述

raster_obj

需要重分类的raster对象。

reclassexpr

JSON字符串用于表示分类数值区间。

storageOption

JSON字符串表示的返回结果的存储选项。

reclassexpr为JSON字符串数组,每个子JSON对象指明波段操作参数, 参数如下。

参数名称

描述

类型

默认值

说明

band

波段序号。

integer

波段序号,从0开始。

remap

分类采用的参数。

object

-

-

nodata

是否使用nodata。

boolean

false

  • 如果为true,像素值为nodata,则分类结果也为nodata。

  • 如果为false,则作为普通数值进行计算。

nodataValue

nodata值。

float8

0

新的nodata值。

remap表示如何将原始像素值映射到新像素值。

  • 键表示原始像素值范围,可以由一个或多个数值构成,中间用英文逗号(,)进行分隔 。起始和结束可以指定开闭域关系。

    • ( 表示大于

    • ) 表示小于

    • ] 表示小于等于

    • [ 表示大于等于

    默认为(]

  • 值表示新旧像元值映射的结果,可以有一个或多个数值构成,中间用英文逗号(,)进行分隔 。

  • 映射方式包含三种:

    • range --> range: 原始像素范围和新像素范围数值个数一致,;例如"300,400,500":"80,90,100", "[300,400,500]":"80,90,100"。

    • range --> value: 原始像素范围比新像素范围数值个数多一个,例如"(300,400,500]":"80,90"。

    • value --> value: 原始像素范围和新像素范围数值都为一个,例如"10":"1"。

  • 像素值不属于任何映射范围,则会被归纳到nodata。

  • 同一个像素值不允许被多个范围包含。

  • 示例

    • 示例1

      以下表示对波段0进行Reclassify操作:

      if 0<old_value<=100
          new_value = 20
      else if100<old_value<=200
          new_value = 50
      else
          new_value = 0
      [ 
         { 
            "band":0,
            "remap":{ 
                  "(0,100,200]":"20,50"
            }
         }
      ]
    • 示例2

      支持多个分段值,不落入该区域的设置为nodata:

      [ 
         { 
            "band":0,
            "remap":{ 
                  "(0,100,200]":"20,50",
                  "(300,400,500]":"80,90,100"
            }
         }
      ]
    • 示例3

      以下表示对波段0进行Reclassify操作:

      if 0<old_value<=100
          new_value = 20
      else if100<old_value<=200
          new_value = 50
      else
          new_value = 999

      以及对波段1的Reclassify操作:

      if 400<old_value<=600
          new_value = 20+(old_value-400)/200 * (90-20)
      else if600<old_value<=800
          new_value = 90+(old_value-600)/200 * (130-90)
      else
          new_value = 0
      [ 
         { 
            "band":0,
            "remap":{
               "(0,100,200]":"20,50"
            },
            "nodata":true,
            "nodataValue":999
         },
         { 
            "band":1,
            "remap":{
              "(400,600,800]":"20,90,130"
            },
            "nodata":false,
            "nodataValue":0
         }
      ]

storageOption参数如下。

参数名称

描述

类型

默认值

说明

chunking

是否使用分块存储。

boolean

和原始raster一致

-

chunkdim

分块的维度信息。

string

和原始raster一致

在chunking=true时才有效。

chunktable

分块表名称。

string

''

如果传入''值,则会产生一个随机表名临时块表用于存放数据。 该临时表只在当前会话中有效。如果需要保持一个可访问的裁剪对象,则需要指定块表名称。

compression

压缩算法类型。

string

和原始raster一致

目前只支持none、jpeg、zlib、png、lzo和lz4。

quality

压缩质量。

integer

和原始raster一致

只针对jpeg压缩算法。

interleaving

交错方式。

string

和原始raster一致

必须是以下一种:

  • bip:Band interleaved by pixel

  • bil:Band nterleaved by pixel

  • bsq:Band Sequential

endian

字节序。

string

和原始raster一致

必须为以下其中之一:

  • NDR:Little endian

  • XDR:Big endian

celltype

像素类型。

string

和原始raster一致

-

示例

-- 永久表
CREATE TABLE rast_reclassify_result(id integer, rast raster);
-- 临时表
CREATE TEMP TABLE rast_reclassify_result_temp(id integer, rast raster);

-- 存放到临时表中
INSERT INTO rast_reclassify_result_temp(id, rast) 
select 1, ST_Reclassify(rast, '[{"band":0,"remap":{"(0,100,200]":"20,50"}}]') 
from reclass_table