【问题标题】:Difference in area calculation and pixel count面积计算和像素数的差异
【发布时间】:2020-09-26 23:31:12
【问题描述】:

我有一个被河流网络以二进制形式掩盖的栅格图层。在计算编号时。 R (freq(raster)) 和使用 r.report 的 QGIS 中的像素数我在两者中发现了相同的数字。但是在以平方公里为单位计算面积时,我发现由 (tapply(area(raster), raster[], sum)) 和 QGIS 计算的面积 R 存在差异。但是,我遇到的主要问题是为什么面积计算与像素数不符?栅格的分辨率为 30 秒(约 1km*1km),因此像素数必须约等于以平方公里为单位的面积。栅格具有地理坐标系 OGC:CRS84 - WGS 84 (CRS84) - Geographic,格式为 .grd。我还将它投影到 QGIS 的 UTM,这略微增加了面积,但差别不大。 我还在下面发布来自 R 和 QGIS 的报告,如果您也想查看栅格,请点击下面的链接。我想要区域中的值,所以我真的不知道是否应该将像素数转换为以平方公里为单位的区域。在这种情况下,它应该相等或使用 R 或 QGIS 的答案之一。

在 QGIS 区域的 r.report 中,以平方公里为单位与像素: 0 值:222、520 与 290,767 1 个值:81,653 与 106,934

在 Rstudio 区域(以平方公里为单位)与像素: 0 值:222,068.53 与 290,767 1 个值:81,484.18 与 106,934

https://drive.google.com/drive/folders/1pBba0ejIc4t9ayKl36nyIo3vbgD4BKCT?usp=sharing

【问题讨论】:

  • 网格单元的面积在地理坐标系中不是一个常数(主要是因为一个经度的长度随纬度而变化)。所以没有理由面积需要与网格单元的数量成正比。还请注意,重新投影到 UTM 将改变 QGIS 中计算的值
  • @dww 那么我应该遵循 R 或 QGIS 哪个答案?重新投影也会产生错误信息吗?

标签: r pixel area qgis


【解决方案1】:

使用 R raster 包,经度/纬度栅格单元的面积以 m2 为单位计算。另请注意,在赤道,一个 30 秒的单元大约是 860 平方米,并且这个面积随着朝向两极而减小。

给定单元格数量n,以及您的栅格lat的平均纬度,该区域应该是大约

n * 860 * cos(lat*pi/180)

raster 中显示正确(内存安全)方法的示例

#example data
library(raster)
r <- raster()
set.seed(67)
values(r) <- 0
r[sample(ncell(r), 1000)] <- 1

#select the cells that are not 0
rr <- reclassify(r, cbind(0,NA))

a <- area(rr)
aa <- mask(a, rr)

cellStats(aa, "sum")

---- 使用您的数据

r <- raster("raster.grd")
rr <- reclassify(r, cbind(0, NA))
a <- area(r)
aa <- mask(a, rr)
cellStats(aa, "sum")
#81484.18

即约8.1万平方公里

【讨论】:

  • 根据您给出的命令,我得到了最终答案[1] 508358771。这是以平方米为单位的非零值区域吗?像素数为 106,934 看起来不是很离谱吗?在任何情况下转换像素号。正如您所说,直接到区域是错误的,在赤道附近,一个 30 秒的单元大约是 860 平方米。感兴趣的区域是恒河-布拉马普特拉-梅格纳 (GBM) + 另一个盆地的更多区域(驱动器中给出了光栅链接)。同样在 QGIS 中,我使用了一个草 gis 插件 r.report,以不同的指标呈现报告 grass.osgeo.org/grass78/manuals/r.report.html>
  • 这是不是NA 的单元格区域---请参阅我的扩展答案;我忘了添加蒙版步骤
  • 所以使用这个新命令我得到了面积 8031377。如果这个面积的平方公里看起来太大(800 万平方公里),如果它的平方米看起来太小,那么这个面积的单位是什么( =8.03 平方公里)。计算的像素数为 106,934(非零值)。还有为什么要通过set.seed生成随机数?
  • 我知道在您的数据中包含一个示例。如果您使用 R 得到另一个结果,那么请在问题中准确说明您是如何得到的。
  • 你的新代码在“----你的数据是”我确实得到了 (81484.18) 但以前代码是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2022-01-17
  • 2012-12-22
相关资源
最近更新 更多