У меня есть sf
многоканальный объект, который я хотел бы преобразовать в ряд равномерно распределенных точек.
Сначала я попытался использовать st_cast
, но, похоже, это создает только минимальное количество точек, необходимых для воссоздания линий:
# sample multilinestring sf object
sf_multiline <- structure(list(
OBJECTI = 2558325, REACHCO = "18010108001016",
TermnlP = 10013609, lnLngt_ = 327.450701655499, TtDASKM = 6.588,
StrmOrd = 2, TrmnlFl = "0", SLOPE = 0.04073394, FromNod = 10006177,
ToNode = 10006028, SegNum = 270, IP = 0.713471689535624,
IP_class = structure(2L, .Label = c("Low", "High", "Outside Navarro"
), class = "factor"), geometry = structure(list(structure(list(
structure(c(456878.59466448, 456746.114675578, 456718.025986089,
456667.149879425, 456646.355212286, 456625.81800052,
4328172.35209264, 4328073.83723204, 4328040.94292727,
4328020.82579635, 4328006.04738784, 4327973.17832125),
.Dim = c(6L, 2L))),
class = c("XY", "MULTILINESTRING", "sfg"))),
class = c("sfc_MULTILINESTRING", "sfc"),
precision = 0, bbox = structure(c(xmin = 456625.81800052, ymin = 4327973.17832125,
xmax = 456878.59466448, ymax = 4328172.35209264),
class = "bbox"),
crs = structure(list(epsg = 26910L, proj4string = "+proj=utm +zone=10 +datum=NAD83 +units=m +no_defs"),
class = "crs"), n_empty = 0L)),
row.names = 254L, class = c("sf", "data.frame"), sf_column = "geometry",
agr = structure(c(OBJECTI = NA_integer_,
REACHCO = NA_integer_, TermnlP = NA_integer_, lnLngt_ = NA_integer_,
TtDASKM = NA_integer_, StrmOrd = NA_integer_, TrmnlFl = NA_integer_,
SLOPE = NA_integer_, FromNod = NA_integer_, ToNode = NA_integer_,
SegNum = NA_integer_, IP = NA_integer_, IP_class = NA_integer_),
.Label = c("constant", "aggregate", "identity"), class = "factor")
)
# conver to point object
sf_points <- st_cast(sf_multiline, "POINT")
# plot multilinestring and point object
ggplot() + geom_sf(data=sf_multiline, color="blue") + geom_sf(data=sf_points, color="red") + theme(panel.grid=element_line(color="transparent"))
Я знаю, как это сделать, используя функцию sp::spsample
с шейп-файлом, но я пытаюсь перейти на sf
, поэтому хотел бы знать sf
способ сделать это.
Вот желаемый результат, используя sp
:
# convert sf to shapefile
shp_multiline <- as(sf_multiline, "Spatial")
# regularly sample points along line
shp_points <- sp::spsample(shp_multiline, n=10, type="regular")
# plot
plot(shp_multiline, col="blue")
plot(shp_points, col="red", add=T)