library(sf)
#> Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
ls = st_linestring(rbind(st_point(c(0L, 0L)), # point A
st_point(c(10L, 0L)))) # point B
X = st_point(c(3L, 0L))
plot(ls); plot(X, col = "red", add = TRUE)
pnts = st_cast(st_sfc(ls), to = "POINT") # plot endpoints
plot(pnts, col = "blue", add = TRUE)
segments(0L, 0L, 3L, 0L, col = "red")
字符串
的数据
st_distance(x = pnts[[1L]], y = X, by_element = TRUE) # pnts[[1L]] = A
#> X
#> 3
# library(sf)
X1 = st_point(c(3L, 1L))
x = 0L:10L
ls_sin = st_linestring(cbind(x, sin(x)))
# assuming we start with a LINESTRING, we need to get out the points:
mx = matrix(unlist(st_geometry(ls_sin)), ncol = 2L)
(idx = mx[which.min(st_distance(st_as_sf(as.data.frame(mx), coords = c(1L, 2L)), X1)), ])
#> [1] 3.00000 0.14112
ls_sin_sup = st_linestring(cbind(x[1L:idx[1L]], sin(x[1L:idx[1L]])))
plot(ls_sin, col = "black")
plot(ls_sin_sup, col = "red", add = TRUE)
plot(ls, col = "blue", add = TRUE) # from straight line example
1条答案
按热度按时间jvidinwx1#
我们可以使用
{sf}
来完成这个任务。我猜你指的是sf::st_linestring()
而不是st_line()
。**(1)**对于“直”LINESTRING,如草图所示:
字符串
的数据
型
返回
[1] "XY" "LINESTRING" "sfg"
类对象端点的替代方法:型
**(2)**对于一个“弯曲的”LINESTRING,一个选择可能是将LINESTRING分解成它的底层点。然后我们从这些点的子集中创建一个新的子LINESTRING并计算它的长度:
型
的
型
**(3)**通过
{sfnetworks}
的替代方案。我们创建一个网络,添加新点,并计算子LINESTRINGS的长度:标签:有look
**(4)**还没有找到从
{sf}
导出的显式函数,该函数可以精确地将LINESTRING缩短到新的端点。