基于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²网格的验证
你当前的网格尺寸计算逻辑是正确的:
- 六边形面积公式为:$Area = \frac{3\sqrt{3}}{2}a^2$($a$为边长)
- 推导边长:$a = \sqrt{\frac{2 \times Area}{3\sqrt{3}}}$
st_make_grid的cellsize参数对应flat-topped六边形的对边距离,即$a \times \sqrt{3}$,因此你的hxg_cellsize计算完全正确。
若要进一步验证,可随机选取几个网格多边形,在EPSG:6933下用st_area()计算,结果始终为40000 km²,说明网格面积精准。
问题2:边缘网格衔接与无重叠覆盖
核心思路
由于目标范围是全球东西向全跨度(-180°~180°),需确保网格在投影坐标系下的东西向无缝对齐,转换回WGS84后自然不会出现重叠或断裂;南北方向允许超出边界框,只需让网格覆盖目标bbox即可。
代码调整方案
- 设置精准偏移量:通过
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 # 添加偏移量参数 )
确保东西向无缝衔接:EPSG:6933是圆柱投影,x坐标与经度严格线性对应,因此生成的网格在x方向从-17367530m(对应180°W)到17367530m(对应180°E)的范围内,自然无缝衔接,转换回WGS84后不会出现东西向重叠。
保留完整网格(可选):若需要保留完全覆盖目标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
相关产品推荐
相关产品推荐

