R - обрезать СПИСОК путей наименьшей стоимости, пересекаемых с объектами SpatialPolygonsDataFrame - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть ряд шагов, которые мне нужно выполнить для LIST из объектов SpatialLinesDataFrame (= путь с наименьшей стоимостью, проходящий по «наклону вниз», созданному с использованием] gdistance; «LCP» в данном документе) объектов на основе их отношений с отдельными функциями в пределахобъект MULTI-FEATURE SpatialPolygonsDataFrame ('polygons').

Подводя итог, можно сказать, что каждый элемент LCP в списке происходит внутри одного объекта многоугольника и может проходить или не проходить через один или несколько других объектов многоугольника, какон «течет» под гору.Я хочу создать новый элемент SpatialLinesDataFrame, чтобы соединить исходные полигоны с первой точкой контакта для каждого отдельного полигона, пересекаемого элементом LCP.Таким образом, каждый элемент LCP может стать множеством новых линейных объектов (n = количество пересеченных многоугольников).В идеале каждый новый линейный объект должен быть сохранен как элемент в новом списке.

Я хотел бы сделать это эффективно, так как у меня много LCP и многоугольников.Я новичок в R и не программист, поэтому, помимо хорошего решения из пошаговой процедуры, описанной выше, я хотел бы знать, как ссылаться на каждый элемент LIST и многоугольник FEATURE в коде.

fyi Iзадал похожий вопрос, но слишком упростил мой пример данных.Было предоставлено отличное решение с использованием sf pkg, но мне нужно что-то немного другое, учитывая, что мои LCP не прямые.Оригинальный вопрос с попыткой и решением для кода цикла здесь: R - вложенный цикл для списка SpatialLinesDataFrame, пересекаемого с объектами SpatialPolygonsDataFrame .

library(rgdal)
library(raster)
library(rgeos)
library(sp) 
library(gdistance)

#Reproducible example data prep:
#'RDCO Regional Parks' data can be downloaded here: https://data-rdco.opendata.arcgis.com/datasets?group_ids=1950175c56c24073bb5cef3900e19460 
parks <- readOGR("/Users/rachelfield/Documents/UBC/Data/Regional Districts/RDCO/RDCO_Regional_Parks/RDCO_Regional_Parks.shp")

#DEM data downloaded here: https://pub.data.gov.bc.ca/datasets/175624/82e/ (files for '082e14_w.dem')
dem <- raster("/path/to/example/data/082e14_w.dem")
demproj <- "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs"

#reproject parks to match dem
p <- spTransform(parks, demproj)

#subset of parks data to reduce for example
e <- extent(dem)
p_crop <- crop(p, e)
p_sub <- p_crop[p_crop@data$Shapearea > 100000,]
p_sub2 <- p_sub[p_sub@data$CommonName != "Mission Creek Greenway Regional Park",]
#fyi I delete polygon [7,] because violates rules of my actual data (polygons do not touch)

#create polygon centroids and convert to SpatialPointsDataFrame using data from each 'origin' polygon data.frame
p_cent <- gCentroid(p_sub, byid = TRUE)
p_centdf <- SpatialPointsDataFrame(p_cent, data = data.frame(p_sub), match.ID = FALSE)

#manually create approx location of lowest elevation cell
lowest <- SpatialPoints(coords = cbind(-119.47,49.86), proj4string = CRS("+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs"))

#find LCPs from 'origin' polygon centroids to lowest elevation cell
tr <- transition(dem, transitionFunction=function(x) 1/min(x), directions=8) 
trCost <- geoCorrection(tr, type="c")
#run shortestPath (LCP) analysis for all polygon centroids
lcp_list <- list()
for(i in 1:nrow(p_centdf)){
  origin <- p_centdf[i,]
  #find LCP from each centroid
  lcp <- shortestPath(trCost, origin, goal = lowest, output="SpatialLines")
  #convert LCP SpatialLines to SpatialLinesDataFrame object type, and preserve ID from original centroid 
  lcp_list[[i]] <- SpatialLinesDataFrame(lcp, data = data.frame(p_centdf[i,]), match.ID = FALSE)
}

#plot example data
plot(dem)
plot(p_sub2,add=T, border = 'green')
plot(p_cent, add=T, pch = 19)
plot(lowest, add=T, pch=18, cex=2)
lapply(lcp_list, plot, add=T, lty=3)
legend(-119.24, 49.96, legend=c("centroid", "lowest", "LCP"), pch=c(19,18,NA), lty=c(NA,NA,3), cex=1)

enter image description here Ниже приведен рисунок, показывающий A) LCP (т.е. от центра тяжести исходного многоугольника до ячейки с наименьшей высотой = треугольник);и B) то, на что я хочу разделить LCP после того, как вышеупомянутые шаги выполнены.На этом рисунке результатом будут две функции SpatialLinesDataFrames;один в КРАСНОМ от границы исходного полигона до первой точки контакта с первым пересеченным многоугольником;вторая в ЗЕЛЕНОМ от границы исходного полигона до первой точки контакта со вторым пересекающимся многоугольником (и так, если в другом примере было пересечено больше многоугольников).

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...