Преобразование файла png в файл окна (owin) в spatstat - PullRequest
0 голосов
/ 07 мая 2020

У меня есть такой файл png -

png file

Я хочу сделать это как окно наблюдения (тип 'owin') в spatstat . У меня также есть координаты этих точек, но если я использую их напрямую для создания окна с использованием Z <- owin(poly=list(x=x-coordinate, y=y-coordinate)), я получаю что-то безумное вроде этого -

enter image description here

Как мне получить это как окно? Спасибо

Ответы [ 2 ]

1 голос
/ 14 мая 2020

Вот функция для преобразования ваших данных координат в объект окна (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)
}
1 голос
/ 08 мая 2020

На вашем фото видно, что окно состоит из нескольких островов. Вам нужно сообщить об этом программе, иначе она будет считать, что все координаты являются частью одного острова, и соединит их вместе.

В справке для owin указано, что в этом случае вам необходимо используйте owin(poly=list(list1, list2, list3, ...)), где list1 содержит координаты только острова 1, list2 содержит координаты острова 2 и так далее. Здесь list1 имеет формат list(x, y), но содержит только координаты для острова 1. и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...