下载的数据包含一些坦率的位置错误,因此首先要做的是将坐标限制为合理的值:
data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))
计算网格单元坐标和标识符仅是从纬度和经度值截断小数的问题。(更一般而言,对于任意栅格,首先将它们居中并缩放以使其单位像元化,将小数点截断,然后重新缩放并更新到其原始位置,如ji
下面的代码所示。)我们可以将这些坐标组合成唯一的标识符,将它们附加到输入数据框,然后将增强的数据框写为CSV文件。每点将有一个记录:
ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)
您可能需要输出汇总每个网格单元中事件的输出。为了说明这一点,让我们计算每个单元格的计数并输出,每个单元格一条记录:
counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")
对于其他汇总,请更改function
的计算中的参数counts
。(或者,使用电子表格或数据库软件通过单元格标识符汇总第一个输出文件。)
作为检查,让我们使用网格中心映射计数以找到地图符号。(位于地中海,欧洲和大西洋的点有可疑的位置:我怀疑其中许多是由于数据输入过程中混合了经纬度而产生的。)
count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
pch = 19, col=colors,
xlab="Longitude of cell center", ylab="Latitude of cell center",
main="Event counts within one-degree grid cells")
现在这个工作流程