名前

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
Geometry figure for visual-rt-st-intersection-02