如何在R中定义六边形网格的单元格大小?(目标25km²)
创建指定面积的六边形网格(sf包)
首先明确sf::st_make_grid中六边形的cellsize参数定义:它是六边形两组平行边之间的垂直距离(对边距),不是边长。要生成25km²的六边形网格,需要先通过面积反推这个参数值,同时注意必须使用投影坐标系(单位为米)——地理坐标系(经纬度)的度无法直接对应固定公里数,会导致面积随纬度变化。
步骤1:转换矢量数据到投影坐标系
先将你的生物群系/行政区边界数据转换为合适的投影坐标系(比如UTM投影,根据数据所在区域选择对应带号,示例用巴西塞拉多常用的UTM 23S):
# 转换投影(替换为你数据对应的UTM带号或其他投影CRS) shpCerrado_proj <- sf::st_transform(shpCerrado, crs = 32723)
步骤2:计算所需的cellsize值
六边形面积公式为:
A = (√3/2) * d²
其中A是目标面积,d就是st_make_grid的cellsize(对边距)。
反推d的公式:
d = √( (2*A)/√3 )
代入25km²(即25,000,000平方米)计算:
target_area <- 25 * 1000000 # 转换为平方米 cellsize <- sqrt( (2 * target_area) / sqrt(3) ) cellsize # 结果约为5412.66米(即5.41公里)
步骤3:生成六边形网格
用计算好的cellsize创建网格,并转为sf对象方便后续操作:
# 生成网格 grid <- sf::st_make_grid(x = shpCerrado_proj, cellsize = cellsize, square = FALSE) # 转换为sf对象 grid_sf <- sf::st_sf(geometry = grid)
步骤4:验证网格面积
可以通过st_area检查生成的六边形实际面积:
# 查看第一个六边形的面积 sf::st_area(grid_sf[1,]) # 输出应接近25000000平方米(即25km²)
其他可选方法
如果需要更灵活的网格生成,也可以使用terra包的makeHexGrid函数,逻辑类似,同样需要基于投影坐标系计算参数:
library(terra) # 转换为terra矢量对象 v <- vect(shpCerrado_proj) # 创建六边形网格 hex_grid <- makeHexGrid(v, size = cellsize) # 转回sf对象(可选) hex_grid_sf <- sf::st_as_sf(hex_grid)
内容的提问来源于stack exchange,提问作者Karoline
相关产品推荐
相关产品推荐

