Как эффективно создавать Linestrings из точек?
У меня есть geom POINT в двух отдельных фреймах данных. Я хочу соединить точки линией (позже на карте), поэтому я хочу создать Linestring для каждой пары точек из этих фреймов данных. Я сделал это так:
coordsCust <- table %>%
st_as_sf(coords = c("lonCust","latCust"), crs = 4326)
coordsApp <- table %>%
st_as_sf(coords = c("lonApp","latApp"), crs = 4326) %>%
st_geometry()
и Linestring:
lines <- st_sfc(mapply(function(a,b){
st_cast(st_union(a,b),"LINESTRING")},
coordsCust$geometry, coordsApp$geometry, SIMPLIFY=FALSE))
Этот код работает, я могу создавать строки для каждой пары точек, строка за строкой:
LINESTRING (14.035 51.65182, 14.33418 53.53346)
LINESTRING (20.42767 49.98073, 16.62978 52.31037)
LINESTRING (20.18762 50.03337, 16.62978 52.31037)
LINESTRING (19.04625 49.79234, 16.62978 52.31037)
LINESTRING (21.35808 50.92382, 16.62978 52.31037)
Проблема в том, что для 30 000 строк это решение работает очень медленно - около 21 секунды. Есть ли другой способ создания линий из точек? Что-то, что работает намного быстрее? Я искал какие-то решения в сети, но тщетно. Я кое-что читал о преобразовании SF в матрицу и использовании, pmap
но понятия не имею, как это реализовать здесь.
ОБНОВЛЕНИЕ: если я хочу использовать функцию sfheaders :: sf_linestring, мне нужно объединить геометрии из обоих наборов данных. Я так делаю:
df <- cbind(coordsCust,coordsApp)
и окончательный фрейм данных (я показал наиболее важную его часть) показан ниже:

К сожалению, sf_linestring не работает должным образом с этим фреймом данных. Мне нужно создать линию между ТОЧКАМИ для каждой строки отдельно, как показано на экране.
Ответы
Без набора данных exmaple трудно полностью ответить на ваш вопрос. Но если вы можете преобразовать свой data.frame в «длинную» форму, то sfheaders
сможете сделать это в одно мгновение.
n <- 30000
df <- data.frame(
x = rnorm(n)
, y = rnorm(n)
)
df$id <- rep(1:(n/2), each = 2)
sfheaders::sf_linestring(
obj = df
, x = "x"
, y = "y"
, linestring_id = "id"
)
# Simple feature collection with 15000 features and 1 field
# geometry type: LINESTRING
# dimension: XY
# bbox: xmin: -4.297631 ymin: -4.118291 xmax: 3.782847 ymax: 4.053399
# CRS: NA
# First 10 features:
# id geometry
# 1 1 LINESTRING (0.2780517 0.243...
# 2 2 LINESTRING (0.4261505 2.503...
# 3 3 LINESTRING (0.8662821 -0.11...
# 4 4 LINESTRING (-0.5335952 -0.1...
# 5 5 LINESTRING (1.154309 -1.352...
# 6 6 LINESTRING (0.05512324 -0.4...
# 7 7 LINESTRING (1.945868 -0.744...
# 8 8 LINESTRING (0.0427066 -0.08...
# 9 9 LINESTRING (0.06738045 0.41...
# 10 10 LINESTRING (0.4128964 -0.04...