Tôi đang cố gắng tính toán thống kê raster (tối thiểu, tối đa, trung bình) cho mỗi đa giác trong một lớp vectơ bằng PostgreQuery / PostGIS.
Câu trả lời này của GIS.SE mô tả cách thực hiện điều này, bằng cách tính toán giao điểm giữa đa giác và raster và sau đó tính trung bình có trọng số: https://gis.stackexchange.com/a/19858/12420
Tôi đang sử dụng truy vấn sau ( dem
raster của tôi ở đâu, topo_area_su_region
là vectơ của tôi và toid
là một ID duy nhất:
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;
Điều này hoạt động, nhưng nó quá chậm. Lớp vectơ của tôi có 2489k tính năng, với mỗi tính năng mất khoảng 90ms để xử lý - sẽ mất nhiều ngày để xử lý toàn bộ lớp. Tốc độ tính toán dường như không được cải thiện đáng kể nếu tôi chỉ tính toán tối thiểu và tối đa (tránh các cuộc gọi đến ST_Area).
Nếu tôi thực hiện một phép tính tương tự bằng Python (GDAL, NumPy và PIL), tôi có thể giảm đáng kể lượng thời gian cần thiết để xử lý dữ liệu, nếu thay vì vector hóa raster (sử dụng ST_Intersection) tôi sẽ quét vectơ. Xem mã tại đây: https://gist.github.com/snorfalorpagus/7320167
Tôi thực sự không cần một mức trung bình có trọng số - một cách tiếp cận "nếu nó chạm vào, nó là" đủ tốt - và tôi chắc chắn chắc chắn đây là điều đang làm mọi thứ chậm lại.
Câu hỏi : Có cách nào để khiến PostGIS hành xử như thế này không? tức là trả về các giá trị của tất cả các ô từ raster mà đa giác chạm vào, thay vì giao điểm chính xác.
Tôi rất mới với PostgreSQL / PostGIS, vì vậy có thể có điều gì đó khác mà tôi không làm đúng. Tôi đang chạy PostgreSQL 9.3.1 và PostGIS 2.1 trên Windows 7 (2.9GHz i7, RAM 8GB) và đã điều chỉnh cấu hình cơ sở dữ liệu như được đề xuất tại đây: http://postgis.net/workairs/postgis-intro/tuning.html