使用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
相关产品推荐
相关产品推荐

