如何用R中Leaflet与SF创建颜色编码空间网格?附报错解决
问题解决:网格多边形转点导致的leaflet报错
错误原因
报错核心是leaflet的addPolygons接收到了点类型的空间对象,而非预期的多边形网格。问题出在网格创建与聚合的衔接环节:
st_make_grid生成的是多边形网格,但直接给grid$L1赋值聚合结果时,可能因聚合对象结构问题,导致网格几何类型被意外改变;- 未过滤州边界外的无效网格,部分异常网格触发类型识别错误。
修正后的代码
# 1. 将原始数据转换为sf点对象 points <- st_as_sf(data, coords = c("Long", "Lat"), crs = 4326) # 2. 创建覆盖点范围的方形网格(明确几何列命名) bb <- st_bbox(points) grid_polygons <- st_make_grid(st_as_sfc(bb), cellsize = 0.1) # 给多边形列命名为geometry,避免sf对象结构歧义 grid <- st_sf(geometry = grid_polygons, crs = st_crs(points)) # 3. 过滤出州边界内的有效网格(确保几何类型为多边形) # 先统一CRS,避免空间操作报错 us_map <- st_transform(us_map, crs = st_crs(grid)) grid <- st_intersection(grid, us_map) # 4. 聚合计算每个网格的L1平均值(直接使用聚合后的完整sf对象) grid_with_L1 <- aggregate(points["L1"], by = grid, FUN = function(x) mean(as.numeric(x), na.rm = TRUE)) # 5. 创建颜色映射函数 pal <- colorNumeric(palette = "viridis", domain = grid_with_L1$L1) # 6. 绘制leaflet地图 m <- leaflet() %>% addTiles() %>% addPolygons(data = us_map, weight = 1, color = "#444444", fill = NA) %>% # 使用聚合后的有效网格对象,确保是多边形类型 addPolygons(data = grid_with_L1, fillColor = ~pal(L1), fillOpacity = 0.8, color = "#BDBDC3", weight = 1) %>% addLegend(pal = pal, values = ~L1, opacity = 0.8, title = "Average L1") # 输出地图 m
关键修正点
- 给网格的几何列明确命名为
geometry,消除sf对象的结构歧义; - 添加
st_intersection过滤州外网格,确保所有网格都是州内有效的多边形; - 直接使用
aggregate返回的完整sf对象,避免手动赋值导致的几何类型篡改; - 统一
us_map与网格的CRS,避免空间操作时的坐标不匹配问题。
内容的提问来源于stack exchange,提问作者ben37
相关产品推荐
相关产品推荐

