Gói R: sf trỏ đến nhiều dòng với st_cast


8

Tôi muốn tạo nhiều dòng trong số các điểm đã chosf objects.

Nếu tôi có một số điểm như

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

và tôi đang sử dụng st_castđể tạo ra các dòng của chúng

lines <- st_cast(pts, "MULTILINESTRING")

Tôi sẽ luôn nhận được một sf objectvới nhiều phân đoạn, nhưng những gì tôi muốn nhận là nhiều dòng (hai trong ví dụ này).


Kết quả nào bạn muốn nhận được? Với ba điểm A, B và C, bạn có thể tạo 3 dòng khác nhau: AB, AC, BC. Nếu ma trận của bạn có hàng trăm dòng thì sao?
dùng49584

Có vẻ như bạn muốn sf tương đương với thủ tục postgis này - gis.stackexchange.com/questions/174472/ , điều mà AFAIK chưa thể thực hiện được .... Có thể nêu ra một vấn đề trên trang github của sf?
obrl_soil

Câu trả lời:


7

Tôi nghĩ rằng sfgói cần biết trước tiên bạn muốn tạo các dòng từ điểm của bạn như thế nào. Tôi có nghĩa là cặp POINTlàm cho mỗi LINESTRING. Trong ví dụ của tôi đã được định nghĩa bên trong lapplyhàm. Thực hiện theo mã tái sản xuất và nhận xét bên dưới, hy vọng rằng sẽ giúp:

# 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)

hình 1


Cảm ơn bạn Guzmán cho câu trả lời của bạn! Giải pháp này hoạt động nếu thứ tự của các điểm đã cho giống với thứ tự của các dòng được tạo. Nhưng nếu có một thứ tự khác trong sf object(như matrix(c(10, 10, 30, 30, 15, 20), nrow = 3, byrow = TRUE)) nó sẽ tạo ra một dòng liên kết phía dưới bên trái với điểm trên bên phải trong trường hợp này. user49584 đã đề cập điều này trong bình luận của mình ở trên. Có khả năng sắp xếp các điểm trên mỗi khoảng cách tối thiểu hoặc một cái gì đó tương tự không? Cảm ơn!
danceb

4

Tôi đã tìm thấy một giải pháp! Đối với tất cả những người khác, những người đang tìm kiếm một câu trả lời là tốt, cách tôi đã giải quyết nó:

# 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)

nhập mô tả hình ảnh ở đây

Tuy nhiên, cảm ơn một lần nữa vì sự giúp đỡ của bạn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.