R 计算作为高度函数的横截面面积

R 计算作为高度函数的横截面面积,r,area,integral,R,Area,Integral,我试图找出如何计算不同水位下河流横截面的充水面积 对于横截面,我有5米宽河流上每25厘米的深度,可以根据前面一个回答很好的问题计算面积 x_profile此函数计算外形与外形底部指定深度处的直线的交点。它有点多余,因为它还需要x和y轮廓值,理论上可以从轮廓中提取: filler <- function(depth, profile, xprof, yprof, xdelta=100, ydelta=100){ d = -(max(yprof))+depth xr = ra

我试图找出如何计算不同水位下河流横截面的充水面积

对于横截面,我有5米宽河流上每25厘米的深度,可以根据前面一个回答很好的问题计算面积


x_profile此函数计算外形与外形底部指定深度处的直线的交点。它有点多余,因为它还需要x和y轮廓值,理论上可以从
轮廓中提取:

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)
}

请注意,第一个绿色区域被较浅的区域略微覆盖。还要注意蓝色区域在两个部分中的表现。您可以使用
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

不确定如果你超过你的剖面顶部会发生什么…

你的
水位值是否与
y\u剖面值相同?我想你只需要找出
y\u剖面
水位
之间的差异,但是如果没有相同数量的值,这将很难做到。因此对于
水位
是40,那么水位y轴的值是
max(y\u剖面)-40
=42?一种方法是在水面上构建一个矩形,包围剖面,并使用
st_intersection
与剖面相交。请注意,在R中有关GIS操作的问题可能在GIS上做得更好。stackexchange。com@shea水位仅在横截面的最深处测量剖面,与Spacedman描述的水位一样,40表示最大水位Y轴值(Y剖面)。非常感谢!下次我会注意到这一点!非常感谢你的回答!那很有效!
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")
 > 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