【问题标题】:Producing a 1 km grid of mean pond areas using coordinates of ponds and their pond areas使用池塘及其池塘面积的坐标生成 1 公里的平均池塘面积网格
【发布时间】:2015-01-14 14:59:42
【问题描述】:

我有英格兰肯特郡 17,306 个池塘的北向和东向坐标,以及几乎所有池塘的面积(以平方米为单位)。我正在尝试创建一个 1 公里的网格,它给出每个网格正方形的平均池塘面积,同时为没有池塘的网格正方形提供 0 值。 我一直在寻找与我类似的问题,并找到了一个使用薄板样条算法生成英国上空网格化降雨数据的问题,然后将表面绘制到该网格上并将数据写入表格 (How to produce gridded output in R and eliminate grid squares that are not over land?)。

我已经能够在我的少量数据上使用此代码来产生类似的结果。以下是我的少量数据的示例。

dput(head(KentPonds, 10))    

structure(list(Eastings = c(572745.0557, 578793.9616, 573157.8562, 
573664.2026, 572735.0952, 572738.741, 572742.0182, 572281.0791, 
572267.6893, 573673.0182), Northings = c(179326.0157, 179249.0268, 
179184.2076, 179173.6464, 179148.6766, 179123.1966, 179067.6473, 
179050.8956, 178994.7816, 178996.945), PondArea_sqm = c(448L, 
85L, 52L, 183L, 318L, 511L, 276L, 330L, 772L, 203L)), .Names = c("Eastings", 
"Northings", "PondArea_sqm"), row.names = c(NA, 10L), class = "data.frame")

#looks like this
Eastings Northings PondArea_sqm
572745.1  179326.0          448
578794.0  179249.0           85
573157.9  179184.2           52
573664.2  179173.6          183
572735.1  179148.7          318
572738.7  179123.2          511
572742.0  179067.6          276
572281.1  179050.9          330
572267.7  178994.8          772
573673.0  178996.9          203

library(fields)
library(maptools)
library(gstat)


names(KentPonds) <- c("Eastings", "Northings", "PondArea_sqm") 

fit <- Tps(cbind(KentPonds$Eastings,KentPonds$Northings),KentPonds$PondArea_sqm)
surface(fit)

xvals <- seq(500000, 650000, by=1000)
yvals <- seq(115000, 190000, by=1000)

griddf <- expand.grid(xvals, yvals)
griddf$pred <- predict(fit, x=as.matrix(griddf))
write.table(griddf, file="PArea1000_Grid(1).csv", sep=",", qmethod="double")

使用所有 17,306 个池塘它会导致我的计算机崩溃,但更重要的是,我希望能够以某种方式对其进行调整,而不是通过 tps 产生的预测值,我会得到我想要的,即每个网格正方形的平均池塘面积.我一直觉得这非常困难,所以如果有人能提供解决方案或指出正确的方向,我将不胜感激。

亲切的问候,

艾丹

【问题讨论】:

  • 为了使这个可重现:在 KentPonds 上运行 dput 并将结果粘贴到示例的开头(例如,KentPonds &lt;- structure(list( ... ), class = "data.frame"))。此外,恕我直言,您的空间方法可能会产生相当大的错误。对于仅基于质心位置聚合池塘区域的分辨率,1 公里网格可能过于精细。
  • 有趣的是,在肯特,至少在低池塘密度的情况下,错误可能是高池塘尺寸高度偏向较小的池塘。但是,您可能是对的,并且可能有必要增加网格大小,但我仍然存在创建网格的 R 技能不足的问题。

标签: r plot coordinates r-grid


【解决方案1】:

如何创建一些额外的列来指示网格参考,然后使用dplyr 创建聚合度量。我还展示了它的绘图。 PS 我缩小了您的 xvals 和 yvals 范围,以便提供的数据集中的项目更加可见:

KentPonds<-read.table(header=T,text="Eastings Northings PondArea_sqm
572745.1  179326.0          448
578794.0  179249.0           85
573157.9  179184.2           52
573664.2  179173.6          183
572735.1  179148.7          318
572738.7  179123.2          511
572742.0  179067.6          276
572281.1  179050.9          330
572267.7  178994.8          772
573673.0  178996.9          203
")

xvals <- seq(570000, 575000, by=1000)
yvals <- seq(178000, 181000, by=1000)

KentPonds$x<-ceiling(KentPonds$Eastings/1000)*1000
KentPonds$y<-ceiling(KentPonds$Northings/1000)*1000

require(dplyr) # for aggregation
require(ggplot2) # for plotting

ponds_sqkm<-group_by(KentPonds,x,y) %.% 
  summarise(mean=mean(PondArea_sqm),total=sum(PondArea_sqm))

plotdata<-merge(ponds_sqkm,expand.grid(x=xvals,y=yvals),all.y=T)

ggplot(plotdata) + theme_bw() +
  geom_tile(aes(x,y,fill=mean)) +
  scale_fill_continuous(low="white",high="red",na.value="white")

【讨论】:

  • 感谢 Troy 完美地使用了我的所有数据并为我节省了大量时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多