在R语言中实现谷歌地图上德黑兰多色行政区多边形绘制
嘿,我来帮你搞定这个问题!在R里绘制德黑兰那些带明确边界的行政区多边形,其实用几个常用的空间分析包就能轻松实现。我给你一步步拆解整个流程:
第一步:准备你的行政区坐标数据
首先,你从谷歌地图获取的经纬度列表,最好整理成空间数据格式——比如GeoJSON(谷歌地图可以导出这类格式),或者CSV(每一行是一个坐标点,附带对应的行政区名称)。关键是要让每个行政区对应一个完整的多边形边界。
第二步:加载需要的R包
我们会用到几个核心包:
sf:专门处理空间数据的神器,能轻松读取、转换空间格式ggplot2:用来绘制美观的地图dplyr:辅助处理数据分组(如果你的数据是CSV格式的话)ggspatial(可选):用来叠加谷歌/OpenStreetMap底图
先安装并加载它们:
# 安装包(首次使用时运行) install.packages(c("sf", "ggplot2", "dplyr", "ggspatial")) # 加载包 library(sf) library(ggplot2) library(dplyr) library(ggspatial)
第三步:导入并处理空间数据
分两种情况处理你的数据:
情况1:数据是GeoJSON格式(推荐)
谷歌地图导出的GeoJSON直接就能用st_read()读取,它会自动识别多边形和行政区名称:
# 读取GeoJSON文件 tehran_districts <- st_read("你的行政区文件.geojson") # 确保坐标系是WGS84(谷歌地图用的就是这个,EPSG代码4326) tehran_districts <- st_transform(tehran_districts, crs = 4326)
情况2:数据是CSV格式
如果你的数据是每行一个经纬度点,带行政区名称,需要先分组把每个行政区的点转换成多边形:
# 读取CSV(假设列名是longitude, latitude, district_name) district_points <- read.csv("你的行政区坐标.csv") # 分组转换为多边形,转成sf空间对象 tehran_districts <- district_points %>% group_by(district_name) %>% # 把每个行政区的坐标点组合成多边形 summarize(geometry = st_sfc(st_polygon(list(matrix(c(longitude, latitude), ncol = 2))))) %>% st_sf() %>% # 转换到WGS84坐标系 st_transform(crs = 4326)
第四步:绘制带颜色的行政区地图
现在用ggplot2绘制,每个行政区用不同颜色区分,还能叠加底图让效果更直观:
基础版:只画行政区边界
ggplot() + # 绘制多边形,按行政区名称分配颜色,白色边框区分 geom_sf(data = tehran_districts, aes(fill = district_name), color = "white", size = 0.5) + # 选一个好看的颜色方案(viridis系列对色盲友好) scale_fill_viridis_d(option = "plasma", name = "德黑兰行政区") + # 调整主题,去掉冗余的坐标轴和网格 theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), plot.title = element_text(hjust = 0.5, size = 16, face = "bold") ) + labs(title = "德黑兰特定行政区边界地图")
进阶版:叠加谷歌风格底图
如果想让地图更贴近谷歌地图的样子,用ggspatial的annotation_map_tile()叠加底图:
ggplot() + # 叠加OpenStreetMap底图(和谷歌地图风格类似,zoom参数控制缩放级别) annotation_map_tile(type = "osm", zoom = 12) + # 绘制行政区多边形,设置透明度避免遮挡底图 geom_sf(data = tehran_districts, aes(fill = district_name), alpha = 0.7, color = "white", size = 0.5) + scale_fill_viridis_d(option = "plasma", name = "德黑兰行政区") + theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), plot.title = element_text(hjust = 0.5, size = 16, face = "bold") ) + labs(title = "德黑兰行政区叠加底图")
小提示
- 如果你拿到的坐标不是WGS84,一定要用
st_transform()转换,不然地图会错位 - 颜色方案可以自己换,比如
scale_fill_brewer(palette = "Set3")也是不错的选择 - 如果某个行政区的多边形绘制有问题,检查一下坐标点的顺序是不是闭合的(第一个点和最后一个点要一致)
内容的提问来源于stack exchange,提问作者mjoudy
相关产品推荐
相关产品推荐

