【问题标题】:Calculate area from Lat/Lon matrix or within a 50% contour for multiple polygons in R从纬度/经度矩阵或 R 中多个多边形的 50% 轮廓内计算面积
【发布时间】:2014-02-02 21:39:43
【问题描述】:

我想从内核密度 (kde2d) 的不同轮廓线内找到多个多边形的总面积。 这是内核密度和 50% 等高线的图像。如何计算 50% 等高线内的面积?

我还创建了一个经纬度坐标矩阵,它表示这条 50% 等高线内的点。使用这些点计算总面积会更容易吗?

任何建议将不胜感激!

【问题讨论】:

  • 你是在 lat-long 坐标上做 kde 吗?因为那可能是错的。 1 度的纬度不是 1 度的长度,因此您的圆形内核并不是真正的圆形。转换为笛卡尔坐标系(可能是 UTM 区域)并重试。然后你会得到米,因为坐标和面积计算很容易。
  • 只是为了强调坐标系的东西,在你的纬度,就在南极半岛外,纬度64度线的周长是赤道周长的0.43倍,所以一个经度是2.28倍大于一个纬度。因此,您的内核密度是由 2.28:1 偏心率椭圆估计的。转换为 epsg:32720 之类的内容,然后重试! spatialreference.org/ref/epsg/32720(参见 sp 和 rgdal 包中的 spTransform)
  • @Spacedman,感谢您的关注!事实证明,内核几乎相同。

标签: r coordinates geospatial area contour


【解决方案1】:

一旦您在笛卡尔坐标系中获得坐标,并使用这些坐标进行内核平滑处理,您可以使用 contourLines 函数获取线的坐标,然后使用 @987654323 中的 areapl 函数@包计算每个简单环的面积。

例如使用help(kde2d)中的例子:

attach(geyser)

plot(duration, waiting, xlim = c(0.5,6), ylim = c(40,100))
f1 <- kde2d(duration, waiting, n = 50, lims = c(0.5, 6, 40, 100))
image(f1)
contour(f1)

这就是我们设置的数据 - 假设我们想要 0.008 等高线中的区域:

C8 = contourLines(f1,level=0.008)
length(C8)
[1] 3

现在C8 是一个长度为 3 的列表。我们需要对每个列表应用 areapl 函数:

> sapply(C8,function(ring){areapl(cbind(ring$x,ring$y))})
[1] 14.65282 12.27329 14.75005

我们显然可以总结:

> sum(sapply(C8,function(ring){areapl(cbind(ring$x,ring$y))}))
[1] 41.67617

现在这只有在坐标是笛卡尔坐标并且等高线是完整的循环时才有意义。如果 0.008 轮廓靠近边缘,那么轮廓可能会被剪裁到边界框,然后会发生不好的事情。至少检查每个环的最后一个点是否与第一个相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2023-03-16
    • 2019-05-05
    • 2020-10-13
    • 2012-03-25
    • 2011-03-21
    相关资源
    最近更新 更多