R: paket sf menunjuk ke beberapa baris dengan st_cast

8

Saya ingin membuat beberapa baris dari poin yang diberikan sebagai sf objects.

Jika saya memiliki sejumlah poin sebagai

library(sf)
pts <- st_multipoint(matrix(c(10, 10, 15, 20, 30, 30), nrow = 3, byrow = TRUE), dim = "XY")

dan saya gunakan st_castuntuk membuat garis mereka

lines <- st_cast(pts, "MULTILINESTRING")

Saya akan selalu mendapatkan satu sf objectdengan banyak segmen, tetapi yang ingin saya dapatkan adalah beberapa baris (dua dalam contoh ini).

danceb
sumber
Hasil apa yang ingin Anda dapatkan? Dengan tiga poin A, B, dan C Anda dapat membuat 3 garis yang berbeda: AB, AC, BC. Bagaimana jika matriks Anda memiliki seratus garis?
user30184
Sepertinya Anda ingin setara dengan prosedur postgis ini - gis.stackexchange.com/questions/174472/… , yang AFAIK belum memungkinkan ... belum. Mungkin mengangkat masalah pada halaman github sf?
obrl_soil

Jawaban:

7

Saya pikir sfpaket itu perlu tahu dulu bagaimana Anda ingin membuat garis dari poin Anda. Maksud saya pasangan mana yang POINTmenghasilkan setiap LINESTRING. Dalam contoh saya yang didefinisikan di dalam lapplyfungsi. Ikuti kode yang dapat direproduksi dan dikomentari di bawah ini, semoga membantu:

# Load library
library(sf)

# Create points data
multipoints <- st_multipoint(matrix(c(10, 10, 15, 20, 30, 30), nrow = 3, byrow = TRUE), dim = "XY")
points <- st_cast(st_geometry(multipoints), "POINT") 

# Number of total linestrings to be created
n <- length(points) - 1

# Build linestrings
linestrings <- lapply(X = 1:n, FUN = function(x) {

  pair <- st_combine(c(points[x], points[x + 1]))
  line <- st_cast(pair, "LINESTRING")
  return(line)

})

# One MULTILINESTRING object with all the LINESTRINGS
multilinetring <- st_multilinestring(do.call("rbind", linestrings))

# Plot
plot(multipoints, pch = 19, cex = 2)
plot(multilinetring[[1]], col = "orange", lwd = 2, add = TRUE)
plot(multilinetring[[2]], col = "green", lwd = 2, add = TRUE)

gbr1

Guzmán
sumber
Terima kasih Guzmán atas jawaban Anda! Solusi ini berfungsi jika urutan poin yang diberikan sama dengan urutan garis yang akan dibuat. Tetapi jika ada pemesanan lain dalam sf object(seperti matrix(c(10, 10, 30, 30, 15, 20), nrow = 3, byrow = TRUE)) itu menciptakan garis yang menghubungkan kiri bawah dengan titik kanan atas dalam kasus ini. user30184 menyebutkan ini dalam komentarnya di atas. Apakah ada kemungkinan untuk mengurutkan titik per jarak minimal atau sesuatu seperti itu? Terima kasih!
danceb
4

Saya telah menemukan solusinya! Untuk semua yang lain, yang mencari jawaban juga, cara saya menyelesaikannya:

# Load library
library(sf)

# create points data
m <- matrix(c(10, 10, 30, 30, 15, 20), nrow = 3, byrow = TRUE)
multipoints <- st_multipoint(m, dim = "XY")

# save ranges of coordinates
x.range <- max(m[,1]) - min(m[,1])
y.range <- max(m[,2]) - min(m[,2])

# order by greatest range
if (x.range > y.range) {
  sort.id <- order(m[,1])
} else if (y.range > x.range) {
  sort.id <- order(m[,2])
} else if (y.range == x.range) {
  sort.id <- order(m[,2])
}

# creat lines by previous sorting and save them in the list
lines <- lapply(1:(length(sort.id)-1), function(i) {
  st_linestring(rbind(multipoints[sort.id[i],], multipoints[sort.id[i+1],]))
})

# plot results
plot(multipoints)
plot(lines[[1]], col = "orange", lwd = 2, add = TRUE)
plot(lines[[2]], col = "green", lwd = 2, add = TRUE)

masukkan deskripsi gambar di sini

Meskipun demikian, sekali lagi terima kasih atas bantuan Anda!

danceb
sumber