Berechnung des Mittelwerts des Polygons aus dem Raster in PostGIS?

8

Ich begann mit einer NetCDF-Rasterdatei .gri und .grd aus Großbritannien, die von einem Kollegen bereitgestellt wurde. Ich habe es in R abgeschnitten, um nur London zu sein, es exportiert und in eine ASC-Datei konvertiert und es dann mit den folgenden Befehlen in R in PostGIS importiert:

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")

Und dann auf der Ubuntu-Kommandozeile:

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

Ich habe jetzt eine Rastertabelle in PostGIS. Die SRID von 10001 wird übrigens wiederum von einem Kollegen bereitgestellt:

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');

In derselben Datenbank habe ich eine Polygondatei, SRID 27700, die London abdeckt. Ich möchte den Durchschnittswert innerhalb jedes Polygons aus dem Raster berechnen.

Ich versuche so etwas, aber es ist nicht richtig:

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

Wie würde ich bitte vorgehen?

Es scheint, dass das Polygon und das Raster richtig ausgerichtet sind. Ich denke, ich muss beide in WGS84 konvertieren.

Raster mit Polygonen, angezeigt in QGIS

TheRealJimShady
quelle
Beachten Sie ein ziemliches Duplikat, aber Ihre Antwort ist wahrscheinlich hier: stackoverflow.com/questions/24083732/…
GIS-Jonathan
Hmmm. Vielen Dank an GIS-Jonathan, aber ich habe Mühe, das in meinen Datensatz / meine Situation zu übersetzen. Ich versuche so etwas, aber es ist nicht richtig (Frage oben bearbeitet, um es aufzunehmen)
TheRealJimShady
Wenn Sie noch keine Lösung haben, kann es sich lohnen, auf der PostGIS-Liste nachzufragen.
GIS-Jonathan
1
Ich denke, das könnte für Sie interessant sein: gis.stackexchange.com/questions/76522/… . Eine genaue, aber langsame Abfrage in der Frage und eine schnelle, weniger genaue Abfrage in meiner Antwort. Weitere Informationen auch hier: postgis.net/docs/RT_ST_SummaryStats.html (PostGIS Doc !!!). Literatur: PostGIS-Kochbuch. Paolo Corti et al. !!!
Stefan

Antworten:

6

Dank des gestrigen Kommentars von Stefan kann ich aus verwandten Fragen und der offiziellen Dokumentation etwas zusammenstellen und eine Reihe von Lösungen anbieten.

PostGIS-Dokumentation ( ST_SummaryStats)

Fassen Sie Pixel zusammen, die interessierende Gebäude schneiden

Dieses Beispiel dauerte unter PostGIS-Fenstern 64-Bit 574 ms mit allen Boston Buildings und Antennenkacheln (Kacheln mit jeweils 150 x 150 Pixel ~ 134.000 Kacheln), ~ 102.000 Gebäudeaufzeichnungen

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

Vermeiden ST_Intersectionfür Leistung

Beachten Sie, dass dies weniger genau ist, da sich überschneidende Pixel, die weniger als 50% einer sich überschneidenden Geometrie abdecken, ignoriert werden.

Stefan hat hier eine Antwort , die das vermeidet ST_Intersection.

Anmerkungen

  • In dieser Frage und im PostGIS WKT-Raster-Tutorial finden Sie möglicherweise auch einige nützliche Tipps .
  • Wenn Ihr Raster gekachelt ist, ist es eine gute Faustregel , kleinere Kacheln zu verwenden und zu versuchen, sie etwas größer als ein typisches Vektor-Feature zu machen, das Sie schneiden.
alphabetasoup
quelle