如何使用带有 R stars 包的多边形从栅格中提取值?
How to extract values from a raster using polygons with the R stars package?
使用 stars
包,st_extract()
函数可以在定义的位置从栅格中提取值。
library(stars)
#> Loading required package: abind
#> Loading required package: sf
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
tif <- system.file("tif/L7_ETMs.tif", package = "stars")
r <- read_stars(tif)
pnt <- st_sample(st_as_sfc(st_bbox(r)), 10)
st_extract(r[,,,1], pnt)
#> Simple feature collection with 10 features and 1 field
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 288937.2 ymin: 9112173 xmax: 298589.9 ymax: 9120349
#> projected CRS: UTM Zone 25, Southern Hemisphere
#> L7_ETMs.tif geometry
#> 1 64 POINT (294613.4 9117565)
#> 2 72 POINT (295130 9117225)
#> 3 94 POINT (298589.9 9116806)
#> 4 86 POINT (296430.2 9112864)
#> 5 87 POINT (297481.9 9115176)
#> 6 110 POINT (288937.2 9112173)
#> 7 63 POINT (290966.6 9116890)
#> 8 84 POINT (295595.5 9116938)
#> 9 73 POINT (291047.1 9120349)
#> 10 65 POINT (294525.2 9117110)
我想做的是在这些点周围使用缓冲区并提取缓冲区内的 mean
值。
创建缓冲区
poly <- st_buffer(pnt, dist = 100)
现在我们有了多边形
poly
#> Geometry set for 10 features
#> geometry type: POLYGON
#> dimension: XY
#> bbox: xmin: 288837.2 ymin: 9112073 xmax: 298689.9 ymax: 9120449
#> projected CRS: UTM Zone 25, Southern Hemisphere
#> First 5 geometries:
#> POLYGON ((294713.4 9117565, 294713.3 9117560, 2...
#> POLYGON ((295230 9117225, 295229.8 9117220, 295...
#> POLYGON ((298689.9 9116806, 298689.8 9116800, 2...
#> POLYGON ((296530.2 9112864, 296530.1 9112859, 2...
#> POLYGON ((297581.9 9115176, 297581.8 9115171, 2...
问题就在这里,st_extract()
函数只用点,不用多边形
st_extract(r[,,,1], poly)
#> Error in st_extract.stars(r[, , , 1], poly): all(st_dimension(pts) == 0) is not TRUE
有没有办法提取多边形下的信息?
由 reprex package (v1.0.0)
于 2021-02-19 创建
这可以用aggregate
来完成:
library(stars)
tif = system.file("tif/L7_ETMs.tif", package = "stars")
r = read_stars(tif)
pnt = st_sample(st_as_sfc(st_bbox(r)), 10)
poly = st_buffer(pnt, dist = 100)
# Extract average value per polygon
x = aggregate(r, poly, mean)
st_as_sf(x)
## Simple feature collection with 10 features and 6 fields
## geometry type: POLYGON
## dimension: XY
## bbox: xmin: 289038 ymin: 9111186 xmax: 298491.2 ymax: 9120605
## projected CRS: UTM Zone 25, Southern Hemisphere
## L7_ETMs.tif.V1 L7_ETMs.tif.V2 L7_ETMs.tif.V3 L7_ETMs.tif.V4 L7_ETMs.tif.V5
## 1 87.80556 78.38889 87.44444 69.13889 124.05556
## 2 59.31579 43.94737 33.34211 70.76316 63.65789
## 3 78.33333 64.25641 62.56410 57.00000 70.79487
## 4 70.87179 57.89744 55.35897 63.94872 88.87179
## 5 89.51282 78.12821 86.00000 64.28205 111.48718
## 6 83.28205 67.46154 67.38462 51.38462 86.12821
## 7 80.27027 70.81081 72.59459 77.51351 103.78378
## 8 74.91892 60.75676 54.05405 85.86486 90.00000
## 9 68.56410 59.74359 55.10256 78.23077 94.41026
## 10 74.86486 60.91892 62.35135 58.91892 102.29730
## L7_ETMs.tif.V6 geometry
## 1 98.41667 POLYGON ((295003.7 9116093,...
## 2 31.55263 POLYGON ((290092.1 9119590,...
## 3 50.64103 POLYGON ((294767 9112633, 2...
## 4 61.38462 POLYGON ((289238 9114301, 2...
## 5 90.94872 POLYGON ((298491.2 9120505,...
## 6 69.41026 POLYGON ((289770 9111286, 2...
## 7 73.64865 POLYGON ((294775.7 9117676,...
## 8 57.78378 POLYGON ((294266.6 9113127,...
## 9 56.92308 POLYGON ((293838.6 9118091,...
## 10 77.51351 POLYGON ((290557.6 9114384,...
请记住,如果多边形之间存在重叠(与此示例不同),则每个栅格值仅“计数”一次,在它落入的第一个多边形中(以符合 [=12 的普通行为=]).
使用 stars
包,st_extract()
函数可以在定义的位置从栅格中提取值。
library(stars)
#> Loading required package: abind
#> Loading required package: sf
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
tif <- system.file("tif/L7_ETMs.tif", package = "stars")
r <- read_stars(tif)
pnt <- st_sample(st_as_sfc(st_bbox(r)), 10)
st_extract(r[,,,1], pnt)
#> Simple feature collection with 10 features and 1 field
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 288937.2 ymin: 9112173 xmax: 298589.9 ymax: 9120349
#> projected CRS: UTM Zone 25, Southern Hemisphere
#> L7_ETMs.tif geometry
#> 1 64 POINT (294613.4 9117565)
#> 2 72 POINT (295130 9117225)
#> 3 94 POINT (298589.9 9116806)
#> 4 86 POINT (296430.2 9112864)
#> 5 87 POINT (297481.9 9115176)
#> 6 110 POINT (288937.2 9112173)
#> 7 63 POINT (290966.6 9116890)
#> 8 84 POINT (295595.5 9116938)
#> 9 73 POINT (291047.1 9120349)
#> 10 65 POINT (294525.2 9117110)
我想做的是在这些点周围使用缓冲区并提取缓冲区内的 mean
值。
创建缓冲区
poly <- st_buffer(pnt, dist = 100)
现在我们有了多边形
poly
#> Geometry set for 10 features
#> geometry type: POLYGON
#> dimension: XY
#> bbox: xmin: 288837.2 ymin: 9112073 xmax: 298689.9 ymax: 9120449
#> projected CRS: UTM Zone 25, Southern Hemisphere
#> First 5 geometries:
#> POLYGON ((294713.4 9117565, 294713.3 9117560, 2...
#> POLYGON ((295230 9117225, 295229.8 9117220, 295...
#> POLYGON ((298689.9 9116806, 298689.8 9116800, 2...
#> POLYGON ((296530.2 9112864, 296530.1 9112859, 2...
#> POLYGON ((297581.9 9115176, 297581.8 9115171, 2...
问题就在这里,st_extract()
函数只用点,不用多边形
st_extract(r[,,,1], poly)
#> Error in st_extract.stars(r[, , , 1], poly): all(st_dimension(pts) == 0) is not TRUE
有没有办法提取多边形下的信息?
由 reprex package (v1.0.0)
于 2021-02-19 创建这可以用aggregate
来完成:
library(stars)
tif = system.file("tif/L7_ETMs.tif", package = "stars")
r = read_stars(tif)
pnt = st_sample(st_as_sfc(st_bbox(r)), 10)
poly = st_buffer(pnt, dist = 100)
# Extract average value per polygon
x = aggregate(r, poly, mean)
st_as_sf(x)
## Simple feature collection with 10 features and 6 fields
## geometry type: POLYGON
## dimension: XY
## bbox: xmin: 289038 ymin: 9111186 xmax: 298491.2 ymax: 9120605
## projected CRS: UTM Zone 25, Southern Hemisphere
## L7_ETMs.tif.V1 L7_ETMs.tif.V2 L7_ETMs.tif.V3 L7_ETMs.tif.V4 L7_ETMs.tif.V5
## 1 87.80556 78.38889 87.44444 69.13889 124.05556
## 2 59.31579 43.94737 33.34211 70.76316 63.65789
## 3 78.33333 64.25641 62.56410 57.00000 70.79487
## 4 70.87179 57.89744 55.35897 63.94872 88.87179
## 5 89.51282 78.12821 86.00000 64.28205 111.48718
## 6 83.28205 67.46154 67.38462 51.38462 86.12821
## 7 80.27027 70.81081 72.59459 77.51351 103.78378
## 8 74.91892 60.75676 54.05405 85.86486 90.00000
## 9 68.56410 59.74359 55.10256 78.23077 94.41026
## 10 74.86486 60.91892 62.35135 58.91892 102.29730
## L7_ETMs.tif.V6 geometry
## 1 98.41667 POLYGON ((295003.7 9116093,...
## 2 31.55263 POLYGON ((290092.1 9119590,...
## 3 50.64103 POLYGON ((294767 9112633, 2...
## 4 61.38462 POLYGON ((289238 9114301, 2...
## 5 90.94872 POLYGON ((298491.2 9120505,...
## 6 69.41026 POLYGON ((289770 9111286, 2...
## 7 73.64865 POLYGON ((294775.7 9117676,...
## 8 57.78378 POLYGON ((294266.6 9113127,...
## 9 56.92308 POLYGON ((293838.6 9118091,...
## 10 77.51351 POLYGON ((290557.6 9114384,...
请记住,如果多边形之间存在重叠(与此示例不同),则每个栅格值仅“计数”一次,在它落入的第一个多边形中(以符合 [=12 的普通行为=]).