PostGIS 래스터 요약 (맵 대수)


14

특정 일의 여행 시간 이소 크론을 나타내는 다각형 표가 있습니다. 각 원점에 대해 5 개의 isochrone 지오메트리가 있습니다 (별개의 행에 저장 됨). 각 원점에 대해 5 개의 이소 크론 (2 진 NULL 또는 1)을 래스터 화 한 다음 단일 래스터 레이어로 결합하려고합니다. 이 래스터 레이어에는 간단한 대수 맵 : sum / 5가 필요합니다. 따라서 각 원점은 결국 몇 개의 구성 층이 겹칩니다. 확률 표면입니다.

내 데이터는 모두 Postgres 9.3 (PostGIS 포함)에 저장됩니다. 내 문제는 PostGIS 래스터 사용을 배우고 싶지만 실제로는 가파른 학습 곡선을 가지고 있으며 단일 래스터 레이어를 다룰 수있는 모든 예제가 있다는 것입니다. 예제에서이 레이어는 다각형 오버레이의 일부로 사용되며 각 다각형의 래스터 값을 평균화합니다. 나는 a) vector-> raster b) map algebra;를 결합하는 복제 가능한 예제를 찾지 못했다. 그리고 c) 첫 번째 단락에 따른 GROUP BY 속성.

이 작업을 수행하려면 GDAL 또는 GRASS를 사용하는 것이 좋지만 PostGIS가 처리 할 수있는 것 같습니다. 입력 데이터가 이미 PostGIS 지오메트리 인 경우 편리합니다. 나는 정말 PostGIS와 래스터와 조건에오고 싶어.

일부 샘플 데이터 구조 :

areaid    time        date          isogeom (polygon)
1000      07:15:00    2014-05-05    xxx
1000      07:15:00    2014-05-06    xxy
...
1006      07:15:00    2014-05-05    zzz

래스터 화하고 areaid별로 그룹화 한 다음지도 대수를 수행하여 다음을 수행하려고합니다.

areaid    isorast (raster)
1000      aaa
1006      bbb

PostGIS에 이것을 포함시키지 못했습니다. 내 접근 방식은 벡터를 래스터로 변환하고 래스터를 배열로 덤프하고 psycopg2를 통해 numpy 배열과의 조합을 수행하여 GeoTIFF에 쓰는 것입니다 (PostGIS에 다시 넣을 수 있음). 이상적이지는 않지만 가능합니다.


1
멋진 질문입니다. 나는 postgis 래스터 느낌을 정말로 배워야하며 당신이 원하는 것이 가능하다는 것을 확신합니다. 슬프게도 오늘 너무 바빠서 갈 수 없습니다.
John Powell

1
BostonGIS 블로그 에는 대수학에 관한 상당히 하드 코어 기사가 있습니다 . 이 블로그의 저자는 Postgis의 많은 래스터 기능을 갖춘 Postgis in Action의 훌륭한 저서이기도합니다. 죄송하지만 더 직접적인 예를 찾지 못했습니다.
John Powell

답변:


3

고유 한 집계 함수를 작성해야합니다.

CREATE OR REPLACE function sum_raster_state(raster, raster)
returns raster
language sql
as $f$

SELECT
CASE $1
WHEN NULL THEN
      $2
ELSE
    ST_MapAlgebra(
        $1, 
        $2, 
        '([rast1] + [rast2])', 
        NULL, 
        'UNION', 
        '[rast2]', 
        '[rast1]', 
        NULL)
END;
$f$;

CREATE OR REPLACE FUNCTION sum_raster_final(raster)
returns raster
language sql
as $f$
SELECT 
   $1
$f$;

create aggregate sum_raster(raster) (
    SFUNC = sum_raster_state,
    STYPE = raster,
    FINALFUNC = sum_raster_final
);

나중에 당신은 이것을 이렇게 부를 수 있습니다

SELECT areaid, sum_raster(st_asraster(isogeom, ...)) FROM isochrone GROUP BY areaid

이것은 동일한 지역 ID를 가진 모든 래스터의 합계를 제공합니다. 그래도 래스터 값을 각 영역 ID의 관측치 수로 나눠야합니다. (집계 함수에 포함하지 않았습니다. MapAlegbra를 사용하여 여기에서 또는 나중에 수행 할 수 있습니다)

입력 래스터가 모두 정렬되어 있는지 확인하십시오. 그렇지 않으면 작동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.