我需要根据对象之间的关系在对象SpatialLinesDataFrame
的列表上完成一系列步骤(=通过gdistance
创建的最低成本路径“下坡”;此处使用“ LCP”)对象在MULTI-FEATURE SpatialPolygonsDataFrame
(“多边形”)对象中具有单独的特征。
总而言之,列表中的每个LCP元素都起源于单个多边形要素,并且可能会(也可能不会)穿过一个或多个其他多边形要素,因为它会“下坡”。我想创建新的SpatialLinesDataFrame
元素,以将原始多边形连接到LCP元素相交的每个单独多边形的第一接触点。因此,每个LCP元素都可能成为多个新线特征(n =相交多边形的数量)。理想情况下,每个新线要素都应另存为新列表中的元素。
我想有效地做到这一点,因为我的LCP和多边形要素很多。我是R的新手,而不是程序员,所以,除了上述逐步操作的一个好的解决方案之外,我还想知道如何在代码中引用每个LIST元素和多边形FEATURE。
fyi我问了类似的问题,但是简化了我的示例数据。提供了使用sf
pkg的出色解决方案,但是由于我的LCP不是直线,所以我需要一些不同的东西。有关for循环代码尝试和解决方案的原始问题在这里:R - nested loop for list of SpatialLinesDataFrame intersected with SpatialPolygonsDataFrame objects。
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)
下图显示了A)LCP(即,从原点多边形的质心到最低仰角像元=三角形); B)在完成上述步骤后,我希望将LCP拆分成什么。在此图中,结果将是两个SpatialLinesDataFrames功能;从原点多边形的边界到与第一个相交多边形的第一个接触点为RED的红色;从原点多边形的边界到与第二个相交的多边形的第一个接触点之间呈绿色的第二个(在另一个示例中,如果相交的多边形更多,则以此类推)。