R:sfパッケージがst_castで複数の行を指す


8

として与えられた点から複数の線を作成したいと思いますsf objects

私がいくつかのポイントを持っている場合

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

私はst_castそれらのラインを作成するために使用しています

lines <- st_cast(pts, "MULTILINESTRING")

私は常にsf object複数のセグメントを持つ1つを取得しますが、取得したいのは複数の行(この例では2つ)です。


どのような結果が得られますか?3つの点A、B、Cを使用して、AB、AC、BCの3つの異なる線を作成できます。マトリックスに100行ある場合はどうなりますか?
user30184 2018

このpostgis手順と同等のsfが必要なようです-gis.stackexchange.com/questions/174472/…、これはAFAIKでは不可能です...まだです。たぶん、sfのgithubページで問題を提起しますか?
obrl_soil

回答:


7

sfパッケージはまず、ポイントからラインを作成する方法を知っている必要があると思います。つまり、どのペアがPOINTすべてを作るかということLINESTRINGです。lapply関数内で定義された私の例では。以下の再現可能でコメント付きのコードに従ってください。

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

fig1


答えてくれてありがとうグズマン!このソリューションは、指定されたポイントの順序が作成される線の順序と同じ場合に機能します。しかし、sf object(のようにmatrix(c(10, 10, 30, 30, 15, 20), nrow = 3, byrow = TRUE))別の順序がある場合は、この場合、左下と右上の点を結ぶ線が作成されます。user30184は、上記のコメントでこれについて言及しています。最小距離ごとにポイントを並べ替える可能性はありますか?ありがとう!
danceb 2018

4

解決策を見つけました!同様に答えを探している他のすべてのために、私がそれを解決した方法:

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

ここに画像の説明を入力してください

それにもかかわらず、あなたの助けに再び感謝します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.