【问题标题】:Converting a png file to a window (owin) file in spatstat在 spatstat 中将 png 文件转换为窗口(owin)文件
【发布时间】:2020-05-07 15:16:51
【问题描述】:

我有一个这样的 png 文件 -

我想将其作为 spatstat 中的观察窗口('owin' 类型)。我也有这些点的坐标,但是如果我直接使用它们使用Z <- owin(poly=list(x=x-coordinate, y=y-coordinate)) 创建一个窗口,我会像这样疯狂 -

如何将其作为窗口?谢谢

【问题讨论】:

  • 我们需要有关您的数据的更多详细信息。你能分享数据或只是部分数据,以便我们可以看到结构吗?这是世界特定区域的地图吗?在这种情况下,R 包中可能有现成的数据。
  • 嗨,Ege Rubak,当然,很乐意分享数据。这是来自生物学。我正在应用 spatstat 来了解细胞的分布及其相互作用。我想做一些通信。谢谢。
  • 通常的数据共享方式是通过链接到 Google Drive、Dropbox 等。如果无法访问数据,我们将无法为您提供详细的帮助。
  • 嗨,Ege,谢谢。我能够弄清楚这一点。基本上,我没有弄乱多边形边界,而是转换为蒙版并用作.polygonal。事实证明,这非常有用且高效。
  • 如果您转换为像素蒙版,然后再次转换回来,则会丢失准确性。

标签: geospatial spatstat


【解决方案1】:

这是一个将坐标数据转换为窗口对象的函数 (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)
}

【讨论】:

  • 这太棒了!非常感谢你。关于您的努力,其中一件非常好的事情是您使计算机科学家和程序员都非常容易理解极其困难的数学(测度理论),这个解决方案就是例证。如果将其集成到像我这样的生命科学人员的 spatstat 中,这将非常有用。
【解决方案2】:

你的图片显示窗口是由几个岛组成的。你需要告诉软件,否则它会假设坐标都是同一个岛的一部分,并将它们连接在一起。

owin 的帮助说明,在这种情况下,您需要使用 owin(poly=list(list1, list2, list3, ...)),其中 list1 仅包含岛 1 的坐标,list2 包含岛 2 的坐标,依此类推。这里list1 的格式为list(x, y),但仅包含岛1 的坐标,依此类推。

【讨论】:

  • 尊敬的巴德利教授,感谢您的回复。大窗口中的区域实际上是孔。我尝试了您的解决方案,现在我收到一条错误消息 Error in owin(poly = l1) : Area of the window is negative; check that all polygons were traversed in the right direction。我是一名从事癌症研究的计算生物学系,老实说,地理空间分析对我来说是相当新的。但我会尽力解决这个问题。谢谢。
  • 请仔细查看owin 的帮助文件。大窗口的外边界应为list1=list(x,y),其中x,y 坐标按逆时针 顺序列出,以指定它是外边界。孔应以list2=list(x,y) 等形式给出,其中x,y 坐标按顺时针 顺序列出,以指定它们是孔。这些岛屿应再次以list(x,y)x,y 的形式按逆时针顺序给出。然后拨打owin(poly=list(list1,list2, ...))
  • 好的,谢谢。我发现了。但总的来说,我发现掩码是一个更好的选择,因为处理重复和方向有点困难。我应该说,“as.polygonal”是一个非常好的功能。
  • 我已经发布了一个代码 sn-p 显示如何处理坐标数据。 (目前这是在等待批准的队列中。它应该很快就会出现)
猜你喜欢
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2014-05-05
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2018-01-10
相关资源
最近更新 更多