2016-10-22 2 views
0

Ich möchte Zeile mit Linie teilen. (Ich will wie QGIS Algorithmus „Trennlinien mit LinienGeteilte Polylinie mit Polylinie

Funktion tun) "gsection" in einem Paket von stplanr dies tun.

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

Aber die Funktion Rückkehr SpatialLines Klasse.

Ich möchte SpatialLiensdataframe Klasse erhalten, und halten „ID“ usw.

Was soll ich tun?

Antwort

1

ich mich zu erinnern, hatte Was gsection() macht trotz Verpackung in stplrr (der ursprüngliche Code wurde von Barry Rowlingson geschrieben). Es wird hauptsächlich in meiner Arbeit als Hilfsfunktion für overline() verwendet, aber ich entschied mich, es zu exportieren, falls es für andere nützlich/interessant ist. Toll zu sehen ist es!

Die Funktion gibt keine Daten aus einem Grund zurück: einzelne Segmente haben unterschiedliche Anzahlen überlappender Routen.

Allerdings ist es sinnvoll, der Lage sein, Daten abzufragen, aus dem die Segmente kommen, also lassen Sie uns durch einige Code arbeiten, auf Ihrem reproduzierbaren Beispiel Gebäude, um zu sehen, was los ist:

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 

Wie Sie aus der Ausgabe des obigen Code Chunk sehen können, gibt es mehrere Segmente, als es Routen. So kann jedem Segment sicher eine eigene Route zugewiesen werden?

Dies wird nachstehend veranschaulicht. Die 3. Zeile aus den resultierenden Segmenten s (farbig grau) ist das Ergebnis der Überlappung zwischen beiden Linien in r. Welche Datenwerte würden Sie erwarten?

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

Es gibt verschiedene Möglichkeiten, um diese Frage zu beantworten. Der Standardweg in sp::over() ist die erste Überlappung.Aber das ist nicht das, was wir wollen, wie over() eturns ein Spiel, auch wenn die Linien berühren, aber haben keinen gemeinsamen Abstand (werfen Sie einen Blick in die Ergebnisse zu sehen, was ich meine):

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 

result_list = over(x = s, y = r, returnList = T)

result_data eturns die erste passende Zeile von Daten in den Zeilen jedes Segment zu berühren - in diesem Fall, die einfach [email protected][3,] epeated 3 mal sind, nicht sehr nützlich!

Vorausgesetzt, dass Sie zufrieden sind mit die erste Spiel von Linien, die Längen tatsächlich teilen, könnten Sie die (ohne Papiere) verwenden minDimension Argument von over(), beschrieben in vignette("over"):

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 

Ich denke, das Hinzufügen eines Arguments return_data zu der Funktion würde nützlich sein und planen, dies vor der nächsten Veröffentlichung von stplanr zu tun. Es sollte wahrscheinlich etwas darüber sagen, wie viele überlappende Linien jedes Segment als zusätzliche Ausgabe hat.

Vielen Dank für Ihre Anstiftung zu diesen Untersuchungen auf jeden Fall: sehr nützlich.

+0

Vielen Dank für Ihre Hilfe. – ogw

+0

Überrascht, dass Paketautor meine Frage ansieht und beantwortet. Danke für Ihre Hilfe. als ein Ergebnis, löste das Problem. – ogw

+0

Gut zu hören @ogawa. Bitte markieren Sie "Korrigieren", wenn Sie denken, dass es die richtige Antwort ist! – RobinLovelace