如何制作保留国家边界完整网格的地图六边形格网?
解决六边形格网边界完整保留的问题
问题说明
当前代码生成的六边形格网在葡萄牙大陆边界处被裁剪,需要生成边界处完整的六边形网格,而非被区域边界切割后的残缺网格。
解决方案思路
核心逻辑:先生成覆盖目标区域及周边足够范围的完整六边形网格,再筛选出中心落在目标区域内的网格。这样既保证所有保留的网格都是完整的,又能覆盖目标区域的有效范围。
修改后的代码
library(tidyverse) library(sf) library(giscoR) # 获取葡萄牙大陆NUTS1区域数据并转换为UTM投影(避免距离计算误差) nuts1_continente <- gisco_get_nuts( nuts_id = "PT1", year = "2021", resolution = "1", nuts_level = "1", update_cache = TRUE ) continente_utm <- st_transform(nuts1_continente, 25829) # 生成完整六边形网格并筛选 cellsize <- 22800 # 缓冲距离取六边形外接圆半径(对应中心到顶点的距离),确保覆盖所有关联的完整网格 buffer_dist <- cellsize / sqrt(3) # 基于缓冲后的区域生成完整六边形网格 hex_grid_full <- continente_utm |> st_buffer(dist = buffer_dist) |> st_make_grid(square = FALSE, cellsize = cellsize, crs = st_crs(continente_utm)) |> st_sf() |> mutate(grid_id = seq_len(n())) # 筛选中心落在原区域内的完整网格 hex_grid_complete <- hex_grid_full |> mutate(centroid = st_geometry(st_centroid(geometry))) |> filter(st_intersects(centroid, continente_utm, sparse = FALSE)) |> select(-centroid) # 可视化验证 ggplot() + geom_sf(data = continente_utm, fill = "white", color = "black") + geom_sf(data = hex_grid_complete, alpha = 0.3, fill = "lightblue") + theme_void()
关键修改点
- 用
st_buffer扩展目标区域范围,确保生成的网格包含所有可能与原区域关联的完整六边形 - 替换
st_intersection为基于网格中心的筛选:只保留中心落在原区域内的完整六边形,避免网格被边界裁剪 - 缓冲距离的计算:根据六边形几何特性取
cellsize / sqrt(3),确保缓冲范围足够覆盖所有需要的完整网格
内容的提问来源于stack exchange,提问作者lbarqueira
相关产品推荐
相关产品推荐

