使用maps/ggplot2绘制埃及省份地图时坐标生成多边形异常问题
解决埃及省级地图绘制问题
坐标格式转换的必要性
是的,你需要将下载的坐标转换为R兼容的格式。R绘制地图默认使用**WGS84坐标系(EPSG:4326)**的十进制经纬度:东经为正、西经为负;北纬为正、南纬为负。
如果你的数据是度分秒(DMS)格式(例如29°30'N, 31°15'E),可以用这个函数转换为十进制:
dms_to_decimal <- function(dms_str) { parts <- stringr::str_match(dms_str, "([0-9]+)°([0-9]+)'([0-9.]+)\"([NSEW])") degrees <- as.numeric(parts[2]) minutes <- as.numeric(parts[3]) seconds <- as.numeric(parts[4]) direction <- parts[5] decimal <- degrees + minutes/60 + seconds/3600 if (direction %in% c("S", "W")) decimal <- -decimal return(decimal) }
如果数据是其他投影坐标系(比如埃及常用的UTM 36N),用sf包转换为WGS84:
library(sf) # 读取下载的Shapefile data_sf <- st_read("your_egypt_provinces.shp") # 转换为WGS84坐标系 data_wgs84 <- st_transform(data_sf, crs = 4326)
获取埃及省级边界数据的可行方法
方法1:用sf包直接获取GADM数据
GADM提供全球高精度行政区划边界,包含埃及所有省份:
library(sf) library(ggplot2) # 获取埃及一级行政区(省份)数据 egypt_provinces <- gadm_sf(country = "EGY", level = 1) # 绘制省级地图 ggplot() + geom_sf(data = egypt_provinces, fill = "#aed6f1", color = "#2c3e50") + labs(title = "埃及省级行政区划地图") + coord_sf()
方法2:用rnaturalearth包获取官方边界
rnaturalearth提供公开地理数据,可直接提取埃及省级边界:
library(rnaturalearth) library(rnaturalearthdata) library(ggplot2) # 获取埃及省级数据 egypt_provinces <- ne_states(country = "egypt", returnclass = "sf") # 绘制带填充的省份地图 ggplot() + geom_sf(data = egypt_provinces, aes(fill = name), color = "white") + scale_fill_viridis_d(option = "mako") + labs(title = "埃及省份地图", fill = "省份名称") + theme_minimal()
方法3:处理下载的Shapefile
如果已经从公开渠道下载了埃及省份Shapefile,按以下步骤处理:
- 用
sf::st_read()读取文件 - 用
st_crs(data_sf)检查当前坐标系 - 用
st_transform(data_sf, crs = 4326)转换为WGS84 - 用
geom_sf()绘制(自动处理坐标分组,避免geom_polygon的错乱问题)
修复现有代码的关键
你之前用geom_polygon绘制全国地图成功,但省级数据错乱,核心原因是坐标格式/坐标系不匹配,或者数据分组错误。改用sf包的geom_sf可以避免手动分组的麻烦,同时确保坐标系统一。
内容的提问来源于stack exchange,提问作者Mohamed Samir
相关产品推荐
相关产品推荐

