R中使用sf调整空间多边形质心为人口重心的相关问题求助
错误原因
- 直接调用R基础函数
mean()计算SF对象的geometry列会报错:geometry列是存储坐标点的sfc_POINT类向量,不属于数值/逻辑类型,基础mean()没有对应处理方法,所以返回NA。 - 你当前的写法是给所有子区域质心赋等权重计算均值,如果普查区数据带有
population人口字段,建议使用人口加权计算,得到的人口重心会更贴合实际通勤场景。
解决方法
步骤1:计算人口重心
计算分组质心均值可通过st_combine()合并同组所有点为多点几何,再调用st_centroid()计算多点几何的质心实现,代码如下:
library(dplyr) library(sf) # 等权重平均质心 mean_centroids <- sub_region_centroids %>% group_by(region_name) %>% summarise( pop_centroid = st_centroid(st_combine(geometry)) ) %>% st_drop_geometry() %>% as_tibble()
如果普查区数据包含人口字段,推荐使用加权版本:
# 人口加权平均质心(推荐) mean_centroids <- intersected %>% st_centroid() %>% group_by(region_name) %>% summarise( pop_centroid = st_centroid(st_combine(geometry), weights = population) ) %>% st_drop_geometry() %>% as_tibble()
步骤2:关联回原始区域SF对象
通过公共字段region_name做表关联即可:
regions_with_pop_centroid <- regions %>% left_join(mean_centroids, by = "region_name")
步骤3:优化区域间距离计算代码
你之前的边列表代码存在变量名笔误(extract-centroids的横杠应为下划线),基于关联后的表可直接生成正确的边列表:
edge_list <- regions_with_pop_centroid %>% st_drop_geometry() %>% select(region_name, pop_centroid) %>% expand(from = region_name, to = region_name) %>% filter(from < to) %>% left_join(regions_with_pop_centroid, by = c("from" = "region_name")) %>% rename(from_centroid = pop_centroid) %>% left_join(regions_with_pop_centroid, by = c("to" = "region_name")) %>% rename(to_centroid = pop_centroid) %>% mutate(distance = st_distance(from_centroid, to_centroid))
其他注意事项
- 你代码中用到的
st_centroids()是笔误,sf包中计算质心的正确函数名为st_centroid()(无末尾的s)。 - 计算得到的
distance默认单位与shapefile的坐标参考系(CRS)一致,若需要获取米/千米单位的距离,可先调用st_transform()将数据转换为对应区域的UTM投影坐标系后再计算。
内容的提问来源于stack exchange,提问作者aterhorst
相关产品推荐
相关产品推荐

