Ich habe ein Raster (der Klasse "RasterLayer"), das zählt Leute, N. Ich habe Polygone administrative Grenzen (der Klasse "SpatialPolygonsDataFrame").Wie kann ich eine flächengewichtete Summe aus einem Raster in ein Polygon in R extrahieren?
Ich möchte die Werte aus der Raster-Ebene in die Polygone extrahieren, und zwar in einer Weise, die durch den Anteil der Fläche des Raster-Kachels, der das Polygon überlagert, gewichtet wird. Angenommen, es gibt vier Rasterkacheln, deren Werte (4, 8, 12, 16) ein einzelnes Polygon überlappen. Wenn 25% jedes Rasters mit dem Polygon überlappt, würde ich erwarten, dass ihre Beiträge zur Polygonsumme (1, 2, 3, 4) betragen und die gewichtete Gesamtsumme, die in dieses Polygon extrahiert wird, im Wesentlichen gleich 10 ist ich möchte folgendes erreichen:
some_polygons$n_people = extract(count_raster$n_people,
some_polygons,
fun=sum,
weights=T,
na.rm=T)
Allerdings, wenn ich diesen Befehl in R ausführen, erhalte ich folgendes:
„Warnmeldung: in .local (x, y,. ..): "Spaß" wurde auf "Mittelwert" geändert, andere Funktionen können nicht verwendet werden, wenn "Gewichte = WAHR" "
R wird zwangsweise auf fun = Mittelwert geändert, wenn die Gewichte verwendet werden. Ich muss Gewichte verwenden, um den Anteil des Rasters zu berücksichtigen, der in das Polygon fällt, aber ein Mittelwert lässt mich nicht die Menge berechnen, die ich möchte. Ich muss einen Weg finden, die Anzahl N im Raster zu addieren, gewichtet nach der Fläche im Raster, die in das Polygon fällt (eine gewichtete Summe, NICHT ein gewichteter Durchschnitt). Weiß jemand, wie ich das erreichen kann?
Ich bin glücklich zu versuchen, andere räumliche Datenklassen zu verwenden, um dies zum Funktionieren zu bringen. Ich habe versucht, das Raster als SpatialPixels
, SpatialPoints
und SpatialGrid
darzustellen und mit der sp::over()
Funktion zu arbeiten, aber konnte nicht herausfinden, wie man die gewichtete Summe berechnet, die ich benötige. Hilfe wird sehr geschätzt!
Gute Antwort. Dazu: "Wichtig: Sie benötigen mindestens eine vollständig geschlossene Zelle, also stellen Sie sicher, dass die Auflösung Ihres Rasters hoch genug ist, verglichen mit der Größe Ihres Polygons.", Kann wahrscheinlich vermieden werden, indem der Parameter 'small' auf TRUE gesetzt wird . – lbusett
Vielen Dank für Ihre Hilfe - das ist genau das, was ich brauchte. Um dies für den Fall robust zu machen, wo es keine vollständig geschlossene Zelle gibt, habe ich Ihre Lösung wie folgt angepasst: 'myextr = as.data.frame (extrahieren (N, poly, Gewichte = TRUE, normalizeWeights = FALSE)) ' ' mywsum = Summe (myextr $ Wert * myextr $ Gewicht) ' Dies führt zu der gleichen Antwort, aber es macht es so, dass Sie die Gewichte nicht durch die max. – epsilon47
Sie sind völlig richtig, @ epsilon47. Ich hatte dieses Argument in meiner Version des 'raster'-Pakets eigentlich nicht, daher war ich mir dessen nicht bewusst. Ich habe meine Antwort entsprechend angepasst, da dies definitiv das Problem löst. Gut, dass 'raster' sich immer noch verbessert! – ztl