2

我有一个带有许多补丁的栅格地图(具有相同值的连续单元格)。我需要做的是获取每个补丁的中心(或靠近中心)的坐标。我对光栅包非常缺乏经验,但似乎只有知道地图中单元格的位置才能获得坐标。有没有办法获得坐标来代替单元格的值?谢谢

4

2 回答 2

5

如果补丁是指团块,则 Raster 包允许您查找和隔离团块。以clump()光栅包为例,并对其进行扩展:

library(raster)
library(igraph)
detach("package:coin", unload=TRUE)
r <- raster(ncols=12, nrows=12)
set.seed(0)
r[] <- round(runif(ncell(r))*0.7 )
rc <- clump(r)
clump_id <- getValues(rc)    
xy <- xyFromCell(rc,1:ncell(rc))
df <- data.frame(xy, clump_id, is_clump = rc[] %in% freq(rc, useNA = 'no')[,1])
df[df$is_clump == T, ]

plot(r)

r

plot(rc)
text(df[df$is_clump == T, 1:2], labels = df[df$is_clump == T, 3])

rc

可能没有你想象的那么有趣。

你用方向来做这一切= 4

rc <- clump(r, directions = 4)
clump_id <- getValues(rc)    
xy <- xyFromCell(rc,1:ncell(rc))
df <- data.frame(xy, clump_id, is_clump = rc[] %in% freq(rc, useNA = 'no')[,1])
df[df$is_clump == T, ]

要得到

rc4

也许是丛生的“质心”

dfm <- ddply(df[df$is_clump == T, ], .(clump_id), summarise, xm = mean(x), ym = mean(y))
plot(rc)
text(dfm[, 2:3], labels = dfm$clump_id)

rc4mean

备注

如果您尝试在clump()没有先分离模型工具库的情况下使用,则会出现错误。modeltools 由 coin 和其他统计库调用。

于 2013-03-26T10:54:12.343 回答
2

您可以取每个补丁的坐标的平均值:

# some dummy data
m <- matrix(c(
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,4,4,0,
    0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,4,4,0,
    0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,4,4,0,
    0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
    0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
    0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
    0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
    0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
    0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
    0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
    0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,
    0,0,2,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
    0,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), nrow=20, byrow=T)

# create a raster
r <- raster(m)

# convert raster to points
p <- data.frame(rasterToPoints(r))

# filter out packground
p <- p[p$layer > 0,]

# for each patch calc mean coordinates
sapply(split(p[, c("x", "y")], p$layer), colMeans)
于 2013-03-26T08:55:08.447 回答