我从WorldPop下载了100 m分辨率的人口网格数据,通过跨投影和裁剪,得到了一个城市的人口空间分布网格数据,此外还有该市县级的行政边界形状文件数据,目的是根据当年的人口普查(县级)数据进行人口网格修正.

##Mask and crop one county from the population data
popc <- trim(mask(pop, county[1, ]))
##Calculate the correction factor and make correction
POPc <- popc*(county[1, ]$census_data/global(popc, sum, na.rm = T)[1,])

我计划分别裁剪每个县的人口网格,然后通过计算其修正因子来进行修正,最后合并这些网格.不过,这种方式很耗时,不知道有没有更简单的方法?

推荐答案

如果您的目的是使用WorldPop和County$census_data中的县人口之间的比率来调整WorldPop像元值,则可以使用格栅算术来执行此操作:

  1. 创建新版本的WorldPop格栅,其中每个像元代表其所在的WorldPop县人口,例如pop1;
  2. 使用原始WorldPop格栅作为参考,使用rasterize()创建具有相应县$census_data人口值的县形状文件的格栅版本,例如county_r;
  3. 使用county_rpop1定义比例以调整pop中的单元格值

请注意,此示例使用tigris个数据的默认CRS,并且为了速度和简单性,其分辨率低于WorldPop数据.

Step 0: Load packages and create example data

library(sf) # 1.0-16 
library(terra) # 1.7.71
library(tigris) # 2.1
library(dplyr) # 1.1.4

# Create example city by county sf data using tigris package
# Add ID to your actual data for left_join() in Step 1
county <- counties("Maine", cb = TRUE) %>%
  mutate(ID = 1:n())

# Get extent of county and use values to create a proxy WorldPop SpatRaster
st_bbox(county)

#      xmin      ymin      xmax      ymax 
# -71.08392  42.97776 -66.94989  47.45969

set.seed(1)
pop <- rast(resolution = 100/11113.9, nlyrs = 1,
            xmin = -71.08392, xmax = -66.94989, 
            ymin = 42.97776, ymax = 47.45969, 
            names = "population",
            crs = crs(county)) %>%
  init("cell") %>%
  crop(county, mask = TRUE)

pop[] <- sample(1:100, nrow(pop) * ncol(pop), replace = TRUE)

pop
# class       : SpatRaster
# dimensions  : 498, 459, 1  (nrow, ncol, nlyr)
# resolution  : 0.008997742, 0.008997742  (x, y)
# extent      : -71.08392, -66.95396, 42.97776, 47.45864  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat NAD83 (EPSG:4269)
# source(s)   : memory
# name        : population
# min value   :          1
# max value   :        100

Step 1: Create population by county raster from WorldPop data

pop1 <- extract(pop, county, fun = sum, na.rm = TRUE) %>%
  left_join(county, ., by = "ID") %>%
  rasterize(., pop, field = "population")

Step 2: 100 county shapefile with county$census population values to corresponding cells

county_r <- extract(pop, county, fun = sum, na.rm = TRUE) %>%
  left_join(county, ., by = "ID") %>%
  mutate(census_data = ceiling(population * 1.1)) %>% # For illustrative purposes, delete this line for your actual data
  rasterize(., pop, field = "census_data")

Step 3: Adjust original WorldPop values using county_r and pop1

POPc <- pop * (county_r / pop1)

POPc
# class       : SpatRaster
# dimensions  : 498, 459, 1  (nrow, ncol, nlyr)
# resolution  : 0.008997742, 0.008997742  (x, y)
# extent      : -71.08392, -66.95396, 42.97776, 47.45864  (xmin, xmax, ymin, ymax)
# coord. ref. : lon/lat NAD83 (EPSG:4269)
# source(s)   : memory
# name        : population
# min value   :     1.1000
# max value   :   110.0018

R相关问答推荐

如何在列表的子元素上使用setName

在图内移动y轴上的标签

如何使用文本表达来子集数据

是否有R函数来判断一个组中的所有值是否与另一个组中的所有值相同?

如何使用geom_sf在边界显示两种 colored颜色 ?

从R中的另一个包扩展S3类的正确方法是什么

用derrr在R中查找组间的重复项

格点中指数、双曲和反双曲模型曲线的正确绘制

从R导出全局环境中的所有sf(numrames)对象

在"gt"表中添加第二个"groupname_col",而不连接列值

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

如何编辑gMarginal背景以匹配绘图背景?

根据日期从参考帧中创建不同的帧

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

如何写商,水平线,在一个单元格的表在R

plotly hover文本/工具提示在shiny 中不起作用

条形图顶部与其错误条形图不对齐

基于数据集属性将科分配给物种

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

将统计检验添加到GGPUBR中的盒图,在R