Name

ST_MapAlgebraFctNgb — 래스터 밴드 1개 버전: 사용자 지정 PostgreSQL 함수를 이용하는 맵 대수 최근접 이웃(Map Algebra Nearest Neighbor)입니다. 입력 래스터 밴드의 값의 이웃(neighborhood)이 관련된 PostgreSQL 사용자 함수가 출력하는 값을 가진 래스터를 반환합니다.

Synopsis

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

설명

[Warning]

ST_MapAlgebraFctNgb 2.1.0 버전부터 더 이상 이 함수를 지원하지 않습니다. 대신 ST_MapAlgebra (callback function version) 함수를 이용하십시오.

래스터 1개 버전: 입력 래스터 밴드 값의 이웃(neighborhood)이 관련된 PostgreSQL 사용자 함수가 출력하는 값을 가진 래스터를 반환합니다. 사용자 함수가 픽셀의 이웃 값을 숫자의 배열로 입력받아, 각 픽셀에 대해 사용자 함수의 결과값을 반환해서, 현재 처리중인 픽셀의 픽셀 값을 함수 결과값으로 대체합니다.

rast

사용자 함수를 평가하는 데 쓰이는 래스터

band

평가할 래스터 밴드 번호(기본값은 1)

pixeltype

출력 래스터의 픽셀 유형입니다. 이 유형은 ST_BandPixelType 목록에 존재하는 유형 가운데 하나이거나, 생략되거나, NULL로 설정돼야만 합니다. 따로 설정하지 않거나 NULL로 설정하지 않으면, rast의 픽셀 유형을 기본값으로 삼을 것입니다. 결과값이 픽셀 유형의 허용치보다 클 경우 결과값의 길이를 허용치에 맞춰 줄입니다.

ngbwidth

이웃(neighborhood)의 셀 단위 너비

ngbheight

이웃(neighborhood)의 셀 단위 높이

onerastngbuserfunc

래스터의 단일 밴드의 근접 픽셀에 적용할 PL/pgSQL 또는 psql 사용자 함수입니다. 첫 번째 요소가 사각형 픽셀 이웃을 표현하는 2차원 숫자 배열입니다.

nodatamode

NODATA 또는 NULL인 이웃 픽셀의 경우 함수에 어떤 값을 넘겨줄지 정의합니다.

'ignore': 이웃에서 맞닥뜨린 어떤 NODATA 값도 계산을 통해 무시합니다. 사용자 콜백 함수에 이 플래그를 전송해야만 하며, 사용자 함수는 NODATA 값을 어떻게 무시할 것인지 결정합니다.

'NULL': 이웃에서 맞닥뜨린 모든 NODATA 값이 출력 픽셀을 NULL로 만들 것입니다. 이 경우 사용자 콜백 함수를 건너뜁니다.

'value': 이웃에서 맞닥뜨린 어떤 NODATA 값도 참조 픽셀(이웃의 한가운데 있는 픽셀)로 대체합니다. 이 값이 NODATA일 경우, (영향을 받는 이웃에 대해) 'NULL'과 동일한 습성을 보인다는 점에 주의하십시오.

args

사용자 함수로 넘겨줄 인수들

2.0.0 버전부터 사용할 수 있습니다.

예시

다음 예시는 http://trac.osgeo.org/gdal/wiki/frmts_wtkraster.html 에서 설명하는 대로 단일 타일로 불러온 다음 ST_Rescale 예시 대로 준비한 카트리나 래스터를 활용합니다.

--
-- 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;
                    

래스터의 첫 번째 밴드

각각 서로의 4x4 픽셀 거리 안에 있는 픽셀들을 평균낸 후의 새 래스터

참고

ST_MapAlgebraFct, ST_MapAlgebraExpr, ST_Rescale