r - 多边形内的人口密度
问题描述
所以,我对 R 中的栅格包有一些疑问。我有一个栅格,每个网格点都有估计人口。我还有一个带有区域多边形的 shapefile。我想找出每个区域内人口密度最高的社区的坐标。假设每个邻域都是 5 x 5 个网格点的齐次正方形。
以下玩具示例模仿了我的问题。
library(raster)
library(maptools)
set.seed(123)
data(wrld_simpl)
wrld_simpl <- st_as_sf(wrld_simpl)
contr_c_am <- wrld_simpl %>%
filter(SUBREGION ==13) %>%
filter(FIPS != "MX") %>%
select(NAME)
# Create a raster of population (sorry for the bad example spatial distribution)
r <- raster(xmn=-180, xmx=180, ymn=-90, ymx=90, res=0.1)
values(r) <- runif(ncell(r), 0, 100)
# keep only raster around the region of interest
r_small <- crop(r, extent(contr_c_am))
plot(r_small)
plot(st_geometry(contr_c_am), add = T)
raster_contr_c_am <- rasterize(contr_c_am, r)
raster_contr_c_am 是人口网格,区域名称保存为属性。
不知何故,我只需要从一个区域过滤网格点,并且可能使用诸如 focus() 之类的函数来查找附近的总人口。
focal(raster_contr_c_am, matrix(1,5,5),sum, pad = T, padValue = 0)
然后,我需要找到每个区域内哪个网格点具有最高值,并保存它的坐标。
我希望我的解释不会太混乱,
谢谢你的帮助!
解决方案
这是一个迭代定义区域的形状的示例,然后使用区域内的栅格值和focal()
函数来查找最大值。
library(raster)
library(maptools)
library(sf)
library(dplyr)
set.seed(123)
data(wrld_simpl)
wrld_simpl <- st_as_sf(wrld_simpl)
contr_c_am <- wrld_simpl %>%
filter(SUBREGION ==13) %>%
filter(FIPS != "MX") %>%
select(NAME)
# Create a raster of population (sorry for the bad example spatial distribution)
r <- raster(xmn=-180, xmx=180, ymn=-90, ymx=90, res=0.1)
values(r) <- runif(ncell(r), 0, 100)
# keep only raster around the region of interest
r_small <- crop(r, extent(contr_c_am))
raster_contr_c_am <- rasterize(contr_c_am, r_small)
# function to find the max raster value using focal
# in a region
findMax <- function(region, raster) {
tt <- trim((mask(raster, region))) # focus on the region
ff <- focal(tt, w=matrix(1/25,nc=5,nr=5))
maximumCell <- which.max(ff) # find the maximum cell id
maximumvalue <- maxValue(ff) # find the maximum value
maximumx <- xFromCell(ff, maximumCell) # get the coordinates
maximumy <- yFromCell(ff, maximumCell)
# return a data frame
df <- data.frame(maximumx, maximumy, maximumvalue)
df
}
numberOfShapes <- nrow(contr_c_am)
ll <- lapply(1:numberOfShapes, function(s) findMax(region = contr_c_am[s,], raster = r_small))
merged <- do.call(rbind, ll)
maxpoints <- st_as_sf(merged, coords=c('maximumx', 'maximumy'), crs=crs(contr_c_am))
library(mapview) # optional but nice visualization - select layers to see if things look right
mapview(maxpoints) + mapview(r_small) + mapview(contr_c_am)
我制作了一个sf
对象,以便可以将其与其他空间对象一起绘制。使用这个mapview
包,我明白了。
推荐阅读
- javascript - 无法在 JS 中将图像拖放到另一个图像上?
- pandas - 辅助 groupby 聚合函数计算不正确
- python-3.x - pathlib 方法的完整列表
- python - 如何使 argparse 需要参数名称但仍然是可选的,没有前缀?
- javascript - How much space does Infinity take in memory?
- java - bean实例化类的@PostConstruct没有被调用
- javascript - 可用空间大小
- flutter - 在颤动中关闭BottomModalSheet后重建父小部件
- c# - 无法将类型字符串 [] 隐式转换为字符串
- javascript - Microsoft Graph 获取 Sharepoint 主要站点