Dựa trên câu trả lời của genorama ở trên, bạn cũng có thể chuyển đổi đầu ra của bkde2D thành raster chứ không phải đường viền, sử dụng các giá trị fhat làm giá trị ô raster
library("leaflet")
library("data.table")
library("sp")
library("rgdal")
# library("maptools")
library("KernSmooth")
library("raster")
inurl <- "https://data.cityofchicago.org/api/views/22s8-eq8h/rows.csv?accessType=DOWNLOAD"
infile <- "mvthefts.csv"
## LOAD DATA
## Also, clean up variable names, and convert dates
if(!file.exists(infile)){
download.file(url = inurl, destfile = infile)
}
dat <- data.table::fread(infile)
setnames(dat, tolower(colnames(dat)))
setnames(dat, gsub(" ", "_", colnames(dat)))
dat <- dat[!is.na(longitude)]
dat[ , date := as.IDate(date, "%m/%d/%Y")]
## Create kernel density output
kde <- bkde2D(dat[ , list(longitude, latitude)],
bandwidth=c(.0045, .0068), gridsize = c(100,100))
# Create Raster from Kernel Density output
KernelDensityRaster <- raster(list(x=kde$x1 ,y=kde$x2 ,z = kde$fhat))
#create pal function for coloring the raster
palRaster <- colorNumeric("Spectral", domain = KernelDensityRaster@data@values)
## Leaflet map with raster
leaflet() %>% addTiles() %>%
addRasterImage(KernelDensityRaster,
colors = palRaster,
opacity = .8) %>%
addLegend(pal = palRaster,
values = KernelDensityRaster@data@values,
title = "Kernel Density of Points")
Đây là đầu ra của bạn. Lưu ý rằng các giá trị mật độ thấp vẫn hiển thị như được tô màu trong raster.
Chúng ta có thể loại bỏ các ô mật độ thấp này bằng cách sau:
#set low density cells as NA so we can make them transparent with the colorNumeric function
KernelDensityRaster@data@values[which(KernelDensityRaster@data@values < 1)] <- NA
#create pal function for coloring the raster
palRaster <- colorNumeric("Spectral", domain = KernelDensityRaster@data@values, na.color = "transparent")
## Redraw the map
leaflet() %>% addTiles() %>%
addRasterImage(KernelDensityRaster,
colors = palRaster,
opacity = .8) %>%
addLegend(pal = palRaster,
values = KernelDensityRaster@data@values,
title = "Kernel Density of Points")
Bây giờ bất kỳ ô raster nào có giá trị nhỏ hơn 1 đều trong suốt.
Nếu bạn muốn một raster binned, hãy sử dụng hàm colorBin thay vì hàm colorNumeric:
palRaster <- colorBin("Spectral", bins = 7, domain = KernelDensityRaster@data@values, na.color = "transparent")
## Leaflet map with raster
leaflet() %>% addTiles() %>%
addRasterImage(KernelDensityRaster,
colors = palRaster,
opacity = .8) %>%
addLegend(pal = palRaster,
values = KernelDensityRaster@data@values,
title = "Kernel Density of Points")
Để làm cho nó mượt mà hơn, chỉ cần tăng lưới trong hàm bkde2D. Điều này làm tăng độ phân giải của raster được tạo. (Tôi đã đổi nó thành
gridsize = c(1000,1000)
Đầu ra: