• 金仓数据库 KingbaseGIS 使用手册(8.11. 栅格处理函数)


    8.11. 栅格处理函数

    8.11.1. 地图代数函数

    8.11.1.1. ST_Clip

    ST_Clip — 返回输入几何对象修改后的栅格。如果波段没有指定,那么会处理所有的波段。如果参数crop没有指定或者值为TRUE,那么输出的栅格会被修改。

    用法

    raster ST_Clip(raster rast, integer[] nband, geometry geom,
       double precision[] nodataval=NULL, boolean crop=TRUE);
    raster ST_Clip(raster rast, integer nband, geometry geom,
       double precision nodataval, boolean crop=TRUE);
    raster ST_Clip(raster rast, integer nband, geometry geom, boolean crop);
    raster ST_Clip(raster rast, geometry geom,
       double precision[] nodataval=NULL, boolean crop=TRUE);
    raster ST_Clip(raster rast, geometry geom,
       double precision nodataval, boolean crop=TRUE);
    raster ST_Clip(raster rast, geometry geom, boolean crop);

    描述

    返回输入几何对象修改后的栅格。如果波段没有指定,那么会处理所有的波段。 函数ST_Clip函数返回的栅格必须对每一个修剪的面的每一个波段都有一个NODATA值。 如果没有提供任何值,输入的栅格也没有定义NODATA值,那么返回的结果栅格的NODATA值将被设定为函数ST_MinPossibleValue(ST_BandPixelTypband))的返回值。 当输入参数nodataval数组元素个数少于波段数时候,nodataval数组最后一个数组元素的值将被用于多出的剩余波段。 如果nodataval数组的元素个数多于波段数,那么多出的nodataval元素值将会被忽略掉。所有的函数变体都接受一个nodataval数组,也接受单个值并指定用于每一个波段。

    如果参数crop没有被指定,默认将取值为true,意义是输出栅格将被削平到几何对象和栅格边界相交的地方。

    如果输入参数crop值为false,返回的新栅格将和输入栅格rast有相同的边界。

    样例 : 1 band clipping

    -- here use Massachusetts aerial data available on MassGIS site MassGIS
    -- Aerial Orthos. Coordinates are in Mas-sachusetts State Plane Meters.
    -- Clip the first band of an aerial tile by a 20 meter buffer.
    
    SELECT ST_Clip(rast, 1,
    ST_Buffer(ST_Centroid(ST_Envelope(rast)),20)
    ) from aerials.bostonWHERE rid = 4;
    
    -- Demonstrate effect of crop on final dimensions of raster
    -- 注意 how final extent is clipped to that of the geometry
    -- if crop = true
    
    SELECT ST_XMax(ST_Envelope(ST_Clip(rast, 1, clipper, true))) As xmax_w_trim,
    ST_XMax(clipper) As xmax_clipper,
    ST_XMax(ST_Envelope(ST_Clip(rast, 1, clipper, false))) As xmax_wo_trim,
    ST_XMax(ST_Envelope(rast)) As xmax_rast_orig
    FROM (SELECT rast, ST_Buffer(ST_Centroid(ST_Envelope(rast)),6) As
    clipper
    FROM aerials.boston
    WHERE rid = 6) As foo;
    
    xmax_w_trim       | xmax_clipper     | xmax_wo_trim     | xmax_rast_orig
    ------------------+------------------+------------------+------------------
    230657.436173996  | 230657.436173996 | 230666.436173996 | 230666.436173996

    样例 : 1 band clipping with no crop and add back other bands unchanged

    -- Same example as before,
    -- but we need to set crop to false to be able to use ST_AddBand
    -- because ST_AddBand requires all bands be the same Width and height
    
    SELECT ST_AddBand(ST_Clip(rast, 1,
    ST_Buffer(ST_Centroid(ST_Envelope(rast)),20),false
    ), ARRAY[ST_Band(rast,2),ST_Band(rast,3)] ) from aerials.boston
    WHERE rid = 6;

    样例 : Clip all bands

    -- Clip all bands of an aerial tile by a 20 meter buffer.
    -- Only difference is we don’t specify a specific band to clip
    -- so all bands are clipped
    
    SELECT ST_Clip(rast,
    ST_Buffer(ST_Centroid(ST_Envelope(rast)), 20),false
    ) from aerials.boston
    WHERE rid = 4;

    参考

    ST_AddBand, ST_MapAlgebra, ST_Intersection

    8.11.1.2. ST_ColorMap

    ST_ColorMap —根据输入的源栅格和一个指定的波段,创建一个新的最多4个8BUI(grayscale,RGB,RGBA模式)波段的栅格。如果没有指定波段,那么默认为波段1。

    用法

    raster ST_ColorMap(raster rast, integer nband=1,
       text colormap=grayscale, text method=INTERPOLATE);
    raster ST_ColorMap(raster rast, text colormap, text method=INTERPOLATE);

    描述

    把颜色表映射到一个栅格的波段位置为输入参数nband的波段,生成一个最多由4个8BUI波段组成的新栅格。 新栅格的8BUI波段数是由颜色表的色彩组成类别数决定的。如果没有指定nband的值,那么默认取值为1。 参数colormap可以是colormap预定于的关键字或者颜色组成的字符串。有效的预定义颜色关键字如下:

    • grayscale 或 greyscale 用于定义包含一个灰度8BUI波段的栅格。

    • pseudocolor 用于定义包含从蓝色到绿色到红色渐变的4个8BUI(RGBA)波段的栅格。

    • fire 用于定义包含从黑色到红色到浅黄色渐变的4个8BUI(RGBA)波段的栅格。

    • bluered 用于定义包含从蓝色到浅黄色到红色渐变的4个8BUI(RGBA)波段的栅格。

    用户可以传递多行记录(每一行表示一条记录)的颜色值来自定义colormap参数。 每一条记录通常包含5个值:像素值和对应的Red、Green、Blue、Alpha 成分(颜色成分值在0到255范围内)。 百分比也可以用于代替像素值,范围在0%到100%内,分别是栅格波段中最小和最大的值。 每一行值可以用如下分隔符进行分隔:逗号(’,’)、TAB符号、冒号 (’:’) 和 / 或空格符号。 像素值可以被设定为nv, null 或 nodata。一个样例如下:

    5 0 0 0 255

    4 100:50 55 255

    1 150,100 150 255

    0% 255 255 255 255

    nv 0 0 0 0

    colormap参数的语法和GDAL定义的颜色值语法相似GDAL gdaldem。

    可选有效的方法关键字如下:

    • INTERPOLATE 使用线性插值法,把给定像素值范围内的颜色进行平滑变化。

    • EXACT 严格匹配输入参数colormap中的像素值,如果像素值不匹配提供的colormap,那么像素值会被设定为0 0 0 0(RGBA)。

    • NEAREST 使用那些最贴近像素值的那些colormap记录。

    注意

    一个很不错的颜色表请参考: ColorBrewer。

    样例

    -- This is a junk table to play with
    -- setup test raster table --
    
    DROP TABLE IF EXISTS funky_shapes;
    CREATE TABLE funky_shapes(rast raster);
    INSERT INTO funky_shapes(rast)
    WITH ref AS (
    SELECT ST_MakeEmptyRaster( 200, 200, 0, 200, 1, -1, 0, 0) AS rast
    )
    SELECT
    ST_Union(rast)
    FROM (
    SELECT
    ST_AsRaster(
    ST_Rotate(
    ST_Buffer(
    ST_GeomFromText('LINESTRING(0 2,50 50,150 150,125 50)'),
    i*2
    ),
    pi() * i * 0.125, ST_Point(50,50)
    ),
    ref.rast, '8BUI'::text, i * 5
    ) AS rast
    FROM ref
    CROSS JOIN generate_series(1, 10, 3) AS i
    ) AS shapes;
    
    SELECT
    ST_NumBands(rast) As n_orig,
    ST_NumBands(ST_ColorMap(rast,1,
    ST_NumBands(ST_ColorMap(rast,1,
    ST_NumBands(ST_ColorMap(rast,1,
    ST_NumBands(ST_ColorMap(rast,1,
    ST_NumBands(ST_ColorMap(rast,1,
    'greyscale')) As ngrey,
    'pseudocolor')) As npseudo,
    'fire')) As nfire,
    'bluered')) As nbluered,
    '
    100% 255 0 0
    80% 160 0 0
    50% 130 0 0
    30% 30 0 0
    20% 60 0 0
    0% 0 0 0
    nv 255 255 255
    ')) As nred
    FROM funky_shapes;
    
    n_orig  | ngrey | npseudo | nfire | nbluered | nred
    --------+-------+---------+-------+----------+------
    1       | 1     | 4       | 4     | 4        | 3

    样例 : Compare different color map looks using ST_AsPNG

    SELECT
    ST_AsPNG(rast) As orig_png,
    ST_AsPNG(ST_ColorMap(rast,1,'greyscale')) As grey_png,
    ST_AsPNG(ST_ColorMap(rast,1, 'pseudocolor')) As pseudo_png,
    ST_AsPNG(ST_ColorMap(rast,1, 'nfire')) As fire_png,
    ST_AsPNG(ST_ColorMap(rast,1, 'bluered')) As bluered_png,
    ST_AsPNG(ST_ColorMap(rast,1, '
    100% 255 0 0
    80% 160 0 0
    50% 130 0 0
    30% 30 0 0
    20% 60 0 0
    0% 0 0 0
    nv 255 255 255
    ')) As red_png
    FROM funky_shapes;

    参考

    ST_AsPNG, ST_AsRaster ST_MapAlgebra, ST_NumBands, ST_Reclass, ST_SetBandNoDataValue, ST_Union

    8.11.1.3. ST_Intersection

    ST_Intersection —返回一个栅格或者几何对象-像素值键值对的集合,返回结果表示两个栅格共同部分或者栅格矢量化后与几何对象相交的结果。

    用法

    setof geomval ST_Intersection(geometry geom, raster rast, integer band_num=1);
    setof geomval ST_Intersection(raster rast, geometry geom);
    setof geomval ST_Intersection(raster rast, integer band_num, geometry geom);
    raster ST_Intersection(raster rast1, raster rast2, double precision[] nodataval);
    raster ST_Intersection(raster rast1, raster rast2, text returnband='BOTH',
       double precision[] nodataval=NULL);
    raster ST_Intersection(raster rast1, integer band_num1, raster rast2,
       integer band_num2, double precision[] nodataval);
    raster ST_Intersection(raster rast1, integer band_num1, raster rast2,
       integer band_num2, text returnband=’BOTH’, double precision[] nodataval=NULL);

    描述

    返回一个栅格或者几何对象-像素值键值对的集合,返回结果表示两个栅格共同部分或者栅格矢量化后与几何对象相交的结果。

    前3个函数变体,返回一个geomval集合,用于矢量空间处理。栅格首先(使用ST_DumpAsPolygon函数)矢量化成一个geomval记录集合。 然后这些记录再使用函数ST_Intersection(geometry,geometry)来进行交集处理。 与一个栅格包含NODATA值的面相交的几何对象返回一个空的几何对象。通常这样的记录可以通过使用ST_Intersect函数并在WHERE子句中过滤掉。 可以通过在表达式末尾添加.geom或.val的方式获取到几何对象和geomval记录集的数值部分,例如 (ST_Intersection(rast,geom)).geom 。

    其他函数变体返回一个栅格,适用于栅格空间。他们使用两个输入栅格的函数ST_MapAlgebraExpr来进行交集。

    返回栅格的边界是两个栅格边界进行几何相交的部分。返回栅格包含波段“BAND1”,"BAND2"或“BOTH”,这是由参数returnband传递什么值决定的。 输入参数中任意波段中的NODATA值的面在返回结果中每个波段的面依然是NODATA值。

    换句话说,任何像素与一个NODATA值的像素相交得到的结果是一个NODATA值的像素。

    ST_Intersection函数返回的栅格必须为没有相交的栅格平面指定一个NODATA值。 可以通过提供输入参数nodataval[]数组的值来定义或替换返回波段的nodata值,nodataval[]数组可以有1个或2个nodata值, 具体是几个取决于想要下面那些波段:’BAND1’, ’BAND2’ 或’BOTH’波段。 数组的第一个值替换第一个波段的nodata值,第二个值替换第二个波段的nodata值。

    如果一个输入的波段没有nodata值,并且没有提供nodataval数组值,那么会使用函数ST_MinPossibleValue来确认nodata值。 所有的函数变体都接受一个nodata值的数组也可以接受用于指定单个波段的单个值。

    上面的所有函数变体,如果没有指定波段,那么默认使用波段1。

    注意

    想要更多控制返回结果的边界或者关于遇到一个nodata值时返回什么,请参考输入参数是两个栅格的函数ST_MapAlgebraExpr。

    注意

    想要计算一个栅格波段和一个几何对象在栅格空间上的交集,使用函数ST_Clip。ST_Clip函数适用于多波段的栅格,但不返回对应栅格化几何对象的波段。

    注意

    ST_Intersection函数应该和函数ST_Intersects一起使用,栅格列和几何对象的列上都应该创建索引。

    样例: Geometry, Raster -- resulting in geometry vals

    SELECT
    foo.rid,
    foo.gid,
    ST_AsText((foo.geomval).geom) As geomwkt,
    (foo.geomval).val
    FROM (
    SELECT
    A.rid,
    g.gid,
    ST_Intersection(A.rast, g.geom) As geomval
    FROM dummy_rast AS A
    CROSS JOIN (
    VALUES
    (1, ST_Point(3427928, 5793243.85) ),
    (2, ST_GeomFromText(
          'LINESTRING(3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8)')),
    (3, ST_GeomFromText('LINESTRING(1 2, 3 4)'))
    ) As g(gid,geom)
    WHERE A.rid = 2
    ) As foo;
    
    rid|gid| geomwkt                                                         | val
    ---+---+-----------------------------------------------------------------+-----------------------
    2  | 1 | POINT(3427928 5793243.85)                                       | 249
    2  | 1 | POINT(3427928 5793243.85)                                       | 253
    2  | 2 | POINT(3427927.85 5793243.75)                                    | 254
    2  | 2 | POINT(3427927.8 5793243.8)                                      | 251
    2  | 2 | POINT(3427927.8 5793243.8)                                      | 253
    2  | 2 | LINESTRING(3427927.8 5793243.75,3427927.8 5793243.8)            | 252
    2  | 2 | MULTILINESTRING((3427927.8 5793243.8,3427927.8 5793243.75),...) | 250
    2  | 3 | GEOMETRYCOLLECTION EMPTY

    参考

    geomval, ST_Intersects, ST_MapAlgebraExpr, ST_Clip, ST_AsText

    8.11.1.4. ST_MapAlgebra

    ST_MapAlgebra — 回调函数的版本——根据输入的一个或多个栅格,波段位置和用户指定的回调函数,返回一个单波段的栅格。

    用法

    raster ST_MapAlgebra(rastbandarg[] rastbandargset, regprocedure callbackfunc,
       text pixeltype=NULL, text extenttype=INTERSECTIOraster customextent=NULL,
       integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
    raster ST_MapAlgebra(raster rast, integer[] nband, regprocedure callbackfunc,
       text pixeltype=NULL, text extenttype=FIRST,raster customextent=NULL,
       integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
    raster ST_MapAlgebra(raster rast, integer nband, regprocedure callbackfunc,
       text pixeltype=NULL, text extenttype=FIRST,raster customextent=NULL,
       integer distancex=0, integer distancey=0, text[] VARIADIC userargs=NULL);
    raster ST_MapAlgebra(raster rast1, integer nband1, raster rast2, integer nband2,
       regprocedure callbackfunc, text pixeltype=NULL,text extenttype=INTERSECTION,
       raster customextent=NULL, integer distancex=0, integer distancey=0,
       text[] VARIADIC user-args=NULL);

    描述

    回调函数的版本——根据输入的一个或多个栅格,波段位置和用户指定的回调函数,返回一个单波段的栅格。

    rast、rast1、rast2、rastbandargset 表示需要在地图代数处理过程中评估、计算的栅格。

    rastbandargset 参数允许地图代数算子在多栅格和/或多波段上进行使用。参考函数变体1的样例。

    nband、nband1、nband2 需要进行评估计算的栅格的波段数,nband可以是表示波段位置的整型或integer[]数组。对于2个栅格和2个波段的场景,nband1是栅格rast1的波段, nband2 是栅格rast2上的波段。

    callbackfunc 参数callbackfunc必须是SQL或SQL or PL/pgSQL 函数名,并且会被转换成regprocedure类型。

    PL/pgSQL 函数的样例如下:

    CREATE OR REPLACE FUNCTION sample_callbackfunc(value double precision[][][], position
    integer[][], VARIADIC userargs text[])RETURNS double precision
    AS $$
    BEGIN
    RETURN 0;
    END;
    $$ LANGUAGE 'plpgsql' IMMUTABLE;

    参数callbackfunc 必须有3个参数: 一个3维双精度数组,一个2维整型数组和一个variadic(可变的,pg的数组类型关键字)类型的1维text数组。

    第一个参数值是所有输入栅格的值集合。第3维是(下标从1开始):raster #, row y, column x。

    第二个是参数 position 是输出栅格和输入栅格的像素集的位置。 外维(下标从0开始)就是 raster #。外维下标0的位置是输出栅格的像素位置。 对于每一个外维度,在每一个内维度的X和Y都有两个元素。

    第三个参数用于传递用户任意指定的参数。

    传递一个regprocedure类型参数给一个SQL函数需要传递一个完整的函数名标识,然后转换成regprocedure类型。例如传递上面样例函数作为回调函数使用方法如下:

    'sample_callbackfunc(double precision[], integer[], text[])'::regprocedure

    注意这个回调函数参数包含了回调函数的函数名,函数参数类型,包围函数名和参数类型的单引号以及进行regprocedure的转换。

    pixeltype 如果传递了参数pixeltype,新栅格的波段将会是pixeltype类型。如果pixeltype传递为NULL值或省略了,新栅格的波段将会和第一个参数栅格的指定波段有相同的pixeltype类型 (对于边界类型有:INTERSECTION, UNION, FIRST, CUSTOM)或者合适栅格的指定波段(其边界类型为:SECOND,LAST)。如果对此有所疑问,那么在使用该函数就总是指定pixeltype类型好了。

    输出栅格的pixeltype值必须是函数ST_BandPixelType值的一种,或者省略或者设定为NULL。

    extenttype 可能的值是INTERSECTION (默认值), UNION, FIRST (对于单个栅格变量的函数变体,取这个默认值), SECOND, LAST, CUSTOM 。

    customextent 如果参数extentype 值是CUSTOM,必须要为参数customextent提供一个参数。参数函数变体1的样例4。

    distancex 参考栅格单元的以像素个数为单位计算的x方向距离。因此返回矩阵的宽度应该是2*distancex + 1。如果没有指定,将值考虑参考栅格单元本身(相邻的像素为0)。

    distancey 参考栅格单元的以像素个数为单位计算的y方向距离。因此返回矩阵的高度应该是2*distancey + 1。如果没有指定,将值考虑参考栅格单元本身(相邻的像素为0)。

    userargs 回调函数参数的第三个参数是一个variadic text型数组。所有的其他需要自定义添加的参数都通过这个参数来传递给指定的回调函数callbackfunc。

    注意

    关于关键字VARIADIC的信息,请参见 "SQL Functions with Variable Numbers of Arguments" section of Query Language (SQL) Functions 。

    注意

    回调函数必须要传递参数text[], 无论选择传递任意的一个参数给callbackfunction是否要进行处理。

    函数变体1接受一个rastbandarg数组,参数允许地图代数算子在多栅格和/或多波段上进行使用参考函数变体1的样例。

    函数变体2和3可以操作一个栅格的一个或多个波段。参考函数变体2和3的样例。

    函数变体4操作两个栅格并且每个栅格都有一个波段,参考函数变体4的样例。

    样例 : Variant 1

    以下样例都假设存在一个已定义的 sample_callbackfunc(double precision[], int[], text[]) 函数。

    -- One raster, one band
    WITH foo AS (
    SELECT 1 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI',
    1, 0) AS rast
    )
    SELECT
    ST_MapAlgebra(
    ARRAY[ROW(rast, 1)]::rastbandarg[],
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure
    ) AS rast
    FROM foo;
    
    -- One raster, several bands
    WITH foo AS (
    SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1,
    0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast
    )
    SELECT
    ST_MapAlgebra(
    ARRAY[ROW(rast, 3), ROW(rast, 1), ROW(rast, 3), ROW(rast, 2)]::rastbandarg[],
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure
    ) AS rast
    FROM foo
    
    -- Several rasters, several bands
    WITH foo AS (
    SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1,
    0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL
    SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1,
    0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast
    )
    SELECT
    ST_MapAlgebra(
    ARRAY[ROW(t1.rast, 3), ROW(t2.rast, 1), ROW(t2.rast, 3), ROW(t1.rast, 2)]::rastbandarg
    [],
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure
    ) AS rast
    FROM foo t1
    CROSS JOIN foo t2
    WHERE t1.rid = 1
    AND t2.rid = 2;
    
    -- Complete example of tiles of a coverage with neighborhood.
    WITH foo AS (
    SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL
    SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL
    SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL
    SELECT
    AS
    SELECT
    AS
    SELECT
    AS
    3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0)
    rast UNION ALL
    4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0)
    rast UNION ALL
    5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0)
    rast UNION ALL
    SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL
    SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL
    SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast
    )
    SELECT
    t1.rid,
    ST_MapAlgebra(
    ARRAY[ROW(ST_Union(t2.rast), 1)]::rastbandarg[],
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure,
    '32BUI',
    'CUSTOM', t1.rast,
    1, 1
    ) AS rast
    FROM foo t1
    CROSS JOIN foo t2
    WHERE t1.rid = 4
    AND t2.rid BETWEEN 0 AND 8
    AND ST_Intersects(t1.rast, t2.rast)
    GROUP BY t1.rid, t1.rast;
    
    -- Examples like the prior one for tiles of a coverage with neighborhood.
    WITH src AS (
    SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0) AS rast UNION ALL
    SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, 0, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0) AS rast UNION ALL
    SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, 0, 1, -1, 0, 0, 0), 1, '16BUI', 3, 0) AS rast UNION ALL
    SELECT
    AS
    SELECT
    AS
    SELECT
    AS
    3, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -2, 1, -1, 0, 0, 0), 1, '16BUI', 10, 0)
    rast UNION ALL
    4, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -2, 1, -1, 0, 0, 0), 1, '16BUI', 20, 0)
    rast UNION ALL
    5, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -2, 1, -1, 0, 0, 0), 1, '16BUI', 30, 0)
    rast UNION ALL
    SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, -4, 1, -1, 0, 0, 0), 1, '16BUI', 100, 0) AS rast UNION ALL
    SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, 2, -4, 1, -1, 0, 0, 0), 1, '16BUI', 200, 0) AS rast UNION ALL
    SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, 4, -4, 1, -1, 0, 0, 0), 1, '16BUI', 300, 0) AS rast
    )
    WITH foo AS (
    SELECT
    t1.rid,
    ST_Union(t2.rast) AS rast
    FROM src t1
    JOIN src t2
    ON ST_Intersects(t1.rast, t2.rast)
    AND t2.rid BETWEEN 0 AND 8
    WHERE t1.rid = 4
    GROUP BY t1.rid
    ), bar AS (
    SELECT
    t1.rid,
    ST_MapAlgebra(
    ARRAY[ROW(t2.rast, 1)]::rastbandarg[],
    'raster_nmapalgebra_test(double precision[], int[], text[])'::regprocedure,
    '32BUI',
    'CUSTOM', t1.rast,
    1, 1
    ) AS rast
    FROM src t1
    JOIN foo t2
    ON t1.rid = t2.rid
    )
    SELECT
    rid,
    (ST_Metadata(rast)),
    (ST_BandMetadata(rast, 1)),
    ST_Value(rast, 1, 1, 1)
    FROM bar;

    样例 : Variants 2 and 3

    One raster, several bands
     WITH foo AS(
      SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2,2,0,0,1,-1,0,0,0),1,'16BUI',1,0),2,'8BUI',10,0),3,'32BUI',100,0) AS rast
    )
    SELECT
      ST_MapAlgebra(
         rast,ARRAY[3,1,3,2]::integer[],
         'sample_callbackfunc(double precision[],int[], text[])'::regprocedure
    )AS rast
    FROM foo;
    
    One raster, one band
    
    WITH foo AS (
    SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1,
    0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast
    )
    SELECT
    ST_MapAlgebra(
    rast, 2,
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure
    ) AS rast
    FROM foo;

    样例 : Variant 4

    Two rasters, two bands
    WITH foo AS (
    SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0)
    AS rast UNION ALL
    SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0)
    AS rast
    )
    SELECT
    ST_MapAlgebra(
    t1.rast, 2,
    t2.rast, 1,
    'sample_callbackfunc(double precision[], int[], text[])'::regprocedure
    ) AS rast
    FROM foo t1
    CROSS JOIN foo t2
    WHERE t1.rid = 1
    AND t2.rid = 2;

    参考

    rastbandarg, ST_Union, ST_MapAlgebra

    8.11.1.5. ST_MapAlgebra

    ST_MapAlgebra —带有SQL表达式参数expression的函数版本。根据一个或更多输入的栅格、波段以及一个或更多用户自定义的SQL表达式。

    用法

    raster ST_MapAlgebra(raster rast, integer nband, text pixeltype,
       text expression, double precision nodataval=NULL);
    raster ST_MapAlgebra(raster rast, text pixeltype,
       text expression, double precision nodataval=NULL);
    raster ST_MapAlgebra(raster rast1, integer nband1, raster rast2, integer nband2,
       text expression, text pixeltype=NULL, textextenttype=INTERSECTION,
       text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
    raster ST_MapAlgebra(raster rast1, raster rast2,
       text expression, text pixeltype=NULL, text extenttype=INTERSECTION,
       textnodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);

    描述

    带有SQL表达式参数expression的函数版本。根据一个或更多输入的栅格、波段以及一个或更多用户自定义的SQL表达式。

    函数变体1和变体2(处理一个栅格的函数变体)根据加在输入栅格rast参数上的一个有效的KingbaseESSQL表达式,创建一个新的单波段栅格。 如果没有提供参数nband,那么指定为波段1。新栅格将会和原始的输入栅格有相同的空间参考,宽度和高度,但是只会包含一个波段。 如果传递了参数pixeltype,那么新的栅格波段将会有一个波段的pixeltpye和传递参数值一样;如果传递的为NULL,那么新栅格的波段的pixeltype和输入栅格波段一样。

    表达式允许的关键字如下:

    1. [rast] –感兴趣的像素的像素值。

    2. [rast.val] –感兴趣像素的像素值。

    3. [rast.x] –感兴趣的像素的下标从1开始的像素的列位置。

    4. [rast.y] -感兴趣的像素的下标从1开始的像素的行位置。

    函数变体3和4(应用于两个栅格)根据加在两个输入栅格rast1和rast2参数上的一个有效的KingbaseESSQL表达式,创建一个新的单波段栅格。 如果没有指定band1和band2参数,那么默认取波段1。返回的栅格对齐方式会按照第一个输入栅格的参数(scale, skew 和 pixel corners)进行对齐。 返回栅格将会的边界是由extenttype参数定义的。

    expression 一个KingbaseES的算术表达式,用算术运算符把两个栅格连接起来,如果两个像素相交,那么像素值的定义可以如下:(([rast1] + [rast2])/2.0)::integer。

    pixeltype 定义输出栅格的像素类型(pixel type),该参数的值必须是定义在函数ST_BandPixelType的值输出范围内的,定义时候也可以省略或者设置为NULL。如果没有传递该值或者定义位NULL,默认的像素类型和第一个输入栅格像素类型一致。

    extenttype 控制输出栅格的边界结合方式。

    1. INTERSECTION –新栅格的边界是两个输入栅格的交集,这是默认的方式。

    2. UNION –新栅格的边界是两个输入栅格的并集。

    3. FIRST –新栅格的边界和第一个栅格的边界相同。

    4. SECOND –新栅格的边界和第二个栅格的边界相同。

    nodata1expr 一个只包含rast2或一个常量的代数表达式,用于定义当rast1栅格的像素都是NODATA值的,而rast2的像素却是有值的时候,该返回该表达式的值。

    nodata2expr 一个只包含rast1或一个常量的代数表达式,用于定义当rast2栅格的像素都是NODATA值的,而rast1的像素却是有值的时候,该返回该表达式的值。

    nodatanodataval 一个numeric常量,用于定义当rast1和rast2的像素都是NODATA值时候,返回这个常量。

    参数expression, nodata1expr 和 nodata2expr允许的关键字如下:

    1. [rast1] –栅格rast1的感兴趣的像素的像素值。

    2. [rast1.val] -栅格rast1的感兴趣的像素的像素值。

    3. [rast1.x] –栅格rast1的感兴趣的像素的的列位置,下标从1开始。

    4. [rast1.y] -栅格rast1的感兴趣的像素的的行位置,下标从1开始。

    5. [rast2] -栅格rast2的感兴趣的像素的像素值。

    6. [rast2.val] -栅格rast2的感兴趣的像素的像素值。

    7. [rast2.x] -栅格rast2的感兴趣的像素的的列位置,下标从1开始。

    8. [rast2.y] -栅格rast2的感兴趣的像素的的行位置,下标从1开始。

    样例: Variants 1 and 2

    WITH foo AS (
        SELECT ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 1, 1, 0, 0, 0), '32BF', 1, -1) AS rast
    )
    SELECT
         ST_MapAlgebra(rast, 1, NULL, 'ceil([rast]*[rast.x]/[rast.y]+[rast.val])')
    FROM foo;

    样例: Variant 3 and 4

    WITH foo AS (
        SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL
        SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast
    )
    SELECT
        ST_MapAlgebra(
           t1.rast, 2,
           t2.rast, 1,
           '([rast2] + [rast1.val]) / 2'
        ) AS rast
    FROM foo t1
    CROSS JOIN foo t2
    WHERE t1.rid = 1
    AND t2.rid = 2;

    参考

    rastbandarg, ST_Union, ST_MapAlgebra

    8.11.1.6. ST_MapAlgebraExpr

    ST_MapAlgebraExpr —输入参数是1个波段的函数版本。 根据一个用户定义在输入栅格波段和pixeltype值的KingbaseES代数表达式,生成一个带有一个波段的栅格。 如果没有指定波段是哪个,默认取波段1。

    用法

    raster ST_MapAlgebraExpr(raster rast, integer band, text pixeltype,
       text expression, double precision nodataval=NULL);
    raster ST_MapAlgebraExpr(raster rast, text pixeltype,
       text expression, double precision nodataval=NULL);

    描述

    在参数expression中可以使用表达式 [rast] 来引用原始输入波段的像素值,使用表达式 [rast.x] 来引用下标从1开始的像素列的位置,使用表达式[rast.y]来引用下标从1开始的像素行的位置。

    样例

    -- Create a new 1 band raster from our original
    -- that is a function of modulo 2 of the original raster band.
    ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
    UPDATE dummy_rast SET map_rast = ST_MapAlgebraExpr(rast,NULL,'mod([rast],2)') WHERE rid = 2;
    
    SELECT
    ST_Value(rast,1,i,j) As origval,
    ST_Value(map_rast, 1, i, j) As mapval
    FROM dummy_rast
    CROSS JOIN generate_series(1, 3) AS i
    CROSS JOIN generate_series(1,3) AS j
    WHERE rid = 2;
    
    origval  | mapval
    ---------+--------
    253      | 1
    254      | 0
    253      | 1
    253      | 1
    254      | 0
    254      | 0
    250      | 0
    254      | 0
    254      | 0
    
    -- Create a new 1 band raster of pixel-type 2BUI from our original
    -- that is reclassified and set the nodata value to be 0.
    ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
    UPDATE dummy_rast SET
    map_rast2 = ST_MapAlgebraExpr(rast,'2BUI',
       'CASE WHEN [rast] BETWEEN 100 and 250 THEN 1 WHEN [rast] = 252 THEN 2 WHEN [rast] BETWEEN 253 and 254 THEN 3 ELSE 0 END',
       '0')
    WHERE rid = 2;
    
    SELECT DISTINCT
    ST_Value(rast,1,i,j) As origval,
    ST_Value(map_rast2, 1, i, j) As mapval
    FROM dummy_rast
    CROSS JOIN generate_series(1, 5) AS i
    CROSS JOIN generate_series(1,5) AS j
    WHERE rid = 2;
    
    origval | mapval
    --------+--------
    249     | 1
    250     | 1
    251     |
    252     | 2
    253     | 3
    254     | 3
    
    SELECT
    ST_BandPixelType(map_rast2) As b1pixtyp
    FROM dummy_rast
    WHERE rid = 2;
    
    b1pixtyp
    ----------
    2BUI

    -- Create a new 3 band raster same pixel type from our original 3 band raster
    -- with first band altered by map algebra and remaining 2 bands unaltered.
    SELECT
    ST_AddBand(
    ST_AddBand(
    ST_AddBand(
    ST_MakeEmptyRaster(rast_view),
    ST_MapAlgebraExpr(rast_view,1,NULL,'tan([rast])*[rast]')
    ),
    ST_Band(rast_view,2)
    ),
    ST_Band(rast_view, 3) As rast_view_ma
    )
    FROM wind
    WHERE rid=167;

    参考

    ST_MapAlgebraExpr, ST_MapAlgebraFct, ST_BandPixelType, ST_GeoReference, ST_Value

    8.11.1.7. ST_MapAlgebraExpr

    ST_MapAlgebraExpr —输入参数是两个栅格波段的版本。 根据一个用户定义在两个输入参数栅格波段和pixeltype值的KingbaseES代数表达式,生成一个带有一个波段的栅格。 如果没有指定每一个栅格的波段是哪个,那么默认都取波段1。 输出栅格的对其方式(scale, skew and pixel corners)和第一个栅格参数相同,边界定义由参数"extenttype"定义,参数"extenttype"的值可以是: INTERSECTION, UNION, FIRST, SECOND。

    用法

    raster ST_MapAlgebraExpr(raster rast1, raster rast2, text expression,
       text pixeltype=same_as_rast1_band, text extenttype=INTERSECTtext,
       nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
    raster ST_MapAlgebraExpr(raster rast1, integer band1, raster rast2, integer band2,
       text expression, text pixeltype=same_as_rast1_band,text extenttype=INTERSECTION,
       text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);

    描述

    输入参数是两个栅格波段的版本。 根据一个用户定义在两个输入参数栅格波段和pixeltype值的KingbaseES代数表达式,生成一个带有一个波段的栅格。 如果没有指定每一个栅格的波段是哪个,那么默认都取波段1。 输出栅格的对其方式(scale, skewand pixel corners)和第一个栅格参数相同,边界定义由参数"extenttype"定义,参数"extenttype"的值可以是: INTERSECTION,UNION, FIRST, SECOND。

    expression 一个KingbaseES的算术表达式,用算术运算符把两个栅格连接起来,如果两个像素相交,那么像素值的定义可以如下:(([rast1] + [rast2])/2.0)::integer。

    pixeltype 定义输出栅格的像素类型(pixel type),该参数的值必须是定义在函数ST_BandPixelType的值输出范围内的,定义时候也可以省略或者设置为NULL。如果没有传递该值或者定义位NULL,默认的像素类型和第一个输入栅格像素类型一致。

    extenttype 控制输出栅格的边界结合方式。

    1. INTERSECTION –新栅格的边界是两个输入栅格的交集,这是默认的方式。

    2. UNION – 新栅格的边界是两个输入栅格的并集。

    3. FIRST – 新栅格的边界和第一个栅格的边界相同。

    4. SECOND – 新栅格的边界和第二个栅格的边界相同。

    nodata1expr 一个只包含rast2或一个常量的代数表达式,用于定义当rast1栅格的像素都是NODATA值的,而rast2的像素却是有值的时候,该返回该表达式的值。

    nodata2expr 一个只包含rast1或一个常量的代数表达式,用于定义当rast2栅格的像素都是NODATA值的,而rast1的像素却是有值的时候,该返回该表达式的值。

    nodatanodataval 一个numeric常量,用于定义当rast1和rast2的像素都是NODATA值时候,返回这个常量。

    如果传递了pixeltype参数值,那么新栅格将会有一个波段的像素值和传递的参数pixeltype值一样。 如果传递的是NULL或者没有指定pixeltype值,那么新栅格的波段将会和输入的栅格rast1的波段的pixeltype值一致。

    使用表达式 [rast1.val] [rast2.val] 来引用原始栅格波段的像素值,使用[rast1.x], [ras-t1.y] 来引用像素的行号和列号位置。

    样例: 2 Band Intersection and Union

    -- Create a new 1 band raster from our original
    -- that is a function of modulo 2 of the original raster band.
    -- Create a cool set of rasters --
    
    DROP TABLE IF EXISTS fun_shapes;
    CREATE TABLE fun_shapes(rid serial PRIMARY KEY, fun_name text, rast raster);
    
    -- Insert some cool shapes around Boston in Massachusetts state plane meters --
    
    INSERT INTO fun_shapes(fun_name, rast)
    VALUES ('ref', ST_AsRaster(ST_MakeEnvelope(235229, 899970, 237229,901930,26986),200,200,'8BUI',0,0));
    INSERT INTO fun_shapes(fun_name,rast)
    WITH ref(rast) AS (SELECT rast FROM fun_shapes WHERE fun_name = 'ref' )
    SELECT 'area' AS fun_name,
    ST_AsRaster(ST_Buffer(ST_SetSRID(ST_Point(236229, 900930),26986), 1000),ref.rast,'8BUI', 10, 0) As rast
    FROM ref UNION ALL
    SELECT 'rand bubbles',
    ST_AsRaster(
    (SELECT ST_Collect(geom)
    FROM (SELECT ST_Buffer(ST_SetSRID(ST_Point(236229 + i*random()*100,900930 + j*random()*100),26986), random()*20) As geom
    FROM generate_series(1,10) As i, generate_series(1,10) As j ) As foo ),ref.rast,'8BUI', 200, 0)
    FROM ref;
    
    --map them -
    SELECT ST_MapAlgebraExpr(area.rast, bub.rast, '[rast2.val]', '8BUI', 'INTERSECTION','[rast2.val]', '[rast1.val ]') As interrast,
    ST_MapAlgebraExpr(area.rast, bub.rast, '[rast2.val]', '8BUI', 'UNION', '[rast2.val]','[rast1.val]') As
    unionrast
    FROM
    (SELECT rast FROM fun_shapes WHERE
    fun_name = 'area') As area
    CROSS JOIN (SELECT rast
    FROM fun_shapes WHERE
    fun_name = 'rand bubbles') As bub;

    样例: Overlaying rasters on a canvas as separate bands

    -- we use ST_AsPNG to render the image so all single band ones look grey
    WITH mygeoms
    AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(1,5),10) As geom
    UNION ALL
    SELECT 3 AS bnum,
    ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 10,'join=bevel') As geom
    UNION ALL
    SELECT 1 As bnum,
    ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'), 5,'join=bevel') As geom ),
    
    -- define our canvas to be 1 to 1 pixel to geometry
    canvas
    AS (SELECT ST_AddBand(ST_MakeEmptyRaster(200, 200,
    ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0) , '8BUI'::text,0)
    As rast
    FROM (SELECT ST_Extent(geom) As e,
    Max(ST_SRID(geom)) As srid
    from mygeoms) As foo
    ),
    rbands AS (SELECT ARRAY(SELECT ST_MapAlgebraExpr(canvas.rast,
    ST_AsRaster(m.geom, canvas .rast, '8BUI', 100),'[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') As rast
    FROM mygeoms AS m CROSS JOIN canvas
    ORDER BY m.bnum) As rasts
    )
    SELECT rasts[1] As rast1 , rasts[2] As rast2, rasts[3] As rast3,
    ST_AddBand(
    ST_AddBand(rasts[1],rasts[2]), rasts[3]) As final_rastFROM rbands;

    样例: Overlay 2 meter boundary of select parcels over an aerial imagery

    -- Create new 3 band raster composed of first 2 clipped bands,
    -- and overlay of 3rd band with our geometry
    
    WITH pr AS
    (SELECT ST_Clip(rast,ST_Expand(geom,50) ) As rast, g.geom
    FROM aerials.o_2_boston AS r INNER JOIN
    
    -- union our parcels of interest so they form a single geometry we can later intersect with
    (SELECT ST_Union(ST_Transform(the_geom,26986)) AS geom
    FROM landparcels WHERE pid IN('0303890000', '0303900000')) As g
    ON ST_Intersects(rast::geometry, ST_Expand(g.geom,50))
    ),
    
    -- we then union the raster shards together
    -- ST_Union on raster is kinda of slow but much faster the smaller you can get the rasters
    -- therefore we want to clip first and then union
    prunion AS
    (SELECT ST_AddBand(NULL,
    ARRAY[ST_Union(rast,1),ST_Union(rast,2),ST_Union(rast,3)] ) As
    clipped,geomFROM pr
    GROUP BY geom)
    
    -- return our final raster which is the unioned shard with
    -- with the overlay of our parcel boundaries
    -- add first 2 bands, then mapalgebra of 3rd band + geometry
    SELECT
    ST_AddBand(ST_Band(clipped,ARRAY[1,2])
    , ST_MapAlgebraExpr(ST_Band(clipped,3),
    ST_AsRaster(ST_Buffer(ST_Boundary(geom),2), clipped, '8BUI',250),
    '[rast2.val]', '8BUI', 'FIRST', '[rast2.val]', '[rast1.val]') ) As rast
    FROM prunion;

    参考

    ST_MapAlgebraExpr, ST_AddBand, ST_AsPNG, ST_AsRaster, ST_MapAlgebraFct, ST_BandPixelType, ST_GeoReference,ST_Value, ST_Union, ST_Union

    8.11.1.8. ST_MapAlgebraFct

    ST_MapAlgebraFct —输入参数是1个波段的函数版本。根据一个用户定义在输入栅格波段和pixeltype值的KingbaseES函数,生成一个带有一个波段的栅格。如果没有指定波段是哪个,默认取波段1。

    用法

    raster ST_MapAlgebraFct(raster rast,
       regprocedure onerasteruserfunc);
    raster ST_MapAlgebraFct(raster rast,
       regprocedure onerasteruserfunc, text[] VARIADIC args);
    raster ST_MapAlgebraFct(raster rast, text pixeltype,
       regprocedure onerasteruserfunc);
    raster ST_MapAlgebraFct(raster rast, text pixeltype,
       regprocedure onerasteruserfunc, text[] VARIADIC args);
    raster ST_MapAlgebraFct(raster rast, integer band,
       regprocedure onerasteruserfunc);
    raster ST_MapAlgebraFct(raster rast, integer band,
       regprocedure onerasteruserfunc, text[] VARIADIC args);
    raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype,
       regprocedure onerasteruserfunc);
    raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype,
       regprocedure onerasteruserfunc, text[] VARIADIC args);

    描述

    根据一个用户定义在输入栅格波段和pixeltype值的KingbaseES函数(即参数onerasteruserfunc表示的函数名),生成一个带有一个波段的栅格。如果没有指定波段是哪个,默认取波段1。

    新栅格将会和原始的输入栅格有相同的空间参考,宽度和高度,但是只会包含一个波段。如果传递了参数pixeltype,那么新的栅格波段将会有一个波段的pixeltpye和传递参数值一样; 如果传递的为NULL,那么新栅格的波段的pixeltype和输入栅格波段一样。

    参数onerasteruserfunc必须是SQL或PL/pgSQL的函数名,然后转换成regprocedure类型。

    一个非常简单但也十分无用的PL/pgSQL 函数样例如下:

    CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[],
    VARIADIC args TEXT
    [])
    RETURNS FLOAT
    AS $$ BEGIN
    RETURN 0.0;
    END; $$
    LANGUAGE 'plpgsql' IMMUTABLE;

    参数userfunction对应的函数可能会接收2个或3个参数:一个float型值,一个可选的integer型数组,一个variadic text型数组。

    第一个参数是一个单独的栅格单元的值(不考虑栅格的数据类型)。第二个参数是当前处理单元的位置,格式是‘{x,y}’。

    第三个参数表示剩余的参数通过自定义函数userfunction传递给函数ST_MapAlgebraFct的参数。

    传递一个regprodedure 参数给一个SQL函数需要完整的函数名,然后转换成regprocedure类型。

    要想传递上述样例PL/pgSQL 函数,那么SQL语句中的参数用法如下:

    'simple_function(float,integer[],text[])'::regprocedure

    注意这个回调函数参数包含了回调函数的函数名,函数参数类型,包围函数名和参数类型的单引号以及进行regprocedure的转换。

    userfunction第三个参数是一个variadic text型数组。所有的其他需要传递到ST_MapAlgebraFct函数的自定义添加的参数都通过这个参数来传递给指定的userfunction。

    注意

    关于关键字VARIADIC的信息,请参考"SQL Functions with Variable Numbers of Arguments" section of Query Language (SQL) Functions 。

    注意

    回调函数必须要传递参数text[], 无论选择传递任意的一个参数给callbackfunction是否要进行处理。

    样例

    -- Create a new 1 band raster from our original
    -- that is a function of modulo 2 of the original raster band.
    ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
    CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[])
    RETURNS float
    AS $$
    BEGIN
    RETURN pixel::integer % 2;
    END;
    $$
    LANGUAGE 'plpgsql' IMMUTABLE;
    
    UPDATE dummy_rast SET map_rast =
    ST_MapAlgebraFct(rast,NULL,
       'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2;
    
    SELECT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast, 1, i, j) As mapval
    FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN
    generate_series(1,3) AS j
    WHERE rid = 2;
    
    origval  | mapval
    ---------+--------
    253      | 1
    254      | 0
    253      | 1
    253      | 1
    254      | 0
    254      | 0
    250      | 0
    254      | 0
    254      | 0
    
    -- Create a new 1 band raster of pixel-type 2BUI from our original
    -- that is reclassified and set the nodata value
    -- to a passed parameter to the user function (0).
    
    ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
    CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args
    text[])
    RETURNS floatAS $$ DECLARE
    nodata float := 0;
    BEGIN
    IF NOT args[1] IS NULL THEN
    nodata := args[1];
    END IF;
    IF pixel < 251 THEN
    RETURN 1;
    ELSIF pixel = 252 THEN
    RETURN 2;
    ELSIF pixel > 252 THEN
    RETURN 3;
    ELSE
    RETURN nodata;
    END IF;
    END;
    $$
    LANGUAGE 'plpgsql';
    
    UPDATE dummy_rast SET map_rast2 =
       ST_MapAlgebraFct(rast,'2BUI',
          'classify_fct(float,integer[],text[])'::regprocedure,
          '0') WHERE rid = 2;
    
    SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1,
    i, j) As mapval
    FROM dummy_rast
    CROSS JOIN generate_series(1, 5) AS i
    CROSS JOIN generate_series(1,5) AS j
    WHERE rid = 2;
    
    origval  | mapval
    ---------+--------
    249      | 1
    250      | 1
    251      |
    252      | 2
    253      | 3
    254      | 3
    
    SELECT ST_BandPixelType(map_rast2) As b1pixtyp
    FROM dummy_rast WHERE rid = 2;
    
    b1pixtyp
    ----------
    2BUI
    

    -- Create a new 3 band raster same pixel type from our original 3 band raster
    -- with first band altered by map algebra and remaining 2 bands unaltered.
    
    CREATE FUNCTION rast_plus_tan(pixel float, pos integer[], variadic args text[])
    RETURNS float
    AS
    $$
    BEGIN
    RETURN tan(pixel) * pixel;
    END;
    $$
    LANGUAGE 'plpgsql';

      SELECT ST_AddBand( ST_AddBand( ST_AddBand( ST_MakeEmptyRaster(rast_view), ST_MapAlgebraFct(rast_view,1,NULL, 'rast_plus_tan(float,integer[],text[])'::regprocedure) ), ST_Band(rast_view,2) ), ST_Band(rast_view, 3) As rast_view_ma ) FROM wind WHERE rid=167;

    参考

    ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue

    8.11.1.9. ST_MapAlgebraFct

    ST_MapAlgebraFct —输入参数是两个栅格波段的版本。根据一个用户定义在两个输入参数栅格波段和pixeltype值的KingbaseES函数,生成一个带有一个波段的栅格。 如果没有指定每一个栅格的波段是哪个,那么默认都取波段1。参数"extenttype"如果没有指定值,默认值是: INTERSECTION。

    用法

    raster ST_MapAlgebraFct(raster rast1, raster rast2,
       regprocedure tworastuserfunc, text pixeltype=same_as_rast1,
       text extenttype=INTERSECTION, text[] VARIADIC userargs);
    raster ST_MapAlgebraFct(raster rast1, integer band1, raster rast2, integer band2,
       regprocedure tworastuserfunc, text pixel-type=same_as_rast1,
       text extenttype=INTERSECTION, text[] VARIADIC userargs);

    描述

    根据一个用户定义在两个输入参数栅格rast1和rast2的KingbaseES函数tworastuserfunc处理结果,生成一个带有一个波段的栅格。 如果没有指定每一个栅格的波段是哪个,那么默认都取波段1。新栅格将会和原始的输入栅格有相同的空间参考,宽度和高度,但是只会包含一个波段。

    如果传递了参数pixeltype,那么新的栅格波段将会有一个波段的pixeltpye和传递参数值一样;如果传递的为NULL,那么新栅格的波段的pixeltype和输入栅格波段一样。

    参数onerasteruserfunc必须是SQL或PL/pgSQL的函数名,然后转换成regprocedure类型。

    一个PL/pgSQL函数样例如下:

    CREATE OR REPLACE FUNCTION simple_function_for_two_rasters(pixel1 FLOAT, pixel2 FLOAT, pos
    INTEGER[], VARIADIC args TEXT[])
    RETURNS FLOAT AS
    $$
    BEGIN
    RETURN 0.0;
    END;
    $$
    LANGUAGE 'plpgsql' IMMUTABLE;

    参数tworastuserfunc对应的函数可能会接收3个或4个参数:一个double型值,一个double型值,一个可选的integer型数组,一个variadic text型数组。 第一个参数是一个栅格rast1的单独栅格单元的值(不考虑栅格的数据类型)。第二个参数是一个栅格rast2的单独栅格单元的值。 第二个参数是当前处理单元的位置,格式是‘{x,y}’。 第四个参数表示剩余的参数通过自定义函数tworastuserfunc传递给函数ST_MapAlgebraFct, 传递一个regprodedure参数给一个SQL函数需要完整的函数名,然后转换成regprocedure类型。

    要想传递上述样例PL/pgSQL 函数,那么SQL语句中的参数用法如下:

    'simple_function(double precision, double precision, integer[], text[])'::regprocedure

    注意这个回调函数参数包含了回调函数的函数名,函数参数类型,包围函数名和参数类型的单引号以及进行regprocedure的转换。

    tworastuserfunc的第三个参数是一个variadictext型数组。 所有的其他需要传递到ST_MapAlgebraFct函数的自定义添加的参数都通过这个参数来传递给指定的函数tworastuserfunc。

    注意

    关于关键字VARIADIC的信息,请参考KingbaseES文档的章节"SQLFunctions with Variable Numbers of Arguments" section of Query Language (SQL) Functions 。

    注意

    回调函数必须要传递参数text[], 无论选择传递任意的一个参数给自定义的函数是否要进行处理。

    样例 : Overlaying rasters on a canvas as separate bands

    -- define our user defined function --
    CREATE OR REPLACE FUNCTION raster_mapalgebra_union(
    rast1 double precision,
    rast2 double precision,
    pos integer[],
    VARIADIC userargs text[]
    )
    RETURNS double precision
    AS
    $$
    DECLARE
    BEGIN
    CASE
    WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
    RETURN ((rast1 + rast2)/2.);
    WHEN rast1 IS NULL AND rast2 IS NULL THEN
    RETURN NULL;
    WHEN rast1 IS NULL THEN
    RETURN rast2;
    ELSE
    RETURN rast1;
    END CASE;
    RETURN NULL;
    END;
    $$
    LANGUAGE 'plpgsql' IMMUTABLE COST 1000;
    
    -- prep our test table of rasters
    DROP TABLE IF EXISTS map_shapes;
    CREATE TABLE map_shapes(rid serial PRIMARY KEY, rast raster, bnum integer, descrip text);
    
    INSERT INTO map_shapes(rast,bnum, descrip)
    WITH mygeoms
    AS ( SELECT 2 As bnum, ST_Buffer(ST_Point(90,90),30) As geom, 'circle' As descrip
    UNION ALL
    SELECT 3 AS bnum,
    ST_Buffer(ST_GeomFromText('LINESTRING(50 50,150 150,150 50)'), 15) As geom,
    'big road' As descrip
    UNION ALL
    SELECT 1 As bnum,
    ST_Translate(ST_Buffer(ST_GeomFromText('LINESTRING(60 50,150 150,150 50)'),
    8,'join=bevel'), 10,-6) As geom, 'small road' As descrip
    ),
    -- define our canvas to be 1 to 1 pixel to geometry
    canvas
    AS ( SELECT ST_AddBand(ST_MakeEmptyRaster(250,
    250,
    ST_XMin(e)::integer, ST_YMax(e)::integer, 1, -1, 0, 0 ) , '8BUI'::text,0) As rast
    FROM (SELECT ST_Extent(geom) As e,
    Max(ST_SRID(geom)) As srid
    from mygeoms
    ) As foo
    )
    -- return our rasters aligned with our canvas
    SELECT ST_AsRaster(m.geom, canvas.rast, '8BUI', 240) As rast, bnum, descrip
    FROM mygeoms AS m CROSS JOIN canvas
    UNION ALL
    SELECT canvas.rast, 4, 'canvas'
    FROM canvas;
    
    -- Map algebra on single band rasters and then collect with ST_AddBand
    INSERT INTO map_shapes(rast,bnum,descrip)
    SELECT ST_AddBand(ST_AddBand(rasts[1], rasts[2]),rasts[3]), 4,
       'map bands overlay fct union (canvas)'
    FROM (SELECT ARRAY(SELECT ST_MapAlgebraFct(m1.rast, m2.rast,
    'raster_mapalgebra_union(double precision, double precision, integer[], text[])'::regprocedure,
    '8BUI', 'FIRST')
    FROM map_shapes As m1 CROSS JOIN map_shapes As m2
    WHERE m1.descrip = 'canvas' AND m2.descrip <> 'canvas' ORDER BY m2.bnum)
    As rasts) As foo;

    接收额外参数的自定义函数。

    CREATE OR REPLACE FUNCTION raster_mapalgebra_userargs( rast1 double precision,
    rast2 double precision,
    pos integer[],
    VARIADIC userargs text[]
    )
    RETURNS double precision
    AS $$
    DECLARE
    BEGIN
    CASE
    WHEN rast1 IS NOT NULL AND rast2 IS NOT NULL THEN
    RETURN least(userargs[1]::integer,(rast1 + rast2)/2.);
    WHEN rast1 IS NULL AND rast2 IS NULL THEN
    RETURN userargs[2]::integer;
    WHEN rast1 IS NULL THEN
    RETURN greatest(rast2,random()*userargs[3]::integer)::integer;
    ELSE
    RETURN greatest(rast1, random()*userargs[4]::integer)::integer;
    END CASE;
    RETURN NULL;
    END;
    $$ LANGUAGE 'plpgsql' VOLATILE COST 1000;
    SELECT ST_MapAlgebraFct(m1.rast, 1, m1.rast, 3,
    'raster_mapalgebra_userargs(double precision, double precision, integer[], text[])':: regprocedure,
    '8BUI', 'INTERSECT', '100','200','200','0')
    FROM map_shapes As m1
    WHERE m1.descrip = 'map bands overlay fct union (canvas)';

    参考

    ST_MapAlgebraExpr, ST_BandPixelType, ST_GeoReference, ST_SetValue

    8.11.1.10. ST_MapAlgebraFctNgb

    ST_MapAlgebraFctNgb —输入参数是一个波段的函数版本:该函数使用用户自定义的KingbaseES函数。该函数会返回一个栅格,其值是一个PLPGSQL自定义函数的结果,该自定义函数与输入栅格波段的近邻值有关。

    用法

    raster ST_MapAlgebraFctNgb(raster rast, integer band, text pixeltype,
       integer ngbwidth, integer ngbheight, regprocedure onerastngbuserfunc,
       text nodatamode, text[] VARIADIC args);

    描述

    输入参数是一个波段的函数版本:该函数使用用户自定义的KingbaseES函数。 该函数会返回一个栅格,其值是一个PLPGSQL自定义函数的结果,该自定义函数与输入栅格波段的近邻值有关。

    用户自定义的函数会接收每个输入栅格波段的每个像素的相邻像素值作为一个数组,返回结果,然后再用返回结果去替换当前处理的像素的像素值。

    rast 用户自定义的函数要处理的栅格。

    band 要处理的栅格的波段号,默认是波段1。

    pixeltype 输出栅格的pixeltype,其值必须是ST_BandPixelType输出值之一,可以省略或设置为NULL。如果没有传递或传递的是NULL,那么会被默认为是参数rast的pixel type类型。如果返回的结果比允许的pixel type值大,那么结果会被截断。

    ngbwidth 相邻波段的宽度。

    ngbheight 相邻波段的高度。

    onerastngbuserfunc 用户自定义的PLPGSQL/psql函数,用于处理一个栅格的单个波段相邻的像素。第一个参数是一个2维数组,表示一个相邻的矩形像素。

    nodatamode 定义当一个相邻像素是NODATA或NULL时,传递该参数的值给自定义的函数onerastngbuserfunc。

    • 'ignore' 遇到相邻任意NODATA值的像素都会忽略计算处理——这个标志必须传给回调函数,而用户自定义函数决定怎样忽略它。

    • 'NULL' 遇到相邻任意NODATA值的像素计算都会引起返回的结果像素值为NULL——这种情况下,会跳过回调函数处理。

    • 'value' 遇到相邻任意NODATA值的像素都会被参考像素(相邻栅格单元的中心像素)所替换。

    注意

    如果该值为NODATA,那么其实现结果和取值为'NULL'一样(对于受影响的相邻栅格)。

    args 传递给自定义函数的参数。

    样例

    Example utilize the katrina raster loaded as a single tile described in frmts_wtkraster.html – GDAL andthen prepared in the ST_Rescale examples.

    --
    -- A simple ’callback’ user function that averages up all the values in a neighborhood.
    --
    CREATE OR REPLACE FUNCTION rast_avg(matrix float[][], nodatamode text, variadic args text
    [])
    RETURNS float AS
    $$
    DECLARE
    _matrix float[][];
    x1 integer;
    x2 integer;
    y1 integer;
    y2 integer;
    sum float;
    BEGIN
    _matrix := matrix;
    sum := 0;
    FOR x in array_lower(matrix, 1)..array_upper(matrix, 1) LOOP
    FOR y in array_lower(matrix, 2)..array_upper(matrix, 2) LOOP
    sum := sum + _matrix[x][y];
    END LOOP;
    END LOOP;
    RETURN (sum*1.0/(array_upper(matrix,1)*array_upper(matrix,2) ))::integer ;
    END;
    $$
    LANGUAGE 'plpgsql' IMMUTABLE COST 1000;
    
    -- now we apply to our raster averaging pixels
    -- within 2 pixels of each other in X and Y direction --
    SELECT ST_MapAlgebraFctNgb(rast, 1, '8BUI', 4,4,
    'rast_avg(float[][], text, text[])'::regprocedure, 'NULL', NULL) As nn_with_border
    FROM katrinas_rescaled
    limit 1;

    参考

    ST_MapAlgebraFct, ST_MapAlgebraExpr, ST_Rescale

    8.11.1.11. ST_Reclass

    ST_Reclass — 创建一个新的栅格,其波段类型将由将由原始的波段类型转换而来。如果没有指定nband值,那么默认取波段1。其他波段都不会改变。 使用场景:把一个16BUI的波段转换成8BUI的波段,以便简化导出为可见的格式。

    用法

    raster ST_Reclass(raster rast, integer nband, text reclassexpr,
       text pixeltype, double precision nodataval=NULL);
    raster ST_Reclass(raster rast, reclassarg[] VARIADIC reclassargset);
    raster ST_Reclass(raster rast, text reclassexpr, text pixeltype);

    描述

    创建一个新的栅格,其波段类型将由将由原始的波段类型转换而来。如果没有指定nband值,那么默认取波段1。其他波段都不会改变。 使用场景:把一个16BUI的波段转换成8BUI的波段,以便简化导出为可见的格式。

    根据一个用户定义在输入栅格波段的KingbaseES代数表达式reclassexpr,执行生成一个带有一个波段的栅格。 如果没有指定波段是哪个,默认取波段1。新栅格将会和原始的输入栅格有相同的空间参考,宽度和高度。没有指定的波段将不会修改类型。

    参考reclassarg获取一个有效的类型转换表述是怎样的。

    新栅格的波段的像素类型被设定为pixeltype值。如果传递了参数reclassargset,那么每一个参数reclassarg会定义每一个生成波段的表现方式。

    样例 : Basic

    -- Create a new raster from the original
    -- where band 2 is converted from 8BUI to 4BUI
    -- and all values from 101-254 are set to nodata value.
    ALTER TABLE dummy_rast ADD COLUMN reclass_rast raster;
    UPDATE dummy_rast SET reclass_rast = ST_Reclass(rast,2,
       '0-87:1-10, 88-100:11-15, 101-254:0-0', '4BUI',0) WHERE rid = 2;
    
    SELECT i as col, j as row,
    ST_Value(reclass_rast,
    ST_Value(reclass_rast,
    FROM dummy_rast CROSS JOIN
    ST_Value(rast,2,i,j) As origval,
    2, i, j) As reclassval,
    2, i, j, false) As reclassval_include_nodata
    generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j
    WHERE rid = 2;
    
    col|row|origval| reclassval | reclassval_include_nodata
    ---+---+-------+------------+---------------------------
    1  | 1 | 78    | 9          | 9
    2  | 1 | 98    | 14         | 14
    3  | 1 | 122   |            | 0
    1  | 2 | 96    | 14         | 14
    2  | 2 | 118   |            | 0
    3  | 2 | 180   |            | 0
    1  | 3 | 99    | 15         | 15
    2  | 3 | 112   |            | 0
    3  | 3 | 169   |            | 0

    样例 : Advanced using multiple reclassargs

    -- Create a new raster from the original where band 1,2,3 is converted to
    -- 1BB,4BUI, 4BUI respectively and reclassified. 注意 thisuses the variadic
    -- reclassarg argument which can take as input an indefinite number of
    -- reclassargs (theoretically as many bands as you have)
    
    UPDATE dummy_rast SET reclass_rast =
    ST_Reclass(rast,
    ROW(2,'0-87]:1-10, (87-100]:11-15, (101-254]:0-0', '4BUI',NULL)::reclassarg,
    ROW(1,'0-253]:1, 254:0', '1BB', NULL)::reclassarg,
    ROW(3,'0-70]:1, (70-86:2, [86-150):3, [150-255:4', '4BUI', NULL)::reclassarg
    ) WHERE rid = 2;
    SELECT i as col, j as row,ST_Value(rast,1,i,j) As ov1, ST_Value(reclass_rast, 1, i, j) As rv1,
    ST_Value(rast,2,i,j) As ov2, ST_Value(reclass_rast, 2, i, j) As rv2,
    ST_Value(rast,3,i,j) As ov3, ST_Value(reclass_rast, 3, i, j) As rv3
    FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1,3) AS j
    WHERE rid = 2;
    
    col|row| ov1 |rv1| ov2 | rv2| ov3| rv3
    ---+---+-----+---+-----+----+----+-----
    1  | 1 | 253 | 1 | 78  | 9  | 70 | 1
    2  | 1 | 254 | 0 | 98  | 14 | 86 | 3
    3  | 1 | 253 | 1 | 122 | 0  | 100| 3
    1  | 2 | 253 | 1 | 96  | 14 | 80 | 2
    2  | 2 | 254 | 0 | 118 | 0  | 108| 3
    3  | 2 | 254 | 0 | 180 | 0  | 162| 4
    1  | 3 | 250 | 1 | 99  | 15 | 90 | 3
    2  | 3 | 254 | 0 | 112 | 0  | 108| 3
    3  | 3 | 254 | 0 | 169 | 0  | 175| 4

    样例 : Advanced Map a single band 32BF raster to multiple viewable bands

    -- Create a new 3 band (8BUI,8BUI,8BUI viewable raster)
    -- from a raster that has only one 32bf band
    
    ALTER TABLE wind ADD COLUMN rast_view raster;
    UPDATE wind
    set rast_view = ST_AddBand( NULL,
    ARRAY[
    ST_Reclass(rast, 1,'0.1-10]:1-10,9-10]:11,(11-33:0'::text, '8BUI'::text,0),
    ST_Reclass(rast,1, '11-33):0-255,[0-32:0,(34-1000:0'::text, '8BUI'::text,0),
    ST_Reclass(rast,1,'0-32]:0,(32-100:100-255'::text, '8BUI'::text,0)
    ]
    );

    参考

    ST_AddBand, ST_Band, ST_BandPixelType, ST_MakeEmptyRaster, reclassarg, ST_Value

    8.11.1.12. ST_Union

    ST_Union —取栅格瓦片的并集生成一个包含1个或更多波段的栅格。

    用法

    raster ST_Union(setof raster rast);
    raster ST_Union(setof raster rast, unionarg[] unionargset);
    raster ST_Union(setof raster rast, integer nband);
    raster ST_Union(setof raster rast, text uniontype);
    raster ST_Union(setof raster rast, integer nband, text uniontype);

    描述

    取栅格瓦片的并集生成一个包含1个或更多波段的栅格。 返回栅格的边界是整个并集的边界。 在交集的情况下,返回值的类型由参数uniontype来定义,uniontype值列表如下:LAST(default), FIRST, MIN, MAX, COUNT, SUM, MEAN, RANGE 。

    样例 : Reconstitute a single band chunked raster tile

    -- this creates a single band from first band of raster tiles
    -- that form the original file system tile
    
    SELECT filename, ST_Union(rast,1) As file_rast
    FROM sometable WHERE filename IN('dem01', 'dem02') GROUP BY filename;

    样例 : Return a multi-band raster that is the union of tiles intersecting geometry

    -- this creates a multi band raster collecting all the tiles that intersect a line
    -- NOTE: In 2.0, this would have just returned a single band raster,
    -- new union works on all bands by default
    -- this is equivalent to unionarg: ARRAY[ROW(1, ’LAST’), ROW(2, ’LAST’), ROW(3, ’LAST’)]:: unionarg[]
    SELECT ST_Union(rast)
    FROM aerials.boston
    WHERE ST_Intersects(rast, ST_GeomFromText('LINESTRING(230486 887771, 230500 88772)',26986));

    样例 : Return a multi-band raster that is the union of tiles intersecting geometry

    -- Here we use the longer syntax if we only wanted a subset of bands
    -- or we want to change order of bands
    -- this creates a multi band raster collecting all the tiles that intersect a line
    
    SELECT ST_Union(rast,ARRAY[ROW(2, 'LAST'), ROW(1, 'LAST'), ROW(3,'LAST')]::unionarg[])
    FROM aerials.boston
    WHERE ST_Intersects(rast, ST_GeomFromText('LINESTRING(230486 887771, 230500 88772)',26986)
    );

    参考

    unionarg, ST_Envelope, ST_ConvexHull, ST_Clip, ST_Union

    8.11.2. 内置的地图代数回调函数

    8.11.2.1. ST_Distinct4ma

    ST_Distinct4ma —栅格处理函数,计算近邻栅格单元唯一的像素值的个数。

    用法

    float8 ST_Distinct4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Distinct4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    计算近邻栅格单元唯一的像素值的个数。

    注意

    函数变体1是一个专门的回调函数,用于当做函数ST_MapAlgebraFctNgb的回调函数参数。

    注意

    函数变体2是一个专门的回调函数,用于当做函数ST_MapAlgebra的回调函数参数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, NULL, 1, 1,
    'st_distinct4ma(float[][],text,text[])'::
    regprocedure, 'ignore', NULL), 2, 2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+----------
    2    | 3
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Max4ma, ST_Sum4ma, ST_Mean4ma, ST_Distinct4ma, ST_StdDev4ma

    8.11.2.2. ST_InvDistWeight4ma

    ST_InvDistWeight4ma — 栅格处理函数,它从像素的邻域计算一个像素插值。

    用法

    double precision ST_InvDistWeight4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    使用Inverse Distance Weighted 方法计算一个像素的插值。

    有两个可选参数可以用个参数userargs进行传递。第一个参数是power factor(就是下面等式的变量k),范围在0到1内,这个参数在Inverse Distance Weighted方程中用到。如果没有指定,默认值取1.第二个参数是权重比例weight percentage,这个参数只有感兴趣的像素的值在邻域的插值范围内才会起作用。如果没有指定并且感兴趣的像素有一个值,那么返回这个参数的值。

    基本的Inverse Distance Weighted方法等式如下:

    k = power factor, a real number between 0 and 1

    注意

    这个函数是函数ST_MapAlgebra的专用回调函数。

    样例

    参考

    ST_MapAlgebra, ST_MinDist4ma

    8.11.2.3. ST_Max4ma

    ST_Max4ma — 栅格处理函数,它计算一个邻域的最大像素值。

    用法

    float8 ST_Max4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Max4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,它计算一个邻域的最大像素值。

    对于函数变体2,可以在userargs参数中传递一个替代值给哪些值为NODATA的像素。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, NULL, 1, 1,
    'st_max4ma(float[][],text,text[])':: regprocedure, 'ignore', NULL), 2, 2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+----------
    2    | 254
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Sum4ma, ST_Mean4ma, ST_Range4ma, ST_Distinct4ma, ST_StdDev4ma

    8.11.2.4. ST_Mean4ma

    ST_Mean4ma —栅格处理函数,它计算一个邻域的平均像素值。

    用法

    float8 ST_Mean4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Mean4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,它计算一个邻域的平均像素值。

    对于函数变体2,可以在userargs参数中传递一个替代值给哪些值为NODATA的像素。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例 : Variant 1

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, '32BF', 1, 1,
    'st_mean4ma(float[][],text,text[])':: regprocedure, 'ignore', NULL), 2,
    2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+------------------
    2    | 253.222229003906
    (1 row)

    样例 : Variant 2

    SELECT rid,
    st_value(
    ST_MapAlgebra(rast, 1,
       'st_mean4ma(double precision[][][], integer[][], text[])'::regprocedure,
       '32BF', 'FIRST', NULL, 1, 1) , 2, 2)
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+------------------
    2    | 253.222229003906
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Max4ma, ST_Sum4ma, ST_Range4ma, ST_StdDev4ma

    8.11.2.5. ST_Min4ma

    ST_Min4ma —栅格处理函数,它计算一个邻域的最小像素值。

    用法

    float8 ST_Min4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Min4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,它计算一个邻域的最小像素值。

    对于函数变体2,可以在userargs参数中传递一个替代值给哪些值为NODATA的像素。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, NULL, 1, 1,
    'st_min4ma(float[][],text,text[])':: regprocedure, 'ignore', NULL), 2, 2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+----------
    2    | 250
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Max4ma, ST_Sum4ma, ST_Mean4ma, ST_Range4ma, ST_Distinct4ma, ST_StdDev4m

    8.11.2.6. ST_MinDist4ma

    ST_MinDist4ma —栅格处理函数,返回感兴趣的像素和一个邻域像素之间的最小距离(距离单位是像素的个数)。

    用法

    double precision ST_MinDist4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,返回感兴趣的像素和一个邻域像素之间的最小距离(距离单位是像素的个数)。

    注意

    这个函数用途是提供提供点的数据信息用于推断从函数ST_InvDistWeight4ma返回的感兴趣的像素的插值。这个函数在邻域特别稀疏时候很有用。

    注意

    这个函数是函数ST_MapAlgebra专用的回调函数。

    参考

    ST_MapAlgebra, ST_InvDistWeight4ma

    8.11.2.7. ST_Range4ma

    ST_Range4ma — 栅格处理函数,计算邻域的像素值范围。

    用法

    float8 ST_Range4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Range4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,计算邻域的像素值范围。

    对于函数变体2,可以在userargs参数中传递一个替代值给哪些值为NODATA的像素。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, NULL, 1, 1,
    'st_range4ma(float[][],text,text[])':: regprocedure, 'ignore', NULL), 2,
    2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+----------
    2    | 4
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Max4ma, ST_Sum4ma, ST_Mean4ma, ST_Distinct4ma, ST_StdDev4ma

    8.11.2.8. ST_StdDev4ma

    ST_StdDev4ma —栅格处理函数,计算邻域的像素的标准差。

    用法

    float8 ST_StdDev4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_StdDev4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,计算邻域的像素的标准差。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, '32BF', 1, 1,
    'st_stddev4ma(float[][],text,text[])':: regprocedure, 'ignore', NULL),
    2, 2
    )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+------------------
    2    | 1.30170822143555
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Max4ma, ST_Sum4ma, ST_Mean4ma, ST_Distinct4ma, ST_StdDev4ma

    8.11.2.9. ST_Sum4ma

    ST_Sum4ma — 栅格处理函数,计算一个邻域里面像素值的和。

    用法

    float8 ST_Sum4ma(float8[][] matrix, text nodatamode, text[] VARIADIC args);
    double precision ST_Sum4ma(double precision[][][] value, integer[][] pos, text[] VARIADIC userargs);

    描述

    栅格处理函数,计算一个邻域里面像素值的和。

    对于函数变体2,可以在userargs参数中传递一个替代值给哪些值为NODATA的像素。

    注意

    函数变体1是函数ST_MapAlgebraFctNgb专用的回调函数。

    注意

    函数变体2是函数ST_MapAlgebra专用的回调函数。

    样例

    SELECT rid,
    st_value(
    st_mapalgebrafctngb(rast, 1, '32BF', 1, 1,
    'st_sum4ma(float[][],text,text[])'::regprocedure, 'ignore', NULL), 2, 2 )
    FROM dummy_rast
    WHERE rid = 2;
    
    rid  | st_value
    -----+----------
    2    | 2279
    (1 row)

    参考

    ST_MapAlgebraFctNgb, ST_MapAlgebra, ST_Min4ma, ST_Max4ma, ST_Mean4ma, ST_Range4ma, ST_Distinct4ma, ST_StdDev4ma

    8.11.3. 数字高程模型——DEM (Elevation)

    8.11.3.1. ST_Aspect

    ST_Aspect —获得栅格表面的坡向 (默认单位是度)。对于地形分析很有用。

    用法

    raster ST_Aspect(raster rast, integer band=1, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);
    raster ST_Aspect(raster rast, integer band, raster customextent, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);

    描述

    获得栅格表面的坡向 (默认单位是度)。利用地图代数并把坡向用于邻域像素。

    参数units是坡向的单位。坡向单位可能的值是:RADIANS, DEGREES (默认单位)。

    当单位参数units = RADIANS时,取值范围是0 到 2 * pi弧度之间,从正北方向顺时针开始计算。

    当单位参数units = DEGREES时,取值范围在0到360度之间,从正北方向顺时针测量。

    如果像素的坡度为0,那么像素的坡向是-1。

    注意

    更多关于Slope(坡度), Aspect(坡向)和 Hillshade(山体阴影)的信息请参考ESRI - How hillshade works和 ERDAS Field Guide - Aspect Images。

    样例 : Variant 1

    WITH foo AS (
    SELECT ST_SetValues(
    ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1],
    [1, 2, 2, 2, 1],
    [1, 2, 3, 2, 1],
    [1, 2, 2, 2, 1],
    [1, 1, 1, 1, 1]
    ]::double precision[][]
    ) AS rast
    )
    SELECT
    ST_DumpValues(ST_Aspect(rast, 1, '32BF'))
    FROM foo
    
    -----------------------------------------------------------------------------------------------------
    (1,"{{315,341.565063476562,0,18.4349479675293,45},{288.434936523438,315,0,45,71.5650482177734},{270,
    2227,180,161.565048217773,135}}")
    (1 row)

    样例: Variant 2

    -- Complete example of tiles of a coverage.
    WITH foo AS (
    SELECT ST_Tile(
    ST_SetValues(
    ST_AddBand(
    ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0),
    1, '32BF', 0, -9999
    ),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 2, 1],
    [1, 2, 2, 3, 3, 1],
    [1, 1, 3, 2, 1, 1],
    [1, 2, 2, 1, 2, 1],
    [1, 1, 1, 1, 1, 1]
    ]::double precision[]
    ),
    2, 2
    ) AS rast
    )
    SELECT
    t1.rast,
    ST_Aspect(ST_Union(t2.rast), 1, t1.rast)
    FROM foo t1
    CROSS JOIN foo t2
    WHERE ST_Intersects(t1.rast, t2.rast)
    GROUP BY t1.rast;

    参考

    ST_MapAlgebra, ST_TRI, ST_TPI, ST_Roughness, ST_HillShade, ST_Slope

    8.11.3.2. ST_HillShade

    ST_HillShade — 根据输入参数azimuth, altitude, brightness和scale,返回栅格波段的山体阴影。

    用法

    raster ST_HillShade(raster rast, integer band=1, text pixeltype=32BF, double precision azimuth=315, double precision alti-tude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE);
    raster ST_HillShade(raster rast, integer band, raster customextent, text pixeltype=32BF, double precision azimuth=315, doubleprecision altitude=45, double precision max_bright=255, double precision scale=1.0, boolean interpolate_nodata=FALSE);

    描述

    根据输入参数azimuth, altitude, brightness和scale,返回栅格波段的山体阴影。使用地图代数并把山体阴影高程用于邻域像素。

    返回像素值在0到255之间。

    • azimuth 是一个值在0到360度之间按照正北方向顺时针测量的值。

    • altitude 取值在0到90度之间,0度表示处于地平线,而90度表示垂直。

    • max_bright 取值在0到255之间,0表示没有亮度,而255是最大亮度。

    • scale 是垂直单位与水平单位的比值。例如Feet:LatLon,使用scale=370400,对于 Meters:LatLon 使用scale=111120。

    如果参数interpolate_nodata = TRUE, 输入栅格的NODATA像素值将在计算山体阴影之前使用函数ST_InvDistWeight4ma进行插值。

    注意

    更多关于Hillshade(山体阴影)信息,请参考How hillshade works。

    样例: Variant 1

    WITH foo AS (
    SELECT ST_SetValues(
    ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1],
    [1, 2, 2, 2, 1],
    [1, 2, 3, 2, 1],
    [1, 2, 2, 2, 1],
    [1, 1, 1, 1, 1]
    ]::double precision[][]
    ) AS rast
    )
    SELECT
    ST_DumpValues(ST_Hillshade(rast, 1, '32BF'))
    FROM foo
    -----------------------------------------------------------------------------------------------------
    (1,"{{NULL,NULL,NULL,NULL,NULL},{NULL,251.32763671875,220.749786376953,147.224319458008,
    NULL},{NULL,220.749786376953,180.312225341797,67.7497863769531,NULL},{NULL
    ,147.224319458008,67.7497863769531,43.1210060119629,NULL},{NULL,NULL,NULL,NULL,NULL}}")
    (1 row)

    样例: Variant 2

    -- Complete example of tiles of a coverage
    WITH foo AS (
    SELECT ST_Tile(
    ST_SetValues(
    ST_AddBand(
    ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0),
    1, '32BF', 0, -9999
    ),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 2, 1],
    [1, 2, 2, 3, 3, 1],
    [1, 1, 3, 2, 1, 1],
    [1, 2, 2, 1, 2, 1],
    [1, 1, 1, 1, 1, 1]
    ]::double precision[]
    ),
    2, 2
    ) AS rast
    )
    SELECT
    t1.rast,
    ST_Hillshade(ST_Union(t2.rast), 1, t1.rast)
    FROM foo t1
    CROSS JOIN foo t2
    WHERE ST_Intersects(t1.rast, t2.rast)
    GROUP BY t1.rast;

    参考

    ST_MapAlgebra, ST_TRI, ST_TPI, ST_Roughness, ST_Aspect, ST_Slope

    8.11.3.3. ST_Roughness

    ST_Roughness —返回一个DEM模型的“粗糙程度”的栅格。

    用法

    raster ST_Roughness(raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE);

    描述

    通过计算给定区域最大值和最小值的差计算一个DEM模型的粗糙程度。

    参考

    ST_MapAlgebra, ST_TRI, ST_TPI, ST_Slope, ST_HillShade, ST_Aspect

    8.11.3.4. ST_Slope

    ST_Slope —返回一个栅格波段的坡度(默认以度为单位)。对于地形分析很有用。

    用法

    raster ST_Slope(raster rast, integer nband=1, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE);
    raster ST_Slope(raster rast, integer nband, raster customextent, text pixeltype=32BF, text units=DEGREES, double precision scale=1.0, boolean interpolate_nodata=FALSE);

    描述

    返回一个栅格波段的坡度(默认以度为单位)。将地图代数方法应用于邻域像素的坡度方程。参数units表示坡度的单位。可能值有: RADIANS, DEGREES (默认取值),PERCENT。

    scale是垂直单位与水平单位的比值。例如Feet:LatLon,使用scale=370400,对于 Meters:LatLon 使用scale=111120。

    如果参数interpolate_nodata = TRUE, 输入栅格的NODATA像素值将在计算表面坡度之前使用函数ST_InvDistWeight4ma进行插值。

    注意

    更多关于Slope(坡度), Aspect(坡向)和 Hillshade(山体阴影),请参考ESRI - How hillshade works和 ERDAS Field Guide - Slope Images 。

    样例: Variant 1

    WITH foo AS (
    SELECT ST_SetValues(
    ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1],
    [1, 2, 2, 2, 1],
    [1, 2, 3, 2, 1],
    [1, 2, 2, 2, 1],
    [1, 1, 1, 1, 1]
    ]::double precision[][]
    ) AS rast
    )
    SELECT
    ST_DumpValues(ST_Slope(rast, 1, '32BF'))
    FROM foo
    st_dumpvalues
    -----------------------------------------------------------------------------------------------------
    (1,"{{10.0249881744385,21.5681285858154,26.5650520324707,21.5681285858154,10.0249881744385},{21.5681
    {26.5650520324707,36.8698959350586,0,36.8698959350586,26.5650520324707},{21.5681285858154,35.26438903
    5681285858154,26.5650520324707,21.5681285858154,10.0249881744385}}")
    (1 row)

    样例: Variant 2

    -- Complete example of tiles of a coverage.
    WITH foo AS (
    SELECT ST_Tile(
    ST_SetValues( ST_AddBand(
    ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0),
    1, '32BF', 0, -9999
    ),
    1, 1, 1, ARRAY[
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 2, 1],
    [1, 2, 2, 3, 3, 1],
    [1, 1, 3, 2, 1, 1],
    [1, 2, 2, 1, 2, 1],
    [1, 1, 1, 1, 1, 1]
    ]::double precision[]
    ),
    2, 2
    ) AS rast
    )
    
    SELECT t1.rast,
    ST_Slope(ST_Union(t2.rast), 1, t1.rast)
    FROM foo t1
    CROSS JOIN foo t2
    WHERE ST_Intersects(t1.rast, t2.rast)
    GROUP BY t1.rast;

    参考

    ST_MapAlgebra, ST_TRI, ST_TPI, ST_Roughness, ST_HillShade, ST_Aspect

    8.11.3.5. ST_TPI

    ST_TPI —返回一个带有地形位置指数的栅格。

    用法

    raster ST_TPI(raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE );

    描述

    返回一个带有地形位置指数的栅格,地形位置指数的定义是中心点高程值减去周围高程的平均值。

    注意

    这个函数只支持一个栅格平均计算。

    参考

    ST_MapAlgebra, ST_TRI, ST_Roughness, ST_Slope, ST_HillShade, ST_Aspect

    8.11.3.6. ST_TRI

    ST_TRI — 返回一个带有地形耐用指数的栅格。

    用法

    raster ST_TRI(raster rast, integer nband, raster customextent, text pixeltype="32BF" , boolean interpolate_nodata=FALSE );

    描述

    TRI是指中心点高程与周围高程的差的平均值。

    注意

    这个函数只支持一个栅格平均计算。

    参考

    ST_MapAlgebra, ST_Roughness, ST_TPI, ST_Slope, ST_HillShade, ST_Aspect

    8.11.4. 栅格转换成几何对象函数

    8.11.4.1. Box3D

    Box3D — 返回包围栅格“壳”的box 3d几何对象的形式。

    用法

    box3d Box3D(raster rast);

    描述

    返回包围栅格“壳”的box 3d几何对象的形式。

    多边形由缓冲区((MINX, MINY), (MAXX, MAXY))的角点定义。

    样例

    SELECT
    rid,
    Box3D(rast) AS rastbox
    FROM dummy_rast;
    
    rid | rastbox
    ----+-------------------------------------------------
    1   | BOX3D(0.5 0.50,20.5 60.5 0)
    2   | BOX3D(3427927.75 5793243.5 0,3427928 5793244 0)

    参考

    ST_Envelope

    8.11.4.2. ST_ConvexHull

    ST_ConvexHull — 返回一个栅格的像素值为BandNoDataValue的凸包几何对象。 对于规则形状和非倾斜的栅格,这个函数返回的值和函数ST_Envelope结果一样,因此这个函数主要用于不规则形状的或倾斜的栅格对象。

    用法

    geometry ST_ConvexHull(raster rast);

    描述

    返回一个栅格的像素值为BandNoDataValue 的凸包几何对象。对于规则形状和非倾斜的栅格,这个函数返回的值和函数ST_Envelope结果一样,因此这个函数主要用于不规则形状的或倾斜的栅格对象。

    注意

    ST_Envelope对坐标进行了向下取整,因此对栅格添加了一些缓冲区,因此这个函数的结果会和没有进行向下取整坐标的函数ST_ConvexHull结果略有不同。

    样例

    -- Refer to KGIS Raster Specification for a diagram of this.
    -- 注意 envelope and convexhull are more or less the same
    SELECT ST_AsText(ST_ConvexHull(rast)) As convhull,
    ST_AsText(ST_Envelope(rast)) As envFROM dummy_rast WHERE rid=1;
    
    convhull                                                | env
    --------------------------------------------------------+------------------------------------
    POLYGON((0.5 0.5,20.5 0.5,20.5 60.5,0.5 60.5,0.5 0.5))  | POLYGON((0 0,20 0,20 60,0 60,0 0))
    
    -- now we skew the raster
    -- note how the convex hull and envelope are now different
    SELECT ST_AsText(ST_ConvexHull(rast)) As convhull,
    ST_AsText(ST_Envelope(rast)) As env
    FROM (SELECT ST_SetRotation(rast, 0.1, 0.1) As rast
    FROM dummy_rast WHERE rid=1) As foo;
    
    convhull                                                | env
    --------------------------------------------------------+------------------------------------
    POLYGON((0.5 0.5,20.5 1.5,22.5 61.5,2.5 60.5,0.5 0.5))  | POLYGON((0 0,22 0,22 61,0 61,0 0))

    参考

    ST_Envelope, ST_MinConvexHull, ST_ConvexHull, ST_AsText

    8.11.4.3. ST_DumpAsPolygons

    ST_DumpAsPolygons —根据一个栅格波段,返回一个geomval (geom,val)记录集。如果没有指定波段号,那么默认取波段1。

    用法

    setof geomval ST_DumpAsPolygons(raster rast, integer band_num=1, boolean exclude_nodata_value=TRUE);

    描述

    这是一个返回记录集的函数(SRF)。它返回geomval(类似键值对)记录集。每一个多边形都是有相同像素值的波段的像素并集。 函数ST_DumpAsPolygon对于将栅格多边形化是非常有用的,它是相当于GROUP BY(聚合)的逆过程。 例如,这个函数可以用于把单个栅格展开成多个几何对象结构,这些几何对象可以是:POLYGONS/MULTIPOLYGONS

    注意

    如果一个波段中有一个NODATA值的像素集,那么包含NODATA值的像素将不会被返回。

    注意

    如果只关注一个栅格中给定值的像素的个数,使用函数ST_ValueCount更快。

    注意

    这个函数和函数ST_PixelAsPolygons不同,后者不论像素的像素值是什么都会返回一个几何对象。

    样例

    SELECT val, ST_AsText(geom) As geomwkt
    FROM (
    SELECT (ST_DumpAsPolygons(rast)).*
    FROM dummy_rast
    WHERE rid = 2
    ) As foo
    WHERE val BETWEEN 249 and 251
    ORDER BY val;
    
    val | geomwkt
    ----+--------------------------------------------------------------------------
    249 | POLYGON((3427927.95 5793243.95,3427927.95 5793243.85,3427928 5793243.85,3427928 5793243.95,3427927.95 5793243.95))
    250 | POLYGON((3427927.75 5793243.9,3427927.75 5793243.85,3427927.8 5793243.85,3427927.8 5793243.9,3427927.75 5793243.9))
    250 | POLYGON((3427927.8 5793243.8,3427927.8 5793243.75,3427927.85 5793243.75,3427927.85 5793243.8, 3427927.8 5793243.8))
    251 | POLYGON((3427927.75 5793243.85,3427927.75 5793243.8,3427927.8 5793243.8,3427927.8 5793243.85,3427927.75 5793243.85))

    参考

    geomval, ST_Value, ST_Polygon, ST_ValueCount

    8.11.4.4. ST_Envelope

    ST_Envelope — 返回一个多边形用于表示栅格的边界。

    用法

    geometry ST_Envelope(raster rast);

    描述

    返回一个多边形用于表示栅格的边界。它是一个float8精度的缓冲区,表示一个多边形。 多边形是由缓冲区的各个顶点来确定的((MINX,MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY),(MINX, MINY))。

    样例

    SELECT rid, ST_AsText(ST_Envelope(rast)) As envgeomwktFROM dummy_rast;
    
    rid |envgeomwkt
    ----+--------------------------------------------------------------------
    1   | POLYGON((0 0,20 0,20 60,0 60,0 0))
    2   | POLYGON((3427927 5793243,3427928 5793243,3427928 5793244,3427927 5793244, 3427927 5793243))

    参考

    ST_Envelope, ST_AsText, ST_SRID

    8.11.4.5. ST_MinConvexHull

    ST_MinConvexHull —返回不包含NODATA像素的栅格的凸包几何对象。

    用法

    geometry ST_MinConvexHull(raster rast, integer nband=NULL);

    描述

    返回不包含NODATA像素的栅格的凸包几何对象。如果参数nband值为NULL,那么所有的栅格都会被处理。

    样例

    WITH foo AS (
    SELECT
    ST_SetValues(
    ST_SetValues(
    ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(9, 9, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0), 2, '8BUI', 1, 0),
    1, 1, 1,
    ARRAY[
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 1],
    [0, 0, 0, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0]
    ]::double precision[][]
    ),
    2, 1, 1,
    ARRAY[
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0]
    ]::double precision[][]
    ) AS rast
    )
    SELECT
    ST_AsText(ST_ConvexHull(rast)) AS hull,
    ST_AsText(ST_MinConvexHull(rast)) AS mhull,
    ST_AsText(ST_MinConvexHull(rast, 1)) AS mhull_1,
    ST_AsText(ST_MinConvexHull(rast, 2)) AS mhull_2
    FROM foo
    
    hull                            | mhull_1                           | mhull                            | mhull_2
    --------------------------------+-----------------------------------+----------------------------------+--------------------------------------
    POLYGON((0 0,9 0,9 -9,0 -9,0 0))|POLYGON((0 -3,9 -3,9 -9,0 -9,0 -3))|POLYGON((3 -3,9-3,9 -6,3 -6,3 -3))| POLYGON((0 -3,6 -3,6 -9,0 -9,0 -3))

    参考

    ST_Envelope, ST_ConvexHull, ST_ConvexHull, ST_AsText

    8.11.4.6. ST_Polygon

    ST_Polygon — 返回一个multipolygon(多边形)几何对象,该几何对象是由那些像素值不是NODATA值的并集组成的。如果没有指定是哪个波段,那么默认取波段1。

    用法

    geometry ST_Polygon(raster rast, integer band_num=1);

    描述

    返回一个multipolygon(多边形)几何对象,该几何对象是由那些像素值不是NODATA值的并集组成的。如果没有指定是哪个波段,那么默认取波段1。

    样例

    -- by default no data band value is 0 or not set,
    -- so polygon will return a square polygon
    SELECT ST_AsText(ST_Polygon(rast)) As geomwkt
    FROM dummy_rast
    WHERE rid = 2;
    
    geomwkt
    --------------------------------------------
    MULTIPOLYGON(((3427927.75 5793244,3427928 5793244,3427928 5793243.75,3427927.75
    5793243.75,3427927.75 5793244)))
    
    -- now we change the no data value of first band
    UPDATE dummy_rast SET rast = ST_SetBandNoDataValue(rast,1,254)
    WHERE rid = 2;
    SELECt rid, ST_BandNoDataValue(rast)
    from dummy_rast where rid = 2;
    
    -- ST_Polygon excludes the pixel value 254 and returns a multipolygon
    SELECT ST_AsText(ST_Polygon(rast)) As geomwkt
    FROM dummy_rast
    WHERE rid = 2;
    
    geomwkt
    ---------------------------------------------------------
    MULTIPOLYGON(((3427927.9 5793243.95,3427927.85 5793243.95,3427927.85 5793244,3427927.9
    5793244,3427927.9 5793243.95)),((3427928 5793243.85,3427928 5793243.8,3427927.95
    5793243.8,3427927.95 5793243.85,3427927.9 5793243.85,3427927.9 5793243.9,3427927.9
    5793243.95,3427927.95 5793243.95,3427928 5793243.95,3427928 5793243.85)),((3427927.8
    5793243.75,3427927.75 5793243.75,3427927.75 5793243.8,3427927.75 5793243.85,3427927.75
    5793243.9,3427927.75 5793244,3427927.8 5793244,3427927.8 5793243.9,3427927.8
    5793243.85,3427927.85 5793243.85,3427927.85 5793243.8,3427927.85 5793243.75,3427927.8
    5793243.75)))
    
    -- Or if you want the no data value different for just one time
    SELECT ST_AsText(
    ST_Polygon(
    ST_SetBandNoDataValue(rast,1,252)
    )
    ) As geomwkt
    FROM dummy_rast
    WHERE rid =2;
    
    geomwkt
    ------------------------------------------------------------------------------------
    MULTIPOLYGON(((3427928 5793243.85,3427928 5793243.8,3427928 5793243.75,3427927.85
    5793243.75,3427927.8 5793243.75,3427927.8 5793243.8,3427927.75 5793243.8,3427927.75
    5793243.85,3427927.75 5793243.9,3427927.75 5793244,3427927.8 5793244,3427927.85
    5793244,3427927.9 5793244,3427928 5793244,3427928 5793243.95,3427928 5793243.85)
    ,(3427927.9 5793243.9,3427927.9 5793243.85,3427927.95 5793243.85,3427927.95
    5793243.9,3427927.9 5793243.9)))

    参考

    ST_Value, ST_DumpAsPolygons

  • 相关阅读:
    研究人员在宜家智能照明系统发现漏洞,攻击者可以利用这些漏洞导致灯泡闪烁恢复出厂设置
    openGL glMatrixMode()函数介绍
    智云通CRM:客户说“别人家的便宜”,如何有效回应?
    数据结构:线性表(队列实现)
    Excel快捷键表
    五、Linux命令执行绕过技巧
    Flutter:setState() 能在 build() 中直接调用吗?
    Source Insight 安装及使用方法
    HBase-集群部署
    北斗网络时钟服务器(北斗卫星授时服务器)应用方案
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126346625