R-处理spatstat包中的shapefile问题将spatiallinesdataframe转换为psp

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

我的最终目标是使用Spatstat pointsOnLines函数沿一组布线创建点,这些布线是我从SpatialLinesDataFrame强制到psp对象的

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

我想强制成为一个psp对象,以便在SpatStat包中使用。我已经研究了spatstat软件包中的处理形状文件,“但是我没有运气;可能是因为不理解(我是新来的,边走边自学)

这是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])
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])
    }