在R中创建空间数据

3
我有一个物种数据集,其中包含它们在一个100 x 200米的区域内的大致位置。数据框中的位置部分不是我认为可用的格式。在这个100 x 200米的矩形区域内,有两百个10 x 10米的正方形,分别以A到CV命名。在每个10 x 10平方米的正方形内,分别有四个5 x 5米的小正方形,分别命名为1、2、3和4(1位于2的南侧和3的西侧。4位于2的东侧和3的北侧)。我想让R知道A是具有以下顶点的正方形:(0,0)、(10,0)、(0,0)和(0,10),B位于A的正北方,其顶点为(0,10)、(0,20)、(10,10)和(10,20),K位于A的正东方,其顶点为(10,0)、(10,10)、(20,0)和(20,10),对于所有的10 x 10米的正方形都是如此。此外,我还想让R知道每个5 x 5米的小正方形在100 x 200米的图中的位置。

因此,我的数据框看起来像这样:

10x10    5x5     Tree    Diameter
A    1     tree1    4
B    1     tree2    4
C    4     tree3    6
D    3     tree4    2
E    3     tree5    3
F    2     tree6    7
G    1     tree7    12
H    2     tree8    1
I    2     tree9    2
J    3     tree10   8
K    4     tree11   3
L    1     tree12   7
M    2     tree13   5

最终,我希望能够绘制一个100米x200米的区域图,并让每个10米x10米的正方形显示树木数量、物种数量或总生物量。如何将我已有的数据转化为R可以用于绘图和分析的空间数据是最佳方法?


1
顺便说一下,我对你的区域几何形状有点困惑。你有100个10x10的地块(从A到CV),显然排列成10行--这不是一个100x200而是一个100x100的区域吗?(你在上面某个地方也称其为“正方形”...) - Ben Bolker
我正在手机上打字,对此表示抱歉。现在已经解决了。我正在努力将代码适应我的实际数据,因为这有点抽象。非常感谢您的帮助。这是一个聪明的解决问题的方式。 - Jota
2个回答

6

以下是一个开端。

## set up a vector of all 10x10 position tags
tags10 <- c(LETTERS,
            paste0("A",LETTERS),
            paste0("B",LETTERS),
            paste0("C",LETTERS[1:22]))

将(例如){"J",3} 转换为相应子正方形的中心点的函数。
convpos <- function(pos10,pos5) {
    ## convert letters to major (x,y) positions
    p1 <- as.numeric(factor(pos10,levels=tags10))  ## or use match()
    p1.x <- ((p1-1) %% 10) *10+5    ## %% is modulo operator
    p1.y <- ((p1-1) %/% 10)*10+5    ## %/% is integer division
    ## sort out sub-positions
    p2.x <- ifelse(pos5 <=2,2.5,7.5)   ## {1,2} vs {3,4} values
    p2.y <- ifelse(pos5 %%2 ==1 ,2.5,7.5)  ## odd {1,3} vs even {2,4} values
    c(p1.x+p2.x,p1.y+p2.y)
}

使用方法:

convpos("J",2)
convpos(mydata$tenbytenpos,mydata$fivebyfivepos)

重要提示:

  • 这是一个概念证明,我几乎可以保证x和y坐标的对应关系不是完美的。但你应该能够逐行追踪并了解它正在做什么...
  • 它应该可以在向量上正确工作(请参见上面第二个用法示例):我因此从switch切换到ifelse
  • 当将数据读入R时,您的列名称(10x10)很可能会变成类似于X10.10的东西:?data.frame?check.names

很好,它可以很好地处理向量输入。要获取两个向量,一个是x坐标,另一个是y坐标,您可以编写 x.coords <- convpos(pos10, pos5)[1:(length(pos10)/2)]y.coords <- convpos(pos10, pos5)[(1 + length (pos10)/2: length (pos10)] - Jota

5

与@Ben Bolker所做的类似,这里是一个查找函数(尽管您可能需要转置某些内容以使标签匹配您所描述的内容)。

tenbyten <- c(LETTERS[1:26], 
  paste0("A",LETTERS[1:26]), 
  paste0("B",LETTERS[1:26]), 
  paste0("C",LETTERS[1:22]))

tenbyten <- matrix(rep(tenbyten, each = 2), ncol = 10)
tenbyten <- t(apply(tenbyten, 1, function(x){rep(x, each = 2)}))
# the 1234 squares
squares <- matrix(c(rep(c(1,2),10),rep(c(4,3),10)), nrow = 20, ncol = 20)
# stick together into a reference grid
my.grid <- matrix(paste(tenbyten, squares, sep = "-"), nrow = 20, ncol = 20)

# a lookup function for the site grid
coordLookup <- function(tbt, fbf, .my.grid = my.grid){
  x <- col(.my.grid) * 5 - 2.5
  y <- row(.my.grid) * 5 - 2.5
  marker <- .my.grid == paste(tbt, fbf, sep = "-")
  list(x = x[marker], y = y[marker])
}

coordLookup("BB",2)
$x
[1] 52.5

$y
[1] 37.5

如果这不是你想要的,也许你会更喜欢一个具有正确多边形ID且可以附加数据的SpatialPolygonsDataFrame。在这种情况下,只需搜索如何从头开始创建它,并操作row()col()函数来获取多边形角落,类似于此查找函数提供的内容,该函数仅返回质心。
编辑:启动SPDF:
这是从函数示例修改的,并希望可以作为一个好的起点。
library(sp)
# really you have a 20x20 grid, counting the small ones.
# c(2.5,2.5) specifies the distance in any direction from the cell center
grd <- GridTopology(c(1,1), c(2.5,2.5), c(20,20)))
grd <- as.SpatialPolygons.GridTopology(grd)
# get centroids
coords <- coordinates(polys)
# make SPDF, with an extra column for your grid codes, taken from the above.
# you can add further columns to this data.frame(), using polys@data
polys <- SpatialPolygonsDataFrame(grd, 
  data=data.frame(x=coords[,1], y=coords[,2], my.ID = as.vector(my.grid), 
  row.names=getSpPPolygonsIDSlots(grd)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接