在R中用sf包重构导入Shapefile并创建空间数据框的代码
用sf包重构通勤流向地图的实操方案
1. 替换原ID赋值代码(解决@语法报错)
sf对象本质是带几何列的数据框,不需要用@访问属性表,直接像操作普通数据框一样赋值:
# 替换原maptools的代码 soton$id = rownames(soton)
如果你的shapefile本身已经有唯一区域ID字段(比如region_code),建议优先用这个字段做关联,比rownames更可靠。
2. 哪些CSV需要转成sf对象?
不需要全部转:
- 质心CSV:必须转成sf点对象,因为要用到它的空间坐标生成流向线
- OD通勤数据CSV:不需要转,它是普通属性表(包含起点ID、终点ID、通勤量等字段),用来关联起点和终点的质心即可
- 如果第三个CSV是其他属性数据(比如区域人口):仅当需要做空间关联时才转sf,否则作为普通数据框做属性连接就行
3. 连接Shapefile与质心数据
优先用属性连接(前提是两者有共同的唯一ID字段,比如region_id),比空间连接更精准:
# 假设shapefile(soton)和质心sf(centroids_sf)都有region_id字段 soton_with_centroids = dplyr::left_join(soton, centroids_sf, by = "region_id")
如果没有共同ID,但质心确实在对应多边形内,也可以用空间连接:
soton_with_centroids = sf::st_join(soton, centroids_sf, join = sf::st_within)
注意:所有空间对象的CRS必须一致,提前用st_crs()检查,不一致就用st_transform()统一
4. 连接OD数据与质心生成流向线
核心思路是把OD数据的起点/终点ID和质心坐标关联,再生成线对象:
# 1. 先从质心sf中提取坐标和ID(去掉几何列,保留属性) centroids_attr = sf::st_drop_geometry(centroids_sf) # 2. 给OD数据关联起点质心坐标 od_origin = dplyr::left_join(od_df, centroids_attr, by = c("origin_id" = "region_id")) %>% dplyr::rename(x_origin = x, y_origin = y) # 假设质心有x、y坐标列 # 3. 关联终点质心坐标 od_full = dplyr::left_join(od_origin, centroids_attr, by = c("dest_id" = "region_id")) %>% dplyr::rename(x_dest = x, y_dest = y) # 4. 生成流向线sf对象 flow_lines = od_full %>% dplyr::rowwise() %>% dplyr::mutate( # 用起点和终点坐标生成线 geometry = sf::st_sfc( sf::st_linestring(rbind(c(x_origin, y_origin), c(x_dest, y_dest))), crs = sf::st_crs(centroids_sf) # 和质心保持相同CRS ) ) %>% sf::st_sf() # 转为sf对象
额外优化:如果你的质心不是从外部CSV导入,其实可以直接从shapefile生成,避免坐标不匹配问题:
# 直接从soton多边形生成质心 centroids_sf = sf::st_centroid(soton)
内容的提问来源于stack exchange,提问作者veesilouette
相关产品推荐
相关产品推荐

