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)
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.
Vielen Dank für Ihre Hilfe. – ogw
Überrascht, dass Paketautor meine Frage ansieht und beantwortet. Danke für Ihre Hilfe. als ein Ergebnis, löste das Problem. – ogw
Gut zu hören @ogawa. Bitte markieren Sie "Korrigieren", wenn Sie denken, dass es die richtige Antwort ist! – RobinLovelace