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 将点返回到它们来自的行。
听起来像你:
- 有一个
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"
现在听起来您想为每个字段保留一个标记(即 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])
}
这个:
- 从
fylk
中取出数据(存储在@data
槽中)并保存为dat
dat
和 out
现在应该具有相同的行数(您的数据中可能有 24 行)
- 对于
out
的每一行,这会将 dat
中的相关行附加为 marks
在您的情况下,将 fylk
替换为您自己的数据框名称。
您可能应该使用 spatstat
类 linnet
、lpp
和 lppm
来完成手头的任务。对于转换,您可以按照 maptools
中 as.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
我的最终目标是使用 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 将点返回到它们来自的行。
听起来像你:
- 有一个
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"
现在听起来您想为每个字段保留一个标记(即 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])
}
这个:
- 从
fylk
中取出数据(存储在@data
槽中)并保存为dat
dat
和out
现在应该具有相同的行数(您的数据中可能有 24 行)- 对于
out
的每一行,这会将dat
中的相关行附加为marks
在您的情况下,将 fylk
替换为您自己的数据框名称。
您可能应该使用 spatstat
类 linnet
、lpp
和 lppm
来完成手头的任务。对于转换,您可以按照 maptools
中 as.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