获取栅格地图中的补丁坐标(R中的栅格包)

时间:2013-03-26 08:41:25

标签: r coordinates raster

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

2 个答案:

答案 0 :(得分:4)

如果通过补丁你的意思是团块,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

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

你使用directions = 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

也许是clump'centroids'

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 库。 modeltools由硬币调用,也许 其他统计图书馆。

答案 1 :(得分:1)

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

# 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)