Вы можете сделать что-то вроде этого:
Создание данных:
library(leaflet)
library(sp)
library(sf)
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
SpF <- st_as_sf(SpP)
SpF$category <- c("Commercial", "Residential", "Residential")
Примечание: я переключаю SpatialPolygonsDataFrame на SimpleFeature из пакета sf
, который легче и быстрее обрабатывать / манипулировать.
Итак, вы определяете соответствующий data.frame с цветами для каждой категории.Затем вы используете функцию merge
и определяете, какие столбцы объединить.В этом примере полигон SpF
имеет столбец category
, а соответствующий кадр данных имеет столбец cat
.При слиянии новый шейп-файл NewSp
также будет иметь столбец col
, в котором содержатся цвета.И вы просто передаете эти цвета в листовку.
matching = data.frame(
cat = c("Commercial", "Residential"),
col = c("#FF4C4C", "#E9E946")
)
NewSp <- base::merge(SpF, matching, by.x ="category", by.y="cat")
leaflet() %>%
addTiles() %>%
addPolygons(data=NewSp, color=NewSp$col, opacity = 1, fillOpacity = 0.6)