如何利用样地中心测距测角的三个边界点缩小样地并计算阴影区域面积
样地缩小与阴影区域面积计算方案
一、核心思路
- 极坐标转笛卡尔坐标:将gon单位的角度转换为弧度,结合距离计算每个边界点的平面坐标(以样地中心为原点)。
- 界定缩小后的样地:以三个边界点围成的多边形(或其与原圆形样地的交集)作为缩小后的样地范围(即图中阴影区域)。
- 计算阴影区域面积:使用鞋带公式计算多边形面积;若阴影是圆形与多边形的交集,则借助空间计算工具完成面积统计。
二、R代码实现
1. 数据预处理与坐标转换
先将极坐标(距离+gon角度)转换为笛卡尔坐标:
# 加载空间计算包(用于交集面积计算) library(sf) library(dplyr) # 定义极坐标转笛卡尔坐标的函数 polar_to_cartesian <- function(dist, ang_gon) { # 归一化角度到0-400gon范围 ang_normalized <- ang_gon %% 400 # 转换为弧度(1 gon = π/200 弧度) ang_rad <- ang_normalized * (pi / 200) # 计算坐标(0gon为正北,x轴向东,y轴向北) x <- dist * sin(ang_rad) y <- dist * cos(ang_rad) return(data.frame(x, y)) } # 处理示例数据框 df <- data.frame( Plot_ID = c(1,2), Point_1_dist = c(5,3), Point_1_ang = c(380,400), Point_2_dist = c(10,14), Point_2_ang = c(360,370), Point_3_dist = c(12,5), Point_3_ang = c(50,34), Sampling_plot_radius = c(12,12) ) # 计算每个边界点的笛卡尔坐标 df <- df %>% rowwise() %>% mutate( # Point1坐标 p1_x = polar_to_cartesian(Point_1_dist, Point_1_ang)$x, p1_y = polar_to_cartesian(Point_1_dist, Point_1_ang)$y, # Point2坐标 p2_x = polar_to_cartesian(Point_2_dist, Point_2_ang)$x, p2_y = polar_to_cartesian(Point_2_dist, Point_2_ang)$y, # Point3坐标 p3_x = polar_to_cartesian(Point_3_dist, Point_3_ang)$x, p3_y = polar_to_cartesian(Point_3_dist, Point_3_ang)$y ) %>% ungroup()
2. 计算阴影区域面积
情况1:阴影为三个点围成的三角形面积
使用鞋带公式计算:
# 定义鞋带公式计算多边形面积 polygon_area <- function(x_coords, y_coords) { n <- length(x_coords) area <- 0.5 * abs(sum(x_coords[c(2:n,1)] * y_coords[c(1:n)] - x_coords[c(1:n)] * y_coords[c(2:n,1)])) return(area) } # 计算每个样地的三角形阴影面积 df <- df %>% rowwise() %>% mutate( shadow_area_triangle = polygon_area( x_coords = c(p1_x, p2_x, p3_x), y_coords = c(p1_y, p2_y, p3_y) ) ) %>% ungroup() # 查看结果 df %>% select(Plot_ID, shadow_area_triangle)
情况2:阴影为原圆形与三角形的交集面积
若阴影是原圆形样地与三角形的重叠区域,使用sf包计算:
# 计算每个样地的圆形-三角形交集面积 df <- df %>% rowwise() %>% mutate( # 创建中心在原点的圆形sf对象 circle = st_sfc(st_point(c(0,0))) %>% st_buffer(Sampling_plot_radius), # 创建三角形sf对象 triangle = st_sfc(st_polygon(list(matrix(c(p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p1_x,p1_y), ncol=2, byrow=TRUE)))), # 计算交集面积并转为数值 shadow_area_intersection = st_area(st_intersection(circle, triangle)) %>% as.numeric() ) %>% ungroup() # 查看结果 df %>% select(Plot_ID, shadow_area_triangle, shadow_area_intersection)
三、样地缩小的操作方法
- 获取边界坐标:通过上述代码得到三个边界点的平面坐标,以及原圆形样地的范围。
- 现场划定样地:
- 若阴影为三角形:直接在样地中标记三个边界点,用绳索或标杆连接形成三角形区域,即为缩小后的样地。
- 若阴影为圆形与三角形的交集:根据
sf计算出的交集边界坐标,在原圆形样地内标记出交集区域的边界线,完成样地缩小。
内容的提问来源于stack exchange,提问作者Conny
相关产品推荐
相关产品推荐

