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

如何制作保留国家边界完整网格的地图六边形格网?

解决六边形格网边界完整保留的问题

问题说明

当前代码生成的六边形格网在葡萄牙大陆边界处被裁剪,需要生成边界处完整的六边形网格,而非被区域边界切割后的残缺网格。

解决方案思路

核心逻辑:先生成覆盖目标区域及周边足够范围的完整六边形网格,再筛选出中心落在目标区域内的网格。这样既保证所有保留的网格都是完整的,又能覆盖目标区域的有效范围。

修改后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:25:12