4

SpatialLineslengthのクラスのセグメントの行を想定しましょうlen。この特定の行は左上隅から始まります。

library(sp)
x <- structure(list(x = c(-7.23437435517476, 6.35937810318614, -5.86718660792582, 
                        7.96094089282062), y = c(7.08139459814975, 6.8633712983227, -7.61337581019376, 
                        -6.2180266913006)), .Names = c("x", "y"))

xline <- SpatialLines(list(Lines(Line(x), ID = 1)))
#len <- LineLength(as.matrix(data.frame(x)))
len <- LineLength(as.matrix(data.frame(coordinates(xline))))

plot(0,0, xlim = c(-10, 10), ylim = c(-10, 10), type = "n")
lines(xline)

始点から希望の距離にある直線上の点を見つける

findme線の始点から単位離れたこの線上の点を見つけたいと思います。たとえば、最初から線に沿って 10 単位のポイントを探すと、最初のセグメントと 2 番目のセグメントの間のノードの近くにポイントが表示されます。より堅牢なソリューションに関するご意見をお待ちしております。

(以下を参照)を使用して見つけようとしましたspsampleが、この方法は (あまりにも) 信頼性が低く、ラインの後半のポイントでは機能しません。

# very approximate method, not very suitable
findme <- 11 # 11, 12 and 13 give same result
segs <- 1/(findme/xline.length)
xsam <- spsample(x = xline, n = segs, type = "regular", offset = 0)
points(xsam)
4

2 に答える 2

4

次の手順は、座標を見つけるのに役立ちます。

行の一般情報:

library(np)

coord <- coordinates(xline)[[1]][[1]] 
nLines <- nrow(coord) - 1
#lengths <- sapply(seq_len(nLines), function(x) LineLength(coord[c(x, x + 1), ]))
lengths <- LineLength(coord, sum = FALSE)

新しい座標を見つけます。

findme <- 11 # the distance of the new coordinates

distances <- cumsum(lengths) - findme         # distances from the nodes
segment <- which(distances >= 0)[1]           # the segment of interest
distToNode <- distances[segment]
ratio <- distToNode / lengths[segment]
segCoord <- coord[c(segment, segment + 1), ]
newCoord <- (1 - ratio) * segCoord[2 , ] + ratio * segCoord[1 , ] 

プロット:

points(newCoord[1], newCoord[2])

ここに画像の説明を入力

于 2012-11-13T17:56:36.587 に答える
0

出来ますか:

  • セグメントの順序を決定する
  • 各セグメントの長さを決定する
  • 順序と長さを使用して、ポイントがどのセグメントにあるかを判断します
  • オーダー * 長さからセグメントの開始を引きます (たとえば、3 番目のセグメントにいることがわかっている場合は、3 番目と 2 番目のセグメントが交わる点の長さを引きます (これはセグメント 1 の合計です)。および 2) 行全体の先頭から)。したがって、線の始点から 7 単位の点を見つけようとしていて、セグメント 1 と 2 の合計が 5 だった場合、残りは 2 になります。
  • 次に、このメソッドを使用して残りのセグメントのみを処理し、そのセグメントの 2 単位下のポイントを特定します。

これが完全な解決策ではない場合は申し訳ありません。しかし、解決可能なアプローチが得られるかもしれません。

それが役立つことを願っています...

于 2012-11-13T17:13:33.960 に答える