Aufbauend auf der obigen Antwort von genorama können Sie auch die Ausgabe von bkde2D in ein Raster anstatt in Konturlinien konvertieren, wobei Sie die fhat-Werte als Rasterzellenwerte verwenden
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")
Dies ist Ihre Ausgabe. Beachten Sie, dass die Werte mit niedriger Dichte im Raster immer noch farbig angezeigt werden.
Wir können diese Zellen mit niedriger Dichte folgendermaßen entfernen:
#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")
Jetzt ist jede Rasterzelle mit einem Wert von weniger als 1 transparent.
Wenn Sie ein gruppiertes Raster möchten, verwenden Sie die Funktion colorBin anstelle der Funktion 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")
Um es glatter zu machen, erhöhen Sie einfach die Rastergröße in der bkde2D-Funktion. Dies erhöht die Auflösung des generierten Rasters. (Ich habe es geändert in
gridsize = c(1000,1000)
Ausgabe: