如何在R中转换多边形几何坐标并保留关联属性列?
解决方法:转换坐标同时保留属性列并绘制带着色的Leaflet地图
核心问题分析
你之前的两个操作都没抓住sf对象的本质:
- 单独转换
df$geometry只会得到无属性的空间几何对象,自然没法关联ID/Value做着色; - 用
extract正则提取完全错误,sf的geometry是专门的空间数据类型,不是字符串,正则匹配不到有效坐标。
正确步骤
先确认原始数据的坐标参考系(CRS)
先搞清楚你的shapefile用的是什么投影(比如UTM、高斯-克吕格等),执行以下命令查看:st_crs(df)输出会显示原始CRS的代码(比如EPSG:32650),这一步确保后续转换方向正确。
转换整个sf对象的CRS(保留所有属性列)
直接用st_transform作用于整个sf数据框,而不是单独的geometry列,这样ID、Value等属性会完整保留:# 转换为WGS84经纬度坐标系(EPSG:4326,Leaflet默认支持) df_wgs84 <- st_transform(df, 4326)现在
df_wgs84是包含所有原始属性、且geometry为经纬度的sf对象。用Leaflet绘制带着色的 choropleth 地图
基于转换后的对象,结合颜色比例尺函数(比如colorNumeric),根据Value列设置填充色,同时可以添加弹窗显示属性:library(leaflet) library(sf) # 创建颜色比例尺 pal <- colorNumeric(palette = "YlOrRd", domain = df_wgs84$Value) # 绘制地图 inter_map2 <- leaflet(df_wgs84) %>% addProviderTiles(providers$CartoDB.Positron) %>% addPolygons( stroke = TRUE, weight = 0.5, opacity = 1, fillOpacity = 0.7, fillColor = ~pal(Value), # 关联Value列着色 popup = ~paste0("ID: ", ID, "<br>Value: ", Value), # 弹窗显示属性 highlightOptions = highlightOptions(color = "red", weight = 2, bringToFront = TRUE) ) %>% addLegend(pal = pal, values = ~Value, title = "Value") # 添加图例 # 显示地图 inter_map2
为什么之前的方法不行?
- 单独传递
st_transform(df$geometry, 4326)给addPolygons的data参数,相当于只给了几何图形,没有绑定任何属性数据,Leaflet找不到Value来做着色逻辑; extract函数是用来处理字符串列的,而sf的geometry是存储空间坐标的特殊类型,不是文本字符串,所以正则表达式匹配不到任何内容,返回全NA。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

