如何在R中使用st_distance?解决‘Lon对象未找到’报错问题
解决st_distance报错"object 'Lon' not found"的问题
问题原因
st_distance是sf包的函数,仅接受sf几何对象作为输入,不能直接传入普通数据框的经纬度列。- 用管道
%>%调用st_distance时,该函数不属于dplyr动词,无法自动识别数据框内的Lon/Lat列,导致找不到对象。
修正步骤及代码
1. 先将普通数据框转为sf空间对象
需要指定经纬度列和原始坐标系(通常是WGS84,EPSG:4326),再转换为米单位的坐标系(方便直接计算公里级距离):
library(sf) library(dplyr) # 清理缺失值并转为sf对象 An.TP <- An.TP %>% na.omit() %>% st_as_sf(coords = c("Lon", "Lat"), crs = 4326) %>% # 转换为WGS84空间对象 st_transform(crs = 3857) # 转为Web墨卡托坐标系,单位为米(也可使用当地UTM坐标系更精准)
2. 计算点间距离并筛选
以计算每个点与下一个点的距离为例,筛选距离大于1公里(1000米)的记录:
# 计算相邻点距离 An.TP <- An.TP %>% mutate(distance = st_distance(., lead(.), by_element = TRUE)) # 筛选距离>1000米的记录 An.TP_filtered <- An.TP %>% filter(distance > 1000)
补充说明
- 若要计算所有点对的距离,去掉
lead(.)即可,但会得到距离矩阵,需根据需求调整后续处理逻辑。 - 若不想转换坐标系,可直接在
st_distance中指定单位:st_distance(., lead(.), by_element = TRUE, unit = "km"),后续筛选条件改为distance > 1。
内容的提问来源于stack exchange,提问作者Alyssa Cabrera
相关产品推荐
相关产品推荐

