Разделить полилинию полилинией

Я хочу разделить строку на строку. (Я хочу сделать как алгоритм QGIS "разделить строки линиями")

функция "gsection" в пакете stplanr делает это.

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

Но функция возвращает класс SpatialLines.

Я хочу получить класс SpatialLiensdataframe и сохранить «ID» и т. д.

Что я должен делать?


person ogw    schedule 22.10.2016    source источник


Ответы (1)


Мне пришлось напомнить себе, что делает gsection(), несмотря на то, что он упакован в stplanr (исходный код был написан Барри Роулингсоном). Он используется в основном в моей работе как вспомогательная функция для 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

Как видно из вывода приведенного выше фрагмента кода, сегментов больше, чем маршрутов. Так что, конечно, каждому сегменту может быть выделен свой собственный маршрут? Нет.

Это показано ниже. 3-я строка из получившихся сегментов s (выделена серым цветом) является результатом наложения обеих строк в 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)

линии

Есть разные способы ответить на этот вопрос. По умолчанию в sp::over() используется первое перекрытие. Но это не то, что нам нужно, поскольку 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

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

result_dataвозвращает первую совпадающую строку из данных в строках, касающихся каждого сегмента - в данном случае это просто routes_fast@data[3,]повторяется 3 раза, не очень полезно!

Предполагая, что вас устраивает первое совпадение строк с одинаковой длиной, вы можете использовать (недокументированный) аргумент minDimension для over(), описанный в 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

Я думаю, что добавление аргумента return_data к функции было бы полезно, и я планирую сделать это до следующего выпуска stplanr. Вероятно, следует сказать что-то о том, сколько перекрывающихся строк имеет каждый сегмент в качестве дополнительного вывода.

Большое спасибо за то, что вы инициировали эти расследования в любом случае: очень полезно.

person RobinLovelace    schedule 22.10.2016
comment
Спасибо за помощь. - person ogw; 23.10.2016
comment
Удивлен, что автор пакета посмотрел и ответил на мой вопрос. Спасибо за помощь. в итоге решил проблему. - person ogw; 23.10.2016
comment
Приятно слышать @ogawa. Пожалуйста, отметьте «Правильно», если считаете, что это правильный ответ! - person RobinLovelace; 25.10.2016