Come creare in modo efficiente Linestrings da punti?
Ho punti geom in due frame di dati separati. Quello che voglio fare è collegare i punti con una linea (in seguito su una mappa), ecco perché voglio creare Linestring per ogni coppia di punti da quei frame di dati. L'ho fatto così:
coordsCust <- table %>%
st_as_sf(coords = c("lonCust","latCust"), crs = 4326)
coordsApp <- table %>%
st_as_sf(coords = c("lonApp","latApp"), crs = 4326) %>%
st_geometry()
e Linestring:
lines <- st_sfc(mapply(function(a,b){
st_cast(st_union(a,b),"LINESTRING")},
coordsCust$geometry, coordsApp$geometry, SIMPLIFY=FALSE))
Questo codice funziona, posso creare Linestrings per ogni coppia di punti, riga per riga:
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)
Il problema è che per 30.000 righe questa soluzione funziona molto lentamente - circa 21 secondi. C'è un altro modo per creare stringhe di linea da punti? Qualcosa che funziona molto più velocemente? Ho cercato alcune soluzioni sul web ma invano. Ho letto qualcosa sulla conversione di sf in matrix e sull'uso, pmap
ma non ho idea di come implementarlo qui.
AGGIORNAMENTO: se voglio usare la funzione sfheaders :: sf_linestring devo unire le geometrie di entrambi i set di dati. Lo faccio così:
df <- cbind(coordsCust,coordsApp)
e il data frame finale (ne ho mostrato la parte più importante) è mostrato di seguito:

Sfortunatamente sf_linestring non funziona correttamente su questo dataframe. Devo creare una stringa di linea tra i PUNTI per ogni riga separatamente, come mostrato sullo schermo.
Risposte
Senza un set di dati exmaple è difficile rispondere in modo completo alla tua domanda. Ma se riesci a ottenere il tuo data.frame in una forma "lunga", sfheaders
puoi farlo in un istante
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...