如何将经纬度转换为Multipolygon对象以适配tmap绘图?
解决经纬度转Multipolygon并使用tmap绘图的问题
你的数据集是城市级别的点数据,直接用st_as_sf转成Multipolygon是行不通的——单个点只能生成Point类型的几何对象。要得到Multipolygon,要么把点组合成有意义的多边形,要么获取对应区域(比如国家)的多边形边界数据,再和你的数据关联起来绘图。下面分步骤解决:
第一步:先把点数据转成正确的sf对象
你之前用st_as_sf无效,大概率是没指定坐标列和坐标系。试试这个标准用法:
library(sf) library(tmap) # 转换为带Point几何的sf对象 coor_sf <- st_as_sf(coor, coords = c("lng", "lat"), # 注意先经度后纬度 crs = 4326) # WGS84是GPS经纬度的通用坐标系
如果只是想在地图上标记这些城市点,直接用tmap绘制即可:
# 绘制点地图 tm_shape(coor_sf) + tm_dots(col = "Type", size = 0.5, legend.show = TRUE) + tm_basemap(server = "OpenStreetMap")
第二步:生成Multipolygon并绘图(按国家聚合场景)
要是你需要画国家级别的多边形(比如展示每个国家的机构数量),需要先获取国家边界的sf数据,再和你的数据关联:
# 安装并加载rnaturalearth包获取边界数据 install.packages("rnaturalearth") library(rnaturalearth) # 获取世界国家边界的sf数据 world_borders <- ne_countries(returnclass = "sf", scale = "medium") # 按ISO代码聚合你的数据,统计每个国家的机构数量 coor_agg <- aggregate(coor_sf["Type"], by = list(coor_sf$`3ISO code`), FUN = length) names(coor_agg)[1] <- "iso_a3" # 和边界数据的ISO列名对齐 # 合并边界数据与统计数据 world_with_data <- merge(world_borders, coor_agg, by = "iso_a3", all.x = FALSE)
现在world_with_data就是带Multipolygon几何的sf对象了,可以用tmap绘制填充地图:
# 绘制多边形填充地图 tm_shape(world_with_data) + tm_fill(col = "Type", palette = "Blues", title = "机构数量") + tm_borders() + tm_text("name", size = 0.8) + tm_layout(legend.position = c("right", "top"))
补充:把多个点转成自定义多边形
如果需要把同区域的点连成一个多边形(比如美国城市的凸包范围),可以用以下方法:
# 筛选美国的城市点 usa_points <- coor_sf[coor_sf$`3ISO code` == "USA", ] # 生成凸包多边形 usa_polygon <- st_convex_hull(st_combine(usa_points)) # 转成sf对象 usa_polygon_sf <- st_sf(data.frame(country = "USA"), geometry = usa_polygon, crs = 4326) # 绘制多边形+点的组合图 tm_shape(usa_polygon_sf) + tm_fill(col = "lightblue") + tm_shape(usa_points) + tm_dots(col = "red") + tm_basemap(server = "OpenStreetMap")
内容的提问来源于stack exchange,提问作者Mahir Bhatt
相关产品推荐
相关产品推荐

