You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:38:32