2016-10-22 12 views
0

私はラインで分割したい。 (私はQGISアルゴリズムのように行いたい「行で分割線)ポリライン付き分割ポリライン

機能 "gsection" stplanrのパッケージでこれを行う。

library(stplanr) 
data(routes_fast) 
result <- gsection(routes_fast) 
class(result) 

しかし、関数の戻りSpatialLinesクラスを。

私が欲しいですSpatialLiensdataframeクラスを取得し、維持する「ID」など

私は自分自身を思い出させるために持っていた?

答えて

1

何をすべきstplanr(元のコードはBarry Rowlingsonによって書かれました)にパッケージ化されているにもかかわらず、何がgsection()にありますか。これは主に私の仕事ではoverline()のヘルパー機能として使用されていますが、他の人が使用する/興味を持っている場合に備えてエクスポートすることに決めました。それが大好きです!

この関数は、理由のためにデータを返しません。個々のセグメントの重複するルートの数が異なります。

しかし、何が起こっているかを確認するために、あなたの再現性の例を構築、それでは、いくつかのコードを介して動作させ、セグメントが来るそこからデータを照会できるようにするには便利です。

library(stplanr)

## Loading required package: sp 

length(routes_fast) # too many to visualise segments

## [1] 42 

r = routes_fast[3:4,] # take 2 lines to see what's going on s = gsection(r) # split into overlapping sections class(r) # has data, as you say

## [1] "SpatialLinesDataFrame" 
## attr(,"package") 
## [1] "sp" 

class(s) # does not have data!

## [1] "SpatialLines" 
## attr(,"package") 
## [1] "sp" 

length(r) # 2 lines, as expected

## [1] 2 

length(s) # 3 segments with same number of overlaps

## [1] 3 

上記のコードチャンクの出力からわかるように、あるよりも多くのセグメントが存在しますルート。だから、確かに各セグメントはそれ自身のルートを割り当てることができますか? No.

これを以下に示します。結果のセグメントs(グレーの色)の3行目は、両方の行の重複の結果で、rになります。だから、あなたはどのデータ値を持っていると思いますか?

library(tmap) # for awesome plotting abilities qtm(routes_fast[3:4,], line.lwd = 20, line.alpha = 0.3) + qtm(routes_fast[3,], line.lwd = 5) + qtm(s[1,], line.col = "white") + qtm(s[2,], line.col = "black") + qtm(s[3,], line.col = "grey", line.lwd = 2)

lines

この質問に答えるためにさまざまな方法があります。 sp::over()のデフォルトの方法は、最初のオーバーラップを取ることです。

result_data = over(x = s, y = r) result_data

##  plan  start   finish length time waypoint 
## 1 fastest Gledhow Lane Harehills Avenue 2241 475  43 
## 2 fastest Gledhow Lane Harehills Avenue 2241 475  43 
## 3 fastest Gledhow Lane Harehills Avenue 2241 475  43 

:しかし、これは我々がover()はラインが触れなく、任意の共有距離(私が何を意味するかを確認するために結果の内部を見てみましょう)を持っていなくても試合をeturnsよう望むものではありません result_list = over(x = s, y = r, returnList = T)

result_dataは、各セグメントに接触ラインのデータから最初に一致する行をeturns - 単に[email protected][3,]は非常に有用ではない3回、epeatedだこの場合、!

over(x = s, y = r, minDimension = 1)

##  plan  start   finish length time waypoint 
## 1 fastest Gledhow Lane Harehills Avenue 2241 475  43 
## 2 fastest Gledhow Lane  Ekota Place 1864 270  37 
## 3 fastest Gledhow Lane Harehills Avenue 2241 475  43 

あなたは実際の長さを共有する行の最初の試合で満足していると仮定すると、あなたはvignette("over")で説明over()minDimension引数を、(文書化されていない)を使用することができます私は引数return_dataを関数に追加することは有用であり、stplanrの次のリリースの前にそうすることを計画していると思います。おそらく、各セグメントが重なり合っている線の数が追加の出力として何かを示すはずです。

どのような場合でも、これらの調査を扇動していただきありがとうございます。非常に便利です。

+0

ありがとうございます。 – ogw

+0

そのパッケージの著者が私の質問を見て答えていることに驚いた。ご協力ありがとうございました。 resutlとして、問題を解決しました。 – ogw

+0

よろしくお願いします。正解だと思われる場合は「正解」と記入してください! – RobinLovelace

関連する問題