如何在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




