我试图弄清楚如何计算不同水位的河流断面的水填充面积。

对于横截面,我在5 m宽的河流上每25厘米处有一个深度,并且可以根据一个很好回答的先前问题来计算面积
Calculate area of cross section for varying height

x_profile <- seq(0, 500, 25)
y_profile <- c(50, 73, 64, 59, 60, 64, 82, 78, 79, 76, 72,
           68, 63, 65, 62, 61, 56, 50, 44, 39, 25)

library(sf)

#Create matrix with coordinates
m <- matrix(c(0, x_profile, 500, 0, 0, -y_profile, 0, 0),
        byrow = FALSE, ncol = 2)

#Create a polygon
poly <- st_polygon(list(m))

# Calcualte the area
st_area(poly)

但是此横截面仅部分充满水,而这是我现在尝试计算的充满水的横截面。

水从最深处开始填充横截面,然后深度变化,例如:
water_level<-c(40, 38, 25, 33, 40, 42, 50, 39)

是否有人对如何在r中完成操作有任何想法?提前致谢。

最佳答案

此函数计算轮廓线与从轮廓线底部开始指定深度处的直线的交点。这有点多余,因为它还需要x和y配置文件值,这些值在理论上可以从profile中提取:

filler <- function(depth, profile, xprof, yprof, xdelta=100, ydelta=100){
    d = -(max(yprof))+depth
    xr = range(xprof)
    yr = range(-yprof)
    xdelta = 100
    xc = xr[c(1,2,2,1,1)] + c(-xdelta, xdelta, xdelta, -xdelta, -xdelta)
    yc = c(d, d, min(yr)-ydelta, min(yr)-ydelta, d)
    water = st_polygon(list(cbind(xc,yc)))
    st_intersection(profile, water)
}

因此在使用中:
> plot(poly)
> plot(filler(40, poly, x_profile, y_profile), add=TRUE, col="green")
> plot(filler(30, poly, x_profile, y_profile), add=TRUE, col="red")
> plot(filler(15, poly, x_profile, y_profile), add=TRUE, col="blue")

r - 计算横截面面积与高度的函数-LMLPHP

请注意,第一个绿色区域被较深的区域稍微覆盖。还要注意两部分的蓝色区域。您可以使用st_area获得横截面,深度为零时面积为零:
 > st_area(filler(20, poly, x_profile, y_profile))
[1] 2450.761
> st_area(filler(2, poly, x_profile, y_profile))
[1] 15.27778
> st_area(filler(0, poly, x_profile, y_profile))
[1] 0

不知道如果超过个人资料顶部会发生什么...

关于r - 计算横截面面积与高度的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46650208/

10-12 18:48