ฉันพยายามคำนวณสถิติแรสเตอร์ (ต่ำสุด, สูงสุด, ค่าเฉลี่ย) สำหรับแต่ละรูปหลายเหลี่ยมในเลเยอร์เวกเตอร์โดยใช้ PostgreSQL / PostGIS
คำตอบ GIS.SE นี้อธิบายวิธีการทำเช่นนี้โดยการคำนวณจุดตัดระหว่างรูปหลายเหลี่ยมและแรสเตอร์แล้วคำนวณค่าเฉลี่ยถ่วงน้ำหนัก: https://gis.stackexchange.com/a/19858/12420
ฉันใช้ข้อความค้นหาต่อไปนี้ (ซึ่งdem
เป็นแรสเตอร์topo_area_su_region
ของฉันคือเวกเตอร์ของฉันและtoid
เป็นรหัสเฉพาะ:
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)
ถ้าฉันทำการคำนวณที่คล้ายกันโดยใช้ Python (GDAL, NumPy และ PIL) ฉันสามารถลดระยะเวลาที่ใช้ในการประมวลผลข้อมูลได้อย่างมีนัยสำคัญหากแทนที่ vectorizing the raster (โดยใช้ ST_Intersection) ฉันจะทำให้ rasterize เวกเตอร์ ดูรหัสที่นี่: https://gist.github.com/snorfalorpagus/7320167
ฉันไม่ต้องการค่าเฉลี่ยถ่วงน้ำหนัก - "ถ้าสัมผัสก็อยู่ในแนวทาง" ดีพอ - และฉันก็แน่ใจว่านี่คือสิ่งที่ทำให้ช้าลง
คำถาม : มีวิธีใดบ้างที่จะให้ PostGIS ทำงานเช่นนี้ คือการส่งคืนค่าของเซลล์ทั้งหมดจากแรสเตอร์ที่รูปหลายเหลี่ยมสัมผัสแทนที่จะเป็นจุดตัดที่แน่นอน
ฉันยังใหม่กับ PostgreSQL / PostGIS ดังนั้นอาจมีบางอย่างที่ฉันทำไม่ถูก ฉันใช้ PostgreSQL 9.3.1 และ PostGIS 2.1 บน Windows 7 (2.9GHz i7, 8GB RAM) และได้ปรับแต่งการตั้งค่าฐานข้อมูลตามที่แนะนำไว้ที่นี่: http://postgis.net/workshops/postgis-intro/tuning.html