Saya mencoba menghitung statistik raster (min, maks, rata-rata) untuk setiap poligon dalam lapisan vektor menggunakan PostgreSQL / PostGIS.
Jawaban GIS.SE ini menjelaskan cara melakukan ini, dengan menghitung persimpangan antara poligon dan raster, lalu menghitung rata-rata tertimbang: https://gis.stackexchange.com/a/19858/12420
Saya menggunakan kueri berikut (di mana dem
raster saya, topo_area_su_region
adalah vektor saya, dan toid
merupakan ID unik:
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;
Ini berfungsi, tetapi terlalu lambat. Layer vektor saya memiliki fitur 2489k, dengan masing-masing membutuhkan sekitar 90 ms untuk diproses - akan butuh berhari - hari untuk memproses seluruh layer. Kecepatan perhitungan tampaknya tidak meningkat secara signifikan jika saya hanya menghitung min dan maks (yang menghindari panggilan ke ST_Area).
Jika saya melakukan perhitungan yang sama menggunakan Python (GDAL, NumPy dan PIL) saya dapat secara signifikan mengurangi jumlah waktu yang dibutuhkan untuk memproses data, jika alih-alih membuat vektor raster (menggunakan ST_Intersection) saya rasterize vektor. Lihat kode di sini: https://gist.github.com/snorfalorpagus/7320167
Saya tidak benar-benar membutuhkan rata-rata tertimbang - pendekatan "jika menyentuh, berarti" cukup baik - dan saya cukup yakin inilah yang memperlambat segalanya.
Pertanyaan : Apakah ada cara agar PostGIS berperilaku seperti ini? yaitu untuk mengembalikan nilai semua sel dari raster yang disentuh poligon, daripada persimpangan yang tepat.
Saya sangat baru di PostgreSQL / PostGIS, jadi mungkin ada hal lain yang tidak saya lakukan dengan benar. Saya menjalankan PostgreSQL 9.3.1 dan PostGIS 2.1 pada Windows 7 (2.9GHz i7, 8GB RAM) dan telah mengubah konfigurasi database seperti yang disarankan di sini: http://postgis.net/workshops/postgis-intro/tuning.html