R-处理spatstat包中的shapefile问题将spatiallinesdataframe转换为psp
我的最终目标是使用Spatstat pointsOnLines函数沿一组布线创建点,这些布线是我从SpatialLinesDataFrame强制到psp对象的 我从一个用rgdal OGR加载的形状文件开始。此形状文件有24个特征和6个字段 我想强制成为一个psp对象,以便在SpatStat包中使用。我已经研究了spatstat软件包中的处理形状文件,“但是我没有运气;可能是因为不理解(我是新来的,边走边自学) 这是pdf提供的代码:R-处理spatstat包中的shapefile问题将spatiallinesdataframe转换为psp,r,shapefile,spatstat,R,Shapefile,Spatstat,我的最终目标是使用Spatstat pointsOnLines函数沿一组布线创建点,这些布线是我从SpatialLinesDataFrame强制到psp对象的 我从一个用rgdal OGR加载的形状文件开始。此形状文件有24个特征和6个字段 我想强制成为一个psp对象,以便在SpatStat包中使用。我已经研究了spatstat软件包中的处理形状文件,“但是我没有运气;可能是因为不理解(我是新来的,边走边自学) 这是pdf提供的代码: out<-lapply(x@lines,functi
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])
out听起来像你:
具有带有关联数据的SpatialLinesDataFrame
是否要将坐标转换为spatstat
psp
对象
是否要将数据添加回标记
如果是这种情况,请使用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"
请注意,这几乎与您在vignette中发布的代码相同。外部lappy
循环在fylk
中的@lines
槽上迭代。内部lappy
循环依次遍历这24条代码,并在其内部@lines
槽上迭代,并将其转换为psp
对象。我猜一个文件包含24个字段(@lines
/outer-loop),24个字段中的每一个都有3行或更多行组成一个描述该字段的闭合多边形(@lines
/inner-loop)
要将数据添加回(存储为@data
插槽),这是示例的第二部分:
dat <- fylk@data
for (i in seq_along(1:nrow(dat))) {
out[[i]] <- lapply(out[[i]], "marks<-", value = dat[i, , drop = FALSE])
}
dat对于手头的任务,您可能应该使用spatstat
类linnet
、lpp
和lppm
。对于转换,您可以按照maptools
中as.linnet.SpatialLines
的帮助文件进行操作。我认为它很好地涵盖了您的情况:
库(maptools)
#>正在加载所需的包:sp
#>检查rgeos可用性:TRUE
图书馆(spatstat)
#>加载所需包:spatstat.data
#>加载所需包:nlme
#>加载所需包:rpart
#>
#>spatstat 1.61-0.036(昵称:“新改进配方”)
#>要了解spatstat,请键入“初学者”
dname[1]2
##提取与每个网段关联的数据
头部(标记(如psp(L)))
#>FNODE_TNODE_ulpoly_uupoly_uuuuo长度VALINJE_uuo长度VALINJE_uujeID 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
谢谢你,菲尔,在你的指导下,我能够用我的数据集做到这一点!但是,我刚刚注意到,分数只添加到24个列表中的第一个,而不是后续列表。想法?@Aber\R这是因为我在循环中犯了一个错误。我使用了seq\u-alow(nrow(dat))
它只返回1
而不是seq_(1:nrow(dat))
。我已经完美地解决了这个问题。尽管我需要澄清-现在我已经正确地将我的行转换为psp对象列表,但pointsOnLines失败了(is.psp(X)不是真的).我缺少转换的最后一步了吗?我确实运行了outThank-我不确定使用linnet是否适用,因为我的线条不狭窄?如果你有空间线,那么你的线条是直的。psp对象也是。你不会找到很多用于曲线的R包。。。
out <- lapply(fylk@lines, function(i) { lapply(i@Lines, as.psp) })
out
dat <- fylk@data
for (i in seq_along(1:nrow(dat))) {
out[[i]] <- lapply(out[[i]], "marks<-", value = dat[i, , drop = FALSE])
}