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

基于R的terra与sf包生成等面积全球六边形网格问题咨询

固定面积全球六边形网格生成问题解答

问题1:面积计算结果的正确性与精准网格生成

结果正确性分析

三种面积计算方式的差异来源于坐标系与计算逻辑的不同:

  • terra::expanse(transform=FALSE) 与 sf::st_area():基于等面积投影EPSG:6933的平面坐标计算面积。由于网格本身就是在该等面积投影下生成的,投影设计保证了平面面积与真实地表面积严格一致,因此这两个结果(均为40000 km²)是正确的。
  • terra::expanse(transform=TRUE):会先将多边形转换回WGS84地理坐标系,再基于椭球计算面积。EPSG:6933作为圆柱等面积投影,在高纬度地区存在形状变形,且你的目标范围覆盖至84°N(超出该投影的最优适用纬度范围),导致转换后的多边形出现坐标异常(如部分碎片多边形),最终计算出的面积偏差甚至0值是不可靠的。

生成精准40000 km²网格的验证

你当前的网格尺寸计算逻辑是正确的:

  1. 六边形面积公式为:$Area = \frac{3\sqrt{3}}{2}a^2$($a$为边长)
  2. 推导边长:$a = \sqrt{\frac{2 \times Area}{3\sqrt{3}}}$
  3. st_make_grid的cellsize参数对应flat-topped六边形的对边距离,即$a \times \sqrt{3}$,因此你的hxg_cellsize计算完全正确。

若要进一步验证,可随机选取几个网格多边形,在EPSG:6933下用st_area()计算,结果始终为40000 km²,说明网格面积精准。

问题2:边缘网格衔接与无重叠覆盖

核心思路

由于目标范围是全球东西向全跨度(-180°~180°),需确保网格在投影坐标系下的东西向无缝对齐,转换回WGS84后自然不会出现重叠或断裂;南北方向允许超出边界框,只需让网格覆盖目标bbox即可。

代码调整方案

  1. 设置精准偏移量:通过st_make_grid的offset参数,让网格起始点对齐目标bbox的投影坐标,确保东西向完全覆盖且无重叠:
# 获取投影后的边界框坐标
bbox_metric <- sf::st_bbox(gridObj_metric)

# 计算offset:让网格从bbox左下角外侧开始,确保覆盖完整
# flat-topped六边形的y方向offset设为bbox下边界外移半个cellsize
offset <- c(bbox_metric$xmin, bbox_metric$ymin - hxg_cellsize/2)

# 重新生成网格
rasterPoly_200km_hxg <- sf::st_make_grid(
  gridObj_metric,
  cellsize = hxg_cellsize,
  what = "polygons",
  square = FALSE,
  flat_topped = TRUE,
  offset = offset  # 添加偏移量参数
)
  1. 确保东西向无缝衔接:EPSG:6933是圆柱投影,x坐标与经度严格线性对应,因此生成的网格在x方向从-17367530m(对应180°W)到17367530m(对应180°E)的范围内,自然无缝衔接,转换回WGS84后不会出现东西向重叠。

  2. 保留完整网格(可选):若需要保留完全覆盖目标bbox的完整六边形(而非被bbox裁剪的碎片),可将网格转换为sf对象后,筛选出与目标bbox有交集的完整多边形:

# 转换为sf对象并筛选完整覆盖或相交的多边形
grid_sf <- sf::st_sf(geometry = rasterPoly_200km_hxg) %>%
  sf::st_transform(crs = 4326) %>%
  dplyr::filter(sf::st_intersects(., gridObj_wgs84, sparse = FALSE))

内容的提问来源于stack exchange,提问作者Moehrengulasch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:35:01