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, geometry geomin);
raster ST_Intersection(raster rast1, raster rast2, double precision[] nodataval);
raster ST_Intersection(raster rast1, raster rast2, text returnband, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, double precision[] nodataval);
raster ST_Intersection(raster rast1, integer band1, raster rast2, integer band2, text returnband, double precision[] nodataval);
二つのラスターの共有部分またはベクタ化したラスターとジオメトリーとのインタセクトした部分を表現する、ラスターまたはジオメトリーとピクセル値の組の集合を返します。
前半の三つの形式は、geomval の集合を返すもので、ベクター空間で動作します。ラスターは初めに geomval 行の集合にベクター化されます (ST_DumpAsPolygons を使用)。これらの行は PostGIS 関数の ST_Intersection(geometry, geometry) を使ってジオメトリーとインターセクトさせます。NODATA 値の領域とだけインターセクトするジオメトリーについては空ジオメトリーを返します。通常は WHERE 節で ST_Intersects を使って結果から確実に排除します。
丸括弧でくくって式の末尾に'.geom'や'.val'をつけることにより、geomval の結果集合のジオメトリーや値の部分にアクセスすることができます。たとえば(ST_Intersection(rast, geom)).geom 等とします。
他の形式は、ラスターを引数に取り、ラスターを返します。ST_MapAlgebraExpr の二つのラスタを取る形式を使って、インタセクトしている部分を取得します。
結果ラスターの範囲は、二つのラスターの範囲についてインタセクトしている部分です。結果ラスターは、returnband引数として渡されたものにあわせられた'BAND1','BAND2','BOTH'バンドを含みます。どのバンドでも NODATA 値の領域は、結果ラスターの全てのバンドの NODATA 値領域に現れます。言い換えると、あらゆる NODATA値ピクセルとインタセクトしているピクセルは、結果ラスターでは NODATA 値ピクセルになります。
インタセクトしなかった領域に NODATA 値を入れるために、ST_Intersection からの結果ラスターは、NODATA 値を持たなければなりません。結果ラスターのどのバンドにも、一つか二つの NODATA 値を持つnodataval[]配列を与えることで NODATA値を定義したり置き換えたりできます。この配列は、引数で与えた'BAND1','BAND2','BOTH'バンドに依存します。 配列の一つ目の値は、一つ目のバンドの NODATA 値を入れ替えるものです。二つ目の値は二つ目のバンドの NODATA 値を入れ替えるものです。入力バンドの一つが NODATA 値を持っておらず、かつ配列を渡さなかった場合には、ST_MinPossibleValue 関数を使って NODATA 値が選ばれます。NODATA 値の配列を受け付ける形式の全てが、単一値を受け付けます。単一値は結果ラスターのそれぞれのバンドに適用されます。
全ての形式で、バンド番号を指定していない場合には、1番と仮定します。ラスターとジオメトリを引数にとり、ラスターを得たい場合には、ST_Clipを参照して下さい。
|
|
|
結果範囲のより詳細な制御や NODATA 値の処理については、2ラスター版の ST_MapAlgebraExpr を使います。ジオメトリーとインターセクトするラスター空間を算出するには ST_Clip を使います。 テーブルデータから抽出する時には、ST_Intersects を併用して、ラスターカラムやジオメトリーカラムのインデックスを使います。 |
Enhanced: 2.0.0 - ラスター空間のインタセクションが導入されました。2.0.0より前の版では、ベクタ空間でのインタセクションの計算のみに対応していました。
SELECT
foo.rid,
foo.gid,
GeometryType((foo.geomval).geom) AS geom_type,
(foo.geomval).val AS value
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, 'LINESTRING(3427927.85 5793243.75,3427927.8 5793243.75,3427927.8 5793243.8)'::geometry),
(3, 'LINESTRING(1 2,3 4)'::geometry)
) As g(gid, geom)
WHERE A.rid = 2
) AS foo;
rid | gid | geom_type | value -----+-----+----------------------+------- 2 | 1 | POINT | 249 2 | 1 | POINT | 253 2 | 2 | POINT | 254 2 | 2 | POINT | 251 2 | 2 | POINT | 253 2 | 2 | LINESTRING | 252 2 | 2 | MULTILINESTRING | 250 2 | 3 | GEOMETRYCOLLECTION |
同じラインの例を共通の座標範囲内で描画をしています。ラスターの外郭と全ての入力ラインは、返却されるインターセクトする部分の背後で表示されています。
WITH source AS (
SELECT
rast,
ST_GeomFromText(
'LINESTRING(3427927.85 5793243.75,'
'3427927.8 5793243.75,3427927.8 5793243.8)'
) AS input_geometry
FROM dummy_rast
WHERE rid = 2
), intersection AS (
SELECT
rast,
input_geometry,
ST_Collect(gv.geom) AS result_geometry
FROM source
CROSS JOIN LATERAL ST_Intersection(rast, input_geometry) AS gv
GROUP BY rast, input_geometry
), layers AS (
SELECT
'raster' AS title,
ST_Translate(ST_Envelope(rast), -3427927.75, -5793243.75) AS geom
FROM intersection
UNION ALL
SELECT
'input',
ST_Translate(input_geometry, -3427927.75, -5793243.75)
FROM intersection
UNION ALL
SELECT
'intersection',
ST_Translate(result_geometry, -3427927.75, -5793243.75)
FROM intersection
)
SELECT title, geom AS geom
FROM layers
ORDER BY CASE title
WHEN 'raster' THEN 1
WHEN 'input' THEN 2
ELSE 3
END;
title | geom --------------+------------------------------------------------------------- raster | POLYGON((0 0,0 0.25,0.25 0.25,0.25 0,0 0)) input | LINESTRING(0.1 0,0.05 0,0.05 0.05) intersection | GEOMETRYCOLLECTION