问题描述
我正在尝试沿着shp的线对通过点对拆分多段线形状。我已经遵循了this question的答案,但是似乎没有分割多义线的方法。
到目前为止,我已经尝试运行以下代码:
z<-c("sf","rgdal","lwgeom")
lapply(z,library,character.only = TRUE)
edges<- readOGR(dsn=".",layer="edges") # epsg:4326
nodes<- readOGR(dsn=".",layer="nodes") # epsg:4326
edges<- st_as_sf(edges)
nodes<- st_as_sf(nodes)
nodes<-st_combine(nodes)
parts_all = st_collection_extract(lwgeom::st_split(edges$geometry,nodes),"LInesTRING")
但是会产生此错误:
Error in CPL_geos_is_empty(st_geometry(x)) :
Evaluation error: IllegalArgumentException: point array must contain 0 or >1 elements
据此我了解到,折线(边)必须是单条线,但是将其组合也无效,并且会产生相同的错误。
您可以找到我正在使用的示例数据here
任何想法都值得赞赏!谢谢!
更新
我设法建立了一个有效的代码。我的解决方案是制作一个循环,以创建一个新的空间对象,该空间对象仅包含多行对象的一行,然后st_split该行。
我首先需要在节点周围创建一个小缓冲区(我检查它实际上是否很小),然后尝试拆分它。
z<-c("sf",layer="nodes") # epsg:4326
edges<- st_as_sf(edges)
nodes<- st_as_sf(nodes)
edges$ID_cam <- 1:nrow(edges) #My ID to be able to assign some attributes afterwards.
nodes$ID_cam <- 1:nrow(nodes)
nodes_buf <- st_buffer(nodes,0.1)
nodi<-st_combine(nodes_buf)
for (i in 1:nrow(edges)){
edgi<-edges[edges$ID_cam == i,]
splited =st_collection_extract(lwgeom::st_split(edgi$geometry,nodi),"LInesTRING")
assign(paste("split",i,sep=""),splited)
}
尽管如此,当我检查创建的新行时,它们并没有被点分开,而是似乎被随机分开了。
有人知道会发生什么吗?
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)