如何在R中下载读取WorldPop越南TIFF数据并计算性别比?
在R中处理WorldPop越南2000年分年龄性别网格数据
1. 安装并加载必备工具包
先搞定地理空间和数据处理的基础包:
# 首次运行安装依赖 install.packages(c("raster", "sf", "downloader", "dplyr", "giscoR")) # 加载包 library(raster) library(sf) library(downloader) library(dplyr) library(giscoR)
2. 下载目标栅格数据
你指定的数据集是5岁年龄组的1km分辨率人口数据,20岁属于20-24岁分组,直接下载对应男女数据:
# 创建本地存储文件夹 dir.create("worldpop_vnm", showWarnings = FALSE) # 下载2000年越南20-24岁男性/女性人口栅格 download( url = "https://data.worldpop.org/GIS/AgeSexDistribution/Global_2000_2020/1km/2000/VNM/VNM_male_2000_4.tif", destfile = "worldpop_vnm/VNM_male_2000_20-24.tif" ) download( url = "https://data.worldpop.org/GIS/AgeSexDistribution/Global_2000_2020/1km/2000/VNM/VNM_female_2000_4.tif", destfile = "worldpop_vnm/VNM_female_2000_20-24.tif" )
3. 读取栅格并提取网格人口数据
把TIFF栅格转成结构化数据,每个行对应一个网格的坐标和人口数:
# 读取栅格文件 male_raster <- raster("worldpop_vnm/VNM_male_2000_20-24.tif") female_raster <- raster("worldpop_vnm/VNM_female_2000_20-24.tif") # 转成数据框并合并男女数据 grid_pop <- as.data.frame(male_raster, xy = TRUE) %>% rename(male_pop = VNM_male_2000_4) %>% inner_join( as.data.frame(female_raster, xy = TRUE) %>% rename(female_pop = VNM_female_2000_4), by = c("x", "y") ) %>% filter(!is.na(male_pop) & !is.na(female_pop)) # 过滤无人口的网格
现在grid_pop就是包含每个网格坐标、男性人口、女性人口的数据集。
4. 聚合到行政区划计算性别比
用官方行政区划数据,把网格数据聚合到省级,计算分地区性别比:
# 获取越南省级行政区划(转成和栅格一致的坐标系) vnm_provinces <- gisco_get_countries(country = "VNM", resolution = "10") %>% st_transform(crs = crs(male_raster)) # 将网格数据转成空间点,匹配到对应省份 grid_with_province <- st_as_sf(grid_pop, coords = c("x", "y"), crs = crs(male_raster)) %>% st_join(vnm_provinces, join = st_within) # 按省份聚合计算性别比(每100名女性对应的男性数量) province_gender_ratio <- grid_with_province %>% as.data.frame() %>% group_by(NAME_EN) %>% # NAME_EN是省份英文名,用NAME_VN可获取越南语名称 summarise( total_male = sum(male_pop, na.rm = TRUE), total_female = sum(female_pop, na.rm = TRUE), gender_ratio = round((total_male / total_female) * 100, 2) ) %>% ungroup() # 查看结果 print(province_gender_ratio)
新手注意点
- 所有空间数据必须使用相同坐标系,不然空间匹配会出错
- WorldPop栅格默认是WGS84坐标系(EPSG:4326),转坐标系时用这个参数即可
- 如果需要县级数据,把
gisco_get_countries换成gisco_get_adm(country = "VNM", level = 2)
内容的提问来源于stack exchange,提问作者anrisakaki96
相关产品推荐
相关产品推荐

