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