简体   繁体   English

多边形内的人口密度

[英]Population density within polygons

So, I have some questions regarding the raster package in R. I have a raster with estimated population in each grid point.所以,我对 R 中的栅格包有一些疑问。我在每个网格点都有一个估计人口的栅格。 I also have a shapefile with polygons of regions.我还有一个带有区域多边形的 shapefile。 I want to find out the coordinates of the neighborhood with the highest population density within each regions.我想找出每个区域内人口密度最高的街区的坐标。 Supose that each neighborhood is a homogeneous square of 5 by 5 grid points.假设每个邻域都是一个 5 x 5 网格点的同质正方形。

The following toy example mimics my problem.以下玩具示例模仿了我的问题。

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 is the population grid and the name of the region is saved as an attribute. raster_contr_c_am 是人口网格,区域名称保存为属性。

Somehow I need to filter only grid points from one region, and probably use some funcion like focal() to find total nearby population.不知何故,我只需要过滤来自一个区域的网格点,并且可能使用像 focus() 这样的函数来查找附近的总人口。

focal(raster_contr_c_am, matrix(1,5,5),sum, pad = T, padValue = 0)

Then, I need to find which grid point has the highest value within each region, and save it's coordinates.然后,我需要找到每个区域内哪个网格点的值最高,并保存它的坐标。

I hope my explanation is not too confusing,我希望我的解释不会太混乱,

Thanks for any help!谢谢你的帮助!

Here's an example that iterates over the shape defining the region, then uses the raster values within the region and the focal() function to find the maximum.这是一个示例,它遍历定义区域的形状,然后使用区域内的栅格值和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)

I've made an sf object so that it can be plotted with the other spatial objects.我制作了一个sf对象,以便它可以与其他空间对象一起绘制。 Using the mapview package, I get this.使用mapview包,我得到了这个。

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM