ST_Clip — 入力ジオメトリで切り取ったラスタを返します。バンドが指定されていない場合には、全てのバンドが処理されます。cropが指定されていなかったりTRUE となっている場合には、出力ラスタは切り取られます。touchedがTRUEの場合には、接触するピクセルは取り込まれ、TRUEでない場合には、中心がジオメトリ内にあるピクセルだけが取り込まれます。
raster ST_Clip(raster rast, integer[] nband, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, integer nband, geometry geom, boolean crop, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision[] nodataval=NULL, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, double precision nodataval, boolean crop=TRUE, boolean touched=FALSE);
raster ST_Clip(raster rast, geometry geom, boolean crop, boolean touched=FALSE);
入力ジオメトリgeomで切り取ったラスタを返します。バンドが指定されていない場合には、全てのバンドが処理されます。
ST_Clipが返すラスタは、バンド毎に一つずつ必ず切り取った領域に適用するNODATA値を持ちます。NODATA値が渡されず、入力ラスタがNODATA値を持たない場合には、結果ラスタのNODATA値はST_MinPossibleValue(ST_BandPixelType(rast, band))に設定されます。配列におけるNODATA値の要素数がバンド数より小さい場合には、配列の最後の要素が残りのバンドに適用されます。NODATA値の要素数がバンド数より多い場合には、超過分は無視されます。全てのNODATA値配列を受け付ける形式では、バンド毎に適用される単一値も受け付けます。
crop が指定されていない場合には、TRUE として扱われ、出力ラスタは geom と rast の範囲の共有領域で切り取ります。crop が FALSE に指定されている場合には、新しいラスタは rast と同じ範囲になります。touched が TRUE に指定されている場合には、ジオメトリとインタセクトする rast 内の全てのピクセルが選択されます。
|
|
|
デフォルトの振る舞いは touched=false で、中心がジオメトリに含まれているピクセルを選択するだけです。 |
Enhanced: 3.5.0 - 引数 touched を追加。
Availability: 2.0.0
Enhanced: 2.1.0 C言語で記述されました
ここの例では、MassGIS サイト上の MassGIS Aerial Orthos にあるマサチューセッツ空中写真データを使っています。
Comparing selecting all touched vs. not all touched.
WITH source AS (
SELECT rast, geom
FROM ST_AsRaster(ST_Letters('R'), scalex =
> 1.0, scaley =
> -1.0) AS r(rast)
INNER JOIN ST_GeomFromText('LINESTRING(0 1,5 6,10 10)') AS g(geom)
ON ST_Intersects(r.rast, g.geom)
), clipped AS (
SELECT rast,
ST_Clip(rast, geom, touched =
> true) AS rast_touched,
ST_Clip(rast, geom, touched =
> false) AS rast_not_touched
FROM source
), variants AS (
SELECT 'original' AS title, ST_Count(rast) AS pixel_count, rast AS rendered
FROM clipped
UNION ALL
SELECT 'all touched', ST_Count(rast_touched), rast_touched
FROM clipped
UNION ALL
SELECT 'default clip', ST_Count(rast_not_touched), rast_not_touched
FROM clipped
)
SELECT title, pixel_count, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original' THEN 1
WHEN 'all touched' THEN 2
ELSE 3
END;
title | pixel_count | image --------------+-------------+---------------------------- original | 2605 | PNG image, 48 x 74 pixels all touched | 16 | PNG image, 11 x 11 pixels default clip | 10 | PNG image, 11 x 11 pixels (3 rows)
The following self-contained example uses three simple shapes as RGB bands. It compares cropping band 1, clipping band 1 without cropping and then restoring bands 2 and 3, and clipping every band without cropping.
WITH canvas AS (
SELECT ST_AddBand(
ST_AddBand(
ST_AddBand(
ST_MakeEmptyRaster(128, 128, 0, 128, 1, -1, 0, 0, 0),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
),
'8BUI'::text, 0::double precision, 0::double precision
) AS rast
), source AS (
SELECT ST_SetValue(
ST_SetValue(
ST_SetValue(rast, 1, ST_Buffer('POINT(32 96)'::geometry, 22), 220),
2, ST_Buffer('LINESTRING(18 20,110 110)'::geometry, 6,
'endcap=flat join=bevel'), 210
),
3, ST_Buffer('LINESTRING(10 48,118 48)'::geometry, 7,
'endcap=flat'), 180
) AS rast,
ST_Buffer('POINT(64 64)'::geometry, 34) AS clipper
FROM canvas
), variants AS (
SELECT 'original RGB' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'band 1 cropped', ST_Clip(rast, 1, clipper, true) FROM source
UNION ALL
SELECT
'band 1 only',
ST_AddBand(
ST_Clip(rast, 1, clipper, false),
ARRAY[ST_Band(rast, 2), ST_Band(rast, 3)]
)
FROM source
UNION ALL
SELECT 'all bands clipped', ST_Clip(rast, clipper, false) FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY CASE title
WHEN 'original RGB' THEN 1
WHEN 'band 1 cropped' THEN 2
WHEN 'band 1 only' THEN 3
ELSE 4
END;
title | image -------------------+----------------------------- original RGB | PNG image, 128 x 128 pixels band 1 cropped | PNG image, 68 x 68 pixels band 1 only | PNG image, 128 x 128 pixels all bands clipped | PNG image, 128 x 128 pixels (4 rows)
Crop, single-band clipping, and all-band clipping.
Source tile |
Cropped |
One-band source |
One-band clip |
All-band source |
All-band clip |