在 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) 的函数。

它假定您已将所有多边形顶点坐标收集到一个包含列 xyid 的数据框中,其中 xy 是坐标,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)
}