You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:00