PostGIS를 사용하여 래스터와 다각형 교차하기-인공물 오류


15

PostGIS2.0 을 사용하여 래스터 / 폴리곤 교차를 수행하고 있습니다. 사용해야하는 작업과이를 수행하는 가장 빠른 방법을 이해하는 데 어려움이 있습니다. 내 문제는 다음과 같습니다.

  • 다각형과 래스터가 있습니다
  • 다각형에 속하는 모든 픽셀을 찾고 픽셀 값의 합계를 얻고 싶습니다.
  • 그리고 (업데이트 된 문제) : 쿼리를 수행 할 때 원래 래스터에 존재하지 않는 일부 픽셀에 대해 막대한 값을 얻습니다.

내가 사용할지 여부 어려움을 인식하지 못했습니다 ST_Intersects()ST_Intersection(). 또한 내 픽셀을 합산하는 가장 좋은 방법이 무엇인지 모르겠습니다. 내가 시도한 첫 번째 접근법은 다음과 같습니다 (# 1).

SELECT 
    r.rast 
FROM
    raster as r, 
    polygon as p
WHERE
    ST_Intersects(r.rast, p.geom)

이것은 rast무엇을 해야할지 잘 모르는 값 목록을 반환합니다 . 를 사용하여 요약 통계를 계산하려고 시도했지만 ST_SummaryStats()이것이 다각형 내에있는 모든 픽셀의 가중치 합계인지 확실하지 않습니다.

SELECT  
        (result).count,
        (result).sum    
FROM (  
         SELECT 
            ST_SummaryStats(r.rast) As result
         FROM
            raster As r, 
            polygon As p
         WHERE
            ST_Intersects(r.rast, p.geom)    
    ) As tmp

내가 시도한 다른 접근법 (# 2)은 ST_Intersection()다음을 사용합니다 .

 SELECT
        (gv).geom,         
        (gv).val
 FROM 
 (
    SELECT 
        ST_Intersection(r.rast, p.geom) AS gv
    FROM 
        raster as r, 
        polygon as p           
    WHERE 
        ST_Intersects(r.rast, p.geom)

      ) as foo;

이것은 내가 더 분석 한 기하학 목록을 반환하지만 이것이 덜 효율적이라고 가정합니다.

어느 것이 가장 빠른 작동 순서인지 확실하지 않습니다. 항상 또는를 선택 raster, polygon하거나 polygon, raster다각형을 래스터로 변환하여 다각형으로 변환 해야합니까 raster, raster?

편집 : R.K.의 링크 에서 일부 세부 사항으로 접근법 2를 업데이트했습니다 .

접근법 # 2를 사용하여 결과를 이해하지 못하는 이유의 일부인 결과에서 다음 오류를 발견했습니다. 다음은 원래 래스터의 이미지와 교차하는 데 사용되는 다각형의 개요입니다.

여기에 이미지 설명을 입력하십시오

PostGIS를 사용한 교차 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

결과의 문제점은 원래 래스터에없는 21474836 값이 리턴된다는 것입니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. 어딘가 작은 숫자 (거의 0으로 나눔)와 관련이 있다고 생각하지만 잘못된 결과를 반환합니다.


점 2와 관련하여 다각형과 교차하는 픽셀 값의 합계를 얻으려고합니까?
RK

예, ST_SummaryStats()# 1에 사용했지만 # 2에 사용하는 방법을 잘 모르겠습니다.
djq

참조에 대한 링크를 게시했습니다. 도움이 되길 바랍니다.
RK

2
지도에서 눈금의 최대 값은 최대 32 비트 부호있는 정수입니다. 귀하의 경우 그것이 무엇을 의미하는지는 모르지만 NA 값과 관련이 있습니다. 쿼리 범위에 제대로 처리되지 않은 null 값이있을 수 있습니다. en.wikipedia.org/wiki/2147483647#2147483647_in_computing
yellowcap

6
FWIW, 21474836은 부호있는 32 비트 int의 최대 값 이 아닙니다 . 그러나 2 ^ 31-1 = 2147483647 최대 값이며 21474836 = 2147483647/100 (정수 나누기)입니다. 이것은 내부적으로 일부 NA가 생성되고 (아마도 경계 셀을 따라) 2 ^ 31-1로 표시되며, 코드는 NA를 잊어 버리고 (아마 리샘플링 과정에서) 100으로 나눕니다.
whuber

답변:


6

PostGIS WKT Raster를 사용하여 래스터 범위가 큰 벡터 다각형 교차 에 대한 자습서를 찾았습니다 . 찾고있는 답변이있을 수 있습니다.

이 튜토리얼에서는 다각형을 만들기 위해 버퍼링 된 점 모양 파일과 일련의 13 SRTM 고도 래스터를 사용하여 두 개의 데이터 세트를 사용했습니다. 그 사이에 많은 단계가 있었지만 래스터와 벡터를 교차시키는 데 사용되는 쿼리는 다음과 같습니다.

 CREATE TABLE caribou_srtm_inter AS
 SELECT id, 
        (gv).geom AS the_geom, 
        (gv).val
 FROM (SELECT id, 
              ST_Intersection(rast, the_geom) AS gv
       FROM srtm_tiled,
            cariboupoint_buffers_wgs
       WHERE ST_Intersects(rast, the_geom)
      ) foo;

그런 다음 다음을 사용하여 값을 요약했습니다.

 CREATE TABLE result01 AS
 SELECT id, 
        sum(ST_Area(ST_Transform(the_geom, 32198)) * val) / 
        sum(ST_Area(ST_Transform(the_geom, 32198))) AS meanelev
 FROM caribou_srtm_inter
 GROUP BY id
 ORDER BY id;

나는 이것을 설명하기에 충분한 PostGIS를 모른다. 그러나 그것은 당신이 성취하려고했던 것과 같은 소리가 들린다. 이 자습서는 중간 단계에 대한 정보를 제공해야합니다. 행운을 빕니다 :)


감사합니다 @ RK 나는 그 튜토리얼을 읽었습니다. 내 계산이 더 기본적이라고 생각하지만 여전히이 기본 단계를 파악하고 있습니다!
djq

2

원래 질문의 포인트 2와 관련하여 postgis 2.0 개발 릴리스 중 일부는 부동 소수점을 정수로 캐스팅하는 GDAL 라이브러리 버전을 사용했습니다. 래스터에 부동 값이 있고 1.9.0보다 낮은 GDAL 버전 또는 GDALFPolygonize ()를 제대로 호출하지 않은 PostGIS 2.0 시험판 버전을 사용하는 경우이 버그가 발생할 수 있습니다. PostGISGDAL 버그 추적기 의 티켓 이 제출되고 마감되었습니다. 이 버그는 원래 질문 당시에 활성화되었습니다.

성능면에서을 사용하는 것보다을 사용하는 ST_Intersects(raster, geom)것이 훨씬 빠릅니다 ST_Intersects(geom, raster). 첫 번째 버전은 형상을 래스터 화하고 래스터 공간 교차를 수행합니다. 두 번째 버전은 지오메트리를 벡터화하고 벡터 공간 교차점을 수행하므로 훨씬 비싼 프로세스가 될 수 있습니다.


0

ST_SummaryStats와 함께 사용 하는 데 이상한 문제가 발생 했습니다 ST_Clip. 데이터를 다르게 쿼리하면 래스터의 최소값이 32이고 최대 300 ST_SummaryStats이었지만 대상 다각형의 픽셀 값에 대해 -32700을 반환했습니다.

나는이 문제를 다음과 같이 해킹했다.

WITH first AS (
   SELECT id, (ST_Intersection(geom, rast)).val
   FROM raster_table
   INNER JOIN vector_table ON ST_Intersects(rast, geom)
)
SELECT id, COUNT(val), SUM(val), AVG(val), stddev(val), MIN(val), MAX(val)
FROM first
GROUP BY id
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.