You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用leaflet与sf绘制Voronoi图时,多边形颜色匹配异常如何解决?

解决Voronoi多边形与点颜色匹配错误的问题

问题根源是生成Voronoi多边形后,多边形的顺序和原始点的顺序不再对应,且st_intersection会进一步打乱顺序,直接用颜色向量赋值会导致匹配错误。正确的做法是将原始点的属性(如颜色、名称)绑定到对应的Voronoi多边形上,通过属性映射来填充颜色,而非依赖顺序。

修改后的完整代码

library(leaflet)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)

long   <- c(4.35556 ,  5.83745,  4.63683 ,  6.06389,  6.41111,  5.639722)
lat    <- c(52.00667, 53.09456, 52.38084 , 52.475  , 52.15917, 53.440278)
labs   <- c("Delft" , "Grouw" , "Haarlem", "Hattem", "Lochem", "Hollum" )
colors <- c("red"   , "orange", "yellow" , "green" , "blue"  , "purple" )

# 1. 创建带属性的sf点对象(保留原始ID和颜色)
df <- data.frame(ID = labs, X = long, Y = lat, color = colors)
points_sf <- st_as_sf(df, coords = c("X", "Y"), crs = 4326)

# 2. 获取荷兰边界
NL <- ne_countries(country = 'netherlands', scale = 'medium', returnclass = 'sf')

# 3. 生成Voronoi多边形并绑定原始属性
# 用st_combine保留单个点的几何集合,生成Voronoi后转为多边形sf对象
voronoi <- st_voronoi(st_combine(points_sf)) %>% 
  st_cast("POLYGON") %>% 
  st_sf()

# 匹配每个Voronoi多边形对应的原始点,绑定ID和颜色属性
point_to_voronoi <- st_within(points_sf, voronoi) %>% unlist()
voronoi$ID <- points_sf$ID[point_to_voronoi]
voronoi$color <- points_sf$color[point_to_voronoi]

# 4. 裁剪到荷兰边界
polys <- st_intersection(voronoi, NL)

# 5. 绘图:通过属性映射填充颜色,不再依赖顺序
leaflet() %>%
  addProviderTiles(providers$OpenStreetMap.Mapnik) %>%
  addPolygons(data        = polys,
              fillColor   = ~color,  # 用多边形的color属性映射
              fillOpacity = 1,
              weight      = 0.5, 
              color       = "black") %>%
  addCircleMarkers(data      = points_sf,
                   label     = ~ID, 
                   color     = "black",
                   radius    = 5,
                   weight    = 1,
                   fill      = TRUE,
                   fillColor = ~color,
                   fillOpacity = 1)

关键修改说明

  • 保留点的属性信息:创建points_sf时直接保留ID和color字段,不单独提取几何对象或合并点。
  • 绑定多边形与点的属性:通过st_within找到每个原始点所在的Voronoi多边形,将点的属性赋值给对应的多边形,确保属性和几何一一对应。
  • 属性映射填充颜色:绘图时用~color引用多边形的color属性,而非直接传入颜色向量,彻底避免顺序不匹配的问题。

内容的提问来源于stack exchange,提问作者WJH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:40:32