在 spatstat 中将 png 文件转换为 window (owin) 文件
Converting a png file to a window (owin) file in spatstat
我有一个这样的 png 文件 -
我想在 spatstat 中将其作为 window 观察('owin' 类型)。我也有这些点的坐标,但是如果我直接使用它们来创建一个 window 使用 Z <- owin(poly=list(x=x-coordinate, y=y-coordinate))
,我会得到像这样疯狂的东西 -
如何将其作为 window?谢谢
你的图片显示window是由几个岛屿组成的。你需要告诉软件,否则它会假设坐标都是同一个岛的一部分,并将它们连接在一起。
owin
的帮助说,在这种情况下,您需要使用 owin(poly=list(list1, list2, list3, ...))
,其中 list1
仅包含岛 1 的坐标,list2
包含坐标对于岛 2,依此类推。这里 list1
的格式为 list(x, y)
,但仅包含岛 1 的坐标。依此类推。
这是一个将坐标数据转换为 window 对象 (owin
) 的函数。
它假定您已将所有多边形顶点坐标收集到一个包含列 x
、y
和 id
的数据框中,其中 x
和 y
是坐标,id
是一个整数,用于区分要视为单独的闭合曲线的每条曲线。
df2owin <- function(df) {
## check that 'df' is a data frame with columns x, y, id
stopifnot(is.data.frame(df))
stopifnot(ncol(df) == 3)
stopifnot(all(c("x", "y", "id") %in% colnames(df)))
## separate according to 'id'
z <- split(df[,c("x","y")], factor(df$id))
## force all curves to be traversed anticlockwise
z <- lapply(z, as.list)
areas <- sapply(z, spatstat.utils::Area.xypolygon)
neg <- (areas < 0)
if(any(neg)) z[neg] <- lapply(z[neg], spatstat.utils::reverse.xypolygon)
## convert them to individual windows
winlist <- lapply(z, function(a) owin(poly=as.list(a)))
## now figure out which curves fall inside other curves
n <- length(winlist)
isinside <- logical(n)
for(i in 1:n) {
for(j in (1:n)[-i]) {
if(is.subset.owin(winlist[[i]], winlist[[j]])) {
isinside[i] <- TRUE
break
}
}
}
## assume there are no islands-within-holes etc.
ishole <- isinside
## holes should be traversed clockwise
if(any(ishole)) z[ishole] <-
lapply(z[ishole], spatstat.utils::reverse.xypolygon)
## now make the combined window
result <- owin(poly=z)
return(result)
}
我有一个这样的 png 文件 -
我想在 spatstat 中将其作为 window 观察('owin' 类型)。我也有这些点的坐标,但是如果我直接使用它们来创建一个 window 使用 Z <- owin(poly=list(x=x-coordinate, y=y-coordinate))
,我会得到像这样疯狂的东西 -
如何将其作为 window?谢谢
你的图片显示window是由几个岛屿组成的。你需要告诉软件,否则它会假设坐标都是同一个岛的一部分,并将它们连接在一起。
owin
的帮助说,在这种情况下,您需要使用 owin(poly=list(list1, list2, list3, ...))
,其中 list1
仅包含岛 1 的坐标,list2
包含坐标对于岛 2,依此类推。这里 list1
的格式为 list(x, y)
,但仅包含岛 1 的坐标。依此类推。
这是一个将坐标数据转换为 window 对象 (owin
) 的函数。
它假定您已将所有多边形顶点坐标收集到一个包含列 x
、y
和 id
的数据框中,其中 x
和 y
是坐标,id
是一个整数,用于区分要视为单独的闭合曲线的每条曲线。
df2owin <- function(df) {
## check that 'df' is a data frame with columns x, y, id
stopifnot(is.data.frame(df))
stopifnot(ncol(df) == 3)
stopifnot(all(c("x", "y", "id") %in% colnames(df)))
## separate according to 'id'
z <- split(df[,c("x","y")], factor(df$id))
## force all curves to be traversed anticlockwise
z <- lapply(z, as.list)
areas <- sapply(z, spatstat.utils::Area.xypolygon)
neg <- (areas < 0)
if(any(neg)) z[neg] <- lapply(z[neg], spatstat.utils::reverse.xypolygon)
## convert them to individual windows
winlist <- lapply(z, function(a) owin(poly=as.list(a)))
## now figure out which curves fall inside other curves
n <- length(winlist)
isinside <- logical(n)
for(i in 1:n) {
for(j in (1:n)[-i]) {
if(is.subset.owin(winlist[[i]], winlist[[j]])) {
isinside[i] <- TRUE
break
}
}
}
## assume there are no islands-within-holes etc.
ishole <- isinside
## holes should be traversed clockwise
if(any(ishole)) z[ishole] <-
lapply(z[ishole], spatstat.utils::reverse.xypolygon)
## now make the combined window
result <- owin(poly=z)
return(result)
}