Tính giá trị trung bình của đa giác từ raster trong PostGIS?


8

Tôi bắt đầu với một tệp raster NetCDF .gri và .grd của Vương quốc Anh do một đồng nghiệp cung cấp. Tôi đã cắt nó ở R để chỉ London, xuất và chuyển đổi thành tệp ASC, sau đó nhập nó vào PostGIS bằng các lệnh sau trong R:

library(raster)
uk_raster <- raster("AnnMean2011.grd")
london_area <- extent(-720000.0,-630000.0,-50000.0,25000)
london_raster  <- crop(uk_raster, london_area)
writeRaster(london_raster, filename="AnnMean2011.asc", format="ascii")

Và sau đó trên dòng lệnh Ubuntu:

raster2pgsql -I -C -s 10001 -t 20x20 AnnMean2011.asc annualmean | psql -d james_traffic

Bây giờ tôi có một bảng raster trong PostGIS. Nhân tiện, SRID của 10001 là một lần nữa, được cung cấp bởi một đồng nghiệp:

INSERT INTO spatial_ref_sys(srid, auth_name, auth_srid, proj4text)
VALUES (10001,'CMAQ_Urban',10001,'+proj=lcc +a=6370000 +b=6370000 +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=000000 +y_0=00000');

Trong cùng một cơ sở dữ liệu, tôi có một tệp đa giác, SRID 27700, bao gồm Luân Đôn. Tôi muốn tính giá trị trung bình trong mỗi đa giác, từ raster.

Tôi đang thử một cái gì đó như thế này, nhưng nó không đúng:

select polygons.postcode, avg(st_value(joined_data.rast))
    from (
       select (ST_Intersection(raster.rast, 1, polygons.geom)).*
    from raster, polygons 
       where ST_Intersects(raster.rast, 1, polygons.geom)
  ) joined_data
group by polygons.postcode

Làm thế nào tôi sẽ đi về điều này xin vui lòng?

Dường như để có được đa giác và raster được căn chỉnh chính xác, tôi phải chuyển đổi cả hai thành WGS84 tôi nghĩ.

Raster với đa giác, được xem trong QGIS


Lưu ý khá trùng lặp, nhưng câu trả lời của bạn có lẽ là ở đây: stackoverflow.com/questions/24083732/NH
GIS-Jonathan

Hừm. Cảm ơn GIS-Jonathan, nhưng tôi đang vật lộn để dịch nó vào tập dữ liệu / tình huống của tôi. Tôi đang thử một cái gì đó như thế này nhưng nó không đúng (câu hỏi được chỉnh sửa ở trên để bao gồm nó)
TheRealJimShady

Nếu bạn vẫn chưa có giải pháp, có thể đáng để hỏi trong danh sách PostGIS.
GIS-Jonathan

1
Tôi nghĩ rằng điều này có thể thú vị cho bạn: gis.stackexchange.com/questions/76522/iêu . Một truy vấn chính xác nhưng chậm trong câu hỏi và một truy vấn nhanh, ít chính xác hơn trong câu trả lời của tôi. Thông tin chi tiết cũng ở đây: postgis.net/docs/RT_ST_SummaryStats.html (PostGIS Doc !!!). Lít: PostGIS Cookbook. Paolo Corti và cộng sự !!!
Stefan

Câu trả lời:


6

Nhờ nhận xét từ Stefan ngày hôm qua, tôi nghĩ rằng tôi có thể kết hợp một vài thứ từ các câu hỏi liên quan và tài liệu chính thức và đưa ra một loạt các giải pháp.

Tài liệu PostGIS ( ST_SummaryStats)

Tóm tắt các pixel giao nhau giữa các tòa nhà quan tâm

Ví dụ này mất 574ms trên các cửa sổ PostGIS 64 bit với tất cả các Tòa nhà và Gạch trên không của Boston (mỗi lát 150x150 pixel ~ 134.000 gạch), ~ 102.000 hồ sơ tòa nhà

WITH 
-- our features of interest
   feat AS (SELECT gid As building_id, geom_26986 As geom FROM buildings AS b 
    WHERE gid IN(100, 103,150)
   ),
-- clip band 2 of raster tiles to boundaries of builds
-- then get stats for these clipped regions
   b_stats AS
    (SELECT  building_id, (stats).*
FROM (SELECT building_id, ST_SummaryStats(ST_Clip(rast,2,geom)) As stats
    FROM aerials.boston
        INNER JOIN feat
    ON ST_Intersects(feat.geom,rast) 
 ) As foo
 )
-- finally summarize stats
SELECT building_id, SUM(count) As num_pixels
  , MIN(min) As min_pval
  , MAX(max) As max_pval
  , SUM(mean*count)/SUM(count) As avg_pval
    FROM b_stats
 WHERE count > 0
    GROUP BY building_id
    ORDER BY building_id;

 building_id | num_pixels | min_pval | max_pval |     avg_pval
-------------+------------+----------+----------+------------------
         100 |       1090 |        1 |      255 | 61.0697247706422
         103 |        655 |        7 |      182 | 70.5038167938931
         150 |        895 |        2 |      252 | 185.642458100559

Tránh ST_Intersectionđể thực hiện

Lưu ý rằng điều này ít chính xác hơn, với các pixel giao nhau bao phủ ít hơn 50% hình học giao nhau bị bỏ qua.

Stefan có một câu trả lời ở đây là tránh ST_Intersection.

Ghi chú

  • Bạn cũng có thể tìm thấy một số lời khuyên hữu ích trong câu hỏi này và hướng dẫn raster PostGIS WKT .
  • Nếu raster của bạn được lát gạch, một nguyên tắc nhỏ là sử dụng các ô nhỏ hơn, cố gắng làm cho chúng lớn hơn một chút so với tính năng vectơ thông thường mà bạn đang giao nhau.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.