R sf如何从含多组坐标列的数据框创建线要素sf对象
问题解决方法
报错原因
你使用
st_as_sf的coords参数传入4个列名时,函数默认将其识别为单个点要素的4个维度坐标,而经纬度仅为二维坐标,因此触发维度不匹配的报错。coords参数仅适用于生成点要素,无法直接生成线要素。
实现代码
提供两种常用实现方式,最终得到的sf对象的geometry列均为对应ID的道路段LINESTRING要素:
方法1:dplyr + sf 行处理(可读性更高)
library(sf) library(dplyr) dfr_sf <- dfr %>% rowwise() %>% # 按行处理 mutate( geometry = st_sfc( # 每行构造一个两点线要素,坐标顺序为(经度, 纬度) st_linestring(matrix(c(StartLong, StartLat, EndLong, EndLat), ncol = 2, byrow = TRUE)), crs = 4326 # 等价于"+proj=longlat +datum=WGS84" ) ) %>% ungroup() %>% st_sf() # 转换为标准sf对象
方法2:base R 实现
library(sf) # 逐行构造线要素列表 line_geoms <- lapply(1:nrow(dfr), function(i) { st_linestring( matrix( c(dfr$StartLong[i], dfr$StartLat[i], dfr$EndLong[i], dfr$EndLat[i]), ncol = 2, byrow = TRUE ) ) }) # 绑定到原数据生成sf对象 dfr_sf <- st_sf(dfr, geometry = st_sfc(line_geoms, crs = 4326))
效果验证
执行st_geometry_type(dfr_sf)会返回所有要素类型为LINESTRING,直接调用plot(dfr_sf$geometry)即可绘制所有道路段折线。
内容的提问来源于stack exchange,提问作者Pramesh Pudasaini
相关产品推荐
相关产品推荐

