计算横截面面积作为高度的函数
Calculate area of cross-section as function of height
我想弄清楚如何计算不同水位的河流横截面的蓄水面积。
对于横截面,我在 5 米宽的河流上每 25 厘米处有一个深度,并且可以根据前面一个很好回答的问题计算面积
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 中完成此操作?提前致谢。
此函数计算剖面与距离剖面底部指定深度处的一条线的交点。它有点多余,因为它还需要理论上可以从 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)
}
正在使用中:
> 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
获得横截面,并且在深度为零时面积为零:
> 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
不确定如果您超过个人资料顶部会发生什么...
我想弄清楚如何计算不同水位的河流横截面的蓄水面积。
对于横截面,我在 5 米宽的河流上每 25 厘米处有一个深度,并且可以根据前面一个很好回答的问题计算面积
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 中完成此操作?提前致谢。
此函数计算剖面与距离剖面底部指定深度处的一条线的交点。它有点多余,因为它还需要理论上可以从 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")
请注意第一个绿色区域被较深的区域略微覆盖。还要注意蓝色区域是如何分为两个部分的。您可以使用 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
不确定如果您超过个人资料顶部会发生什么...