在R语言sp包中获取LineString起点与终点的问题求助
获取sp包中LineString的起点与终点(对应PostGIS的ST_StartPoint/ST_EndPoint)
我来帮你搞定这个问题!在R的sp包中,SpatialLines对象的层级结构需要正确拆解才能拿到坐标,你之前的报错都是因为没找对访问的层级~
先理清sp包中LineString的结构
SpatialLines对象的层级是:SpatialLines → 包含一个列表(@lines),列表里的每个元素是Lines对象 → 每个Lines对象包含一个列表(@Lines),列表里的每个元素是Line对象 → Line对象的@coords是存储坐标的矩阵。
正确获取单条LineString的起点/终点
假设你的onetrip是一个SpatialLines对象,要获取第一条线的起点和终点,可以这样写:
# 第一步:拿到第一条Lines对象里的Line坐标矩阵 line_coords <- onetrip@lines[[1]]@Lines[[1]]@coords # 起点(对应ST_StartPoint) start_point <- line_coords[1, ] # 终点(对应ST_EndPoint) end_point <- line_coords[nrow(line_coords), ]
解释你之前的错误原因
onetrip@lines[[1]][1]报错:onetrip@lines[[1]]是Lines类型的S4对象,不能用普通列表的[1]方式子集,必须用@访问它的槽位。onetrip@lines@Lines报错:onetrip@lines本身是一个普通列表,不是S4对象,所以没有Lines槽位,得先取列表里的元素(比如[[1]])再访问@Lines。onetrip@lines$Lines返回NULL:onetrip@lines是列表,列表里的每个元素是Lines对象,但列表本身没有名为Lines的元素,所以用$访问会得到NULL。
批量处理所有LineString的方法
如果你的SpatialLines里有多条线,可以写个小函数批量获取每条线的起点和终点:
get_start_end <- function(sp_lines) { lapply(sp_lines@lines, function(lines_obj) { # 这里默认每个Lines对象只包含一个Line(绝大多数场景都是如此) coords <- lines_obj@Lines[[1]]@coords list( start = coords[1, ], end = coords[nrow(coords), ] ) }) } # 调用函数,得到每条线的起点终点列表 all_points <- get_start_end(onetrip)
内容的提问来源于stack exchange,提问作者iskandarblue
相关产品推荐
相关产品推荐

