PostGIS에서 래스터 통계 계산 성능


9

PostgreSQL / PostGIS를 사용하여 벡터 레이어의 각 다각형에 대한 래스터 통계 (최소, 최대, 평균)를 계산하려고합니다.

이 GIS.SE 답변은 다각형과 래스터 사이의 교점을 계산 한 다음 가중 평균을 계산하여이 작업을 수행하는 방법을 설명합니다. https://gis.stackexchange.com/a/19858/12420

다음 쿼리를 사용하고 있습니다 ( dem래스터는 어디에 topo_area_su_region있고 벡터이며 toid고유 ID입니다).

SELECT toid, Min((gv).val) As MinElevation, Max((gv).val) As MaxElevation, Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation FROM (SELECT toid, ST_Intersection(rast, geom) AS gv FROM topo_area_su_region,dem WHERE ST_Intersects(rast, geom)) foo GROUP BY toid ORDER BY toid;

이것은 작동하지만 너무 느립니다. 내 벡터 레이어에는 2489k 기능이 있으며 각 레이어는 처리 하는 데 약 90ms 가 걸립니다 . 전체 레이어를 처리하는 데 며칠 이 걸립니다 . 최소 및 최대 만 계산하면 계산 속도가 크게 향상되지 않는 것 같습니다 (ST_Area에 대한 호출을 피함).

파이썬 (GDAL, NumPy 및 PIL)을 사용하여 비슷한 계산을 수행하면 래스터를 벡터화하는 대신 (ST_Intersection을 사용하여) 벡터를 래스터 화하면 데이터를 처리하는 데 걸리는 시간을 크게 줄일 수 있습니다. 여기 코드를 참조하십시오 : https://gist.github.com/snorfalorpagus/7320167

나는 실제로 가중 평균이 필요하지 않습니다. "만지면"만들면 "접근이 충분합니다. 그리고 이것이 이것이 상황을 늦추고있는 것이라 확신합니다.

질문 : PostGIS가 이와 같이 동작하도록하는 방법이 있습니까? 즉, 정확한 교차점이 아닌 다각형이 닿는 래스터의 모든 셀 값을 반환합니다.

PostgreSQL / PostGIS를 처음 접했기 때문에 제대로 수행하지 않는 다른 것이있을 수 있습니다. Windows 7 (2.9GHz i7, 8GB RAM)에서 PostgreSQL 9.3.1 및 PostGIS 2.1을 실행 중이며 여기에 제안 된대로 데이터베이스 구성을 조정했습니다 : http://postgis.net/workshops/postgis-intro/tuning.html

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


1
내 답변을 편집했습니다. 내 대답의 교차점이 덜 정확하다는 것을 잊어 버렸습니다.
Stefan

답변:


11

당신이 맞습니다, ST_Intersection당신의 쿼리 속도가 현저하게 느려집니다.

사용하는 대신 ST_Intersection이 (클립하는 것이 좋습니다 ST_Clip) 다각형 (밭)와 래스터 및 다각형과 같은 결과를 덤프 ( ST_DumpAsPolygons). 따라서 모든 래스터 셀은 고유 한 값을 가진 작은 다각형 사각형으로 변환됩니다.

덤프에서 최소, 최대 또는 평균을 수신하는 경우 동일한 명령문을 사용할 수 있습니다.

이 쿼리는 트릭을 수행해야합니다.

SELECT 
    toid,
    Min((gv).val) As MinElevation,
    Max((gv).val) As MaxElevation,
    Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation
FROM (
    SELECT 
        toid,
        ST_DumpAsPolygons(ST_Clip(rast, 1, geom, true)) AS gv
    FROM topo_area_su_region,dem 
        WHERE ST_Intersects(rast, geom)) AS foo 
            GROUP BY toid 
            ORDER BY toid;

명령문 ST_Clip에서 래스터, 래스터 밴드 (= 1), 다각형 및 자르기 가 참 또는 거짓이어야하는지 정의합니다.

또한 avg((gv).val)평균값을 계산하는 데 사용할 수 있습니다 .

편집하다

접근 방식의 결과가 더 정확하지만 느립니다. 크기의 50 % 미만 (또는 51 %)과 교차하는 래스터 셀 의 조합 ST_ClipST_DumpAsPolygons무시 결과 는 무시됩니다.

CORINE Land Use 교차로의이 두 스크린 샷은 차이점을 보여줍니다. 와 첫 번째 사진 ST_Intersection과 두 번째 ST_ClipST_DumpAsPolygons.

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

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

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