R - 处理 spatstat 包中的 shapefile 问题将空间线数据帧转换为 psp

R - Handling shapefiles in the spatstat package ISSUES converting spatiallinesdataframe to psp

我的最终目标是使用 Spatstat pointsOnLines 函数沿着我从 SpatialLinesDataFrame 强制转换为 psp 对象的一组路线创建点。

我从一个用 rgdal OGR 加载的形状文件开始。这个形状文件有 24 个特征和 6 个字段。

Structure of SpatialLinesDataFrame

我想强制转换为 psp 对象以在 SpatStat 包中使用。我已经研究了 spatstat 包中的 Handling shapefiles”,但我没有运气;可能是由于不理解(我很新,边走边自学)。

这是 pdf 提供的代码:

out<-lapply(x@lines,function(z) {lapply(z@Lines,as.psp) })
dat<-x@data
for (i in seq(nrow(dat)))
+ out[[i]]<-sapply(out[[i]],"marks<-", value=dat[i, , drop=FALSE])

有人可以告诉我如何将此代码应用到我的空间线数据帧以创建一个 psp 对象,并将我的 sldf 的字段转换为我的 psp 中的标记吗?特别是我在 z 上绊倒了,因为它没有在任何地方定义。什么是函数(z) 还有如何处理"marks<-"。

我已经成功使用了

RL.PSP<-as(RouteLines,"psp") 

但是,这会引发此错误并且不会强制转换字段。

"In as.psp.SpatialLinesDataFrame(from) : 5 columns of data frame discarded"
我需要将字段强制转换为标记,因为一旦我使用 pointsOnLines 函数,我需要能够 link 将点返回到它们来自的行。

听起来像你:

  1. 有一个SpatialLinesDataFrame和相关数据
  2. 想将坐标转换为 spatstat psp 对象
  3. 想要将数据添加回标记

如果是这样的话,以maptools中的fylk为例:

library("maptools")
library("rgdal")
library("spatstat")

base_dir <- system.file("shapes", package = "maptools")
fylk <- readOGR(base_dir, "fylk-val")

is(fylk)
# "SpatialLinesDataFrame" "SpatialLines"          "Spatial" 

现在听起来您想为每个字段保留一个标记(即 SpatialLinesDataFrame 中的 24 个观察值中的每一个),而不是每个线段一个标记?在这种情况下,我们需要迭代每条连接的曲线(即 24 个观察值中的每一个)并将每个曲线视为一个单独的 psp 对象:

out <- lapply(fylk@lines, function(i) { lapply(i@Lines, as.psp) })
out

请注意,这与您在小插图中发布的代码几乎相同。外部 lapply 循环遍历 fylk 中的 @lines 槽。内部 lapply 循环依次获取这 24 个中的每一个并迭代其内部 @Lines 槽并将其转换为 psp 对象。我的猜测是你有一个包含 24 个字段的文件(@lines/外循环),24 个字段中的每一个都将有 3 条或更多行组成一个描述该字段的闭合多边形(@Lines/内循环)。

要将数据添加回(存储为 @data 槽),这是示例的第二部分:

dat <- fylk@data
for (i in seq_along(1:nrow(dat))) {
  out[[i]] <- lapply(out[[i]], "marks<-", value = dat[i, , drop = FALSE])
}

这个:

  1. fylk中取出数据(存储在@data槽中)并保存为dat
  2. datout 现在应该具有相同的行数(您的数据中可能有 24 行)
  3. 对于 out 的每一行,这会将 dat 中的相关行附加为 marks

在您的情况下,将 fylk 替换为您自己的数据框名称。

您可能应该使用 spatstatlinnetlpplppm 来完成手头的任务。对于转换,您可以按照 maptoolsas.linnet.SpatialLines 的帮助文件进行操作。我认为它很好地涵盖了你的情况:

library(maptools)
#> Loading required package: sp
#> Checking rgeos availability: TRUE
library(spatstat)
#> Loading required package: spatstat.data
#> Loading required package: nlme
#> Loading required package: rpart
#> 
#> spatstat 1.61-0.036       (nickname: 'New improved formula') 
#> For an introduction to spatstat, type 'beginner'
dname <- system.file("shapes", package="maptools")
fname <- file.path(dname, "fylk-val.shp")
fylk <- readShapeSpatial(fname)
#> Warning: readShapeSpatial is deprecated; use rgdal::readOGR or sf::st_read
#> Warning: readShapeLines is deprecated; use rgdal::readOGR or sf::st_read
L <- as(fylk, "linnet")
print(max(vertexdegree(L)))
#> [1] 3
L0 <- as.linnet.SpatialLines(fylk, fuse=FALSE)
#> Warning: data contain duplicated points
print(max(vertexdegree(L0)))
#> [1] 2
## extract data associated with each network segment
head(marks(as.psp(L)))
#>     FNODE_ TNODE_ LPOLY_ RPOLY_    LENGTH VALINJE_ VALINJE_ID LTEMA VANNBR
#> 0        3      2      2      2  1429.487        1         97  3211     13
#> 1        5      4      2      1  7369.613        2         97  3211     13
#> 1.1      5      4      2      1  7369.613        2         97  3211     13
#> 1.2      5      4      2      1  7369.613        2         97  3211     13
#> 2        7      8      1      2 11040.943        3         64  3211     13
#> 2.1      7      8      1      2 11040.943        3         64  3211     13
#>         DATO LinesIndex LineIndex
#> 0   19970630          1         1
#> 1   19970630          2         1
#> 1.1 19970630          2         1
#> 1.2 19970630          2         1
#> 2   19970630          3         1
#> 2.1 19970630          3         1