我正在尝试为一个州采集土壤数据栅格,按县裁剪,更改每个县的单元格值(到县fips代码),然后将县栅格重新合并回状态栅格。
这里我读取状态土壤栅格(默认情况下,作为与每种土壤类型相关联的地图单位键作为单元格值)和美国县的多边形。然后,我选择一个状态的多边形,将其转换为与土壤栅格相同的坐标系,然后选择土壤栅格和多边形两个示例县。
state_soils_raster <- raster("MapunitRaster_IL_10m.tif")
us_county_polygons <- readOGR("cb_2016_us_county_500k/cb_2016_us_county_500k.shp")
IL_county_polygons <- us_county_polygons[us_county_polygons$STATEFP == 17,]
IL_county_polygons <- spTransform(IL_county_polygons, CRS = crs(state_soils_raster))
county1 <- "Douglas"
county2 <- "Coles"
county1_polygon <- IL_county_polygons[IL_county_polygons$NAME %in% county1,]
county2_polygon <- IL_county_polygons[IL_county_polygons$NAME %in% county2,]
county1_raster <- crop(state_soils_raster, county1_polygon)
county2_raster <- crop(state_soils_raster, county2_polygon)
如果我自己绘制每个县,你可以看到裁剪区域的范围是矩形的,并且超出了县本身的范围。着色很疯狂,因为mukey值遍布整个地方(尽管通常按县分组)。 County1位于County2的北部。
plot(county1_raster)
plot(county1_polygon, add = T)
plot(county2_raster)
plot(county2_polygon, add = T)
如果我按原样保留这些值并将两个县的栅格合并在一起,一切都很好。尽管两个栅格的范围确实重叠,但无论哪个栅格merge
从中拉出,单元格值都是相同的。在这种情况下,我确实不确定哪个光栅merge
会拉扯,但它并不重要。一切都很好地适应在一起,单元格值是正确的。
both_counties_raster <- merge(county1_raster, county2_raster)
plot(both_counties_raster)
plot(county1_polygon, add = T)
plot(county2_polygon, add = T)
但是,我想要做的是在重组县级栅格之前更改按县的单元格值。
values(county1_raster) <- 1
values(county2_raster) <- 2
both_counties_raster_new <- merge(county1_raster, county2_raster)
所有内容合并得很好,但是当我现在绘制新的组合栅格时,很明显,对于两个县栅格merge
中包含的单元格,只需从其中一个栅格中获取单元格值。显然,merge
默认情况下优先考虑第一个输入栅格。
plot(both_counties_raster_new)
plot(county1_polygon, add = T)
plot(county2_polygon, add = T)
我正在寻找的只是改变每个县界限内的单元格值,然后再将所有县合并在一起。
我知道raster::mask
函数可以将县界之外的任何东西转换为NA
,单位分辨率为10米(描述为here),这需要一个疯狂的数量时间!
我还尝试了一种替代方法,使用raster::rasterize
函数将县边界多边形转换为具有相同单元格大小和状态土壤栅格范围的栅格。再次,使用10米的单元分辨率,这需要永远。我能够在1.5小时内在我的8个核心中处理一个县。我有一个完整的国家要做!
我不知道任何10米栅格的美国县数据集,尽管如果有人指出我这样做会很棒。
土壤数据是gSSURGO数据 - 我也不知道gSSURGO在其多个表中是否具有县属性。如果它在那里,我找不到它。这也是一个简单的解决方案。
答案 0 :(得分:1)
它可能不会更快,但你试过raster::cellFromPolygon
吗?
这是一个简单的例子:
# Create a raster with zero values
r <- raster(ncols=30, nrows=30, res = 1/3)
values(r) <- 0
# Create polygons
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
pols <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1), Polygons(list(Polygon(cds2)), 2)))
plot(r)
plot(pols, add = TRUE)
r2 <- r
# Find which cells are in which polygons
cellpol <- cellFromPolygon(r, pols)
# Not a really clean way to attribute values in the global environment...
lapply(1:length(cellpol), function(x) values(r2)[cellpol[[x]]] <<- x)
plot(r2)
plot(pols, add = TRUE)