You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R中将地理多边形分割为1km×1km的等面积多边形?

没问题!这个需求完全可以用R实现,我给你整理了一套完整的实操步骤,结合空间处理工具和ggmap就能搞定,跟着下面的代码走就行:

实现步骤

1. 先加载必备的R包

咱们需要用到几个核心包:sf用来处理空间数据,ggmap调用谷歌地图底图,dplyr辅助数据处理。如果还没安装,先运行下面的代码安装:

# 安装包(首次运行需要)
install.packages(c("sf", "ggmap", "dplyr"))

# 加载包
library(sf)
library(ggmap)
library(dplyr)

2. 准备你的多边形边界

假设你已经有了目标多边形的空间数据(比如Shapefile、GeoJSON),先把它读进来转换成sf对象。如果是Shapefile,用st_read()就行:

# 读取你的多边形文件(替换成你的文件路径)
my_polygon <- st_read("你的多边形文件路径.shp")

# 确认数据的坐标系,一般谷歌地图用WGS84(EPSG:4326),如果不是先转换
my_polygon <- st_transform(my_polygon, crs = 4326)

3. 生成1km×1km的方格网格

这里要注意:经纬度坐标系(WGS84)的单位是度,不能直接生成km级的网格,所以咱们得先把多边形转成以米为单位的投影坐标系(比如UTM),生成网格后再转回来:

# 自动判断适合的UTM投影(根据多边形的中心经纬度)
utm_crs <- st_crs(my_polygon) %>% 
  st_transform(crs = "+proj=utm +zone=auto +datum=WGS84 +units=m") %>% 
  st_crs()

# 把多边形转成UTM投影
polygon_utm <- st_transform(my_polygon, crs = utm_crs)

# 生成边界框,创建1km×1km的网格
grid_utm <- st_make_grid(
  polygon_utm,
  cellsize = c(1000, 1000),  # 1000米×1000米
  what = "polygons"          # 生成多边形网格
) %>% 
  st_sf()  # 转成sf对象

# 把网格转回WGS84坐标系,方便和谷歌地图匹配
grid_wgs84 <- st_transform(grid_utm, crs = 4326)

4. 裁剪网格到原多边形范围

刚才生成的是整个边界框的网格,咱们需要把多边形外面的部分剪掉,只保留内部的方格:

# 保留和原多边形相交的网格
clipped_grid <- st_intersection(grid_wgs84, my_polygon)

# 可以查看裁剪后的网格数量
cat("裁剪后得到的1km方格数量:", nrow(clipped_grid), "\n")

5. 结合谷歌地图展示结果

最后一步就是把网格叠加到谷歌地图上。注意:现在ggmap需要谷歌地图API密钥,你得先去谷歌云平台申请一个,然后注册:

# 注册谷歌地图API密钥(替换成你的密钥)
register_google(key = "你的谷歌API密钥")

# 获取多边形所在区域的谷歌地图底图(调整zoom参数控制缩放级别)
map_base <- get_map(
  location = st_bbox(my_polygon),
  zoom = 12,
  maptype = "roadmap"
)

# 绘制底图+网格
ggmap(map_base) +
  geom_sf(
    data = clipped_grid,
    inherit.aes = FALSE,
    fill = "transparent",
    color = "red",
    linewidth = 0.5
  ) +
  labs(title = "原多边形内的1km×1km方格网格")

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

火山引擎 最新活动