Как добавить растр на карту листовки в r, которая красиво покрывает землю и не имеет пробелов? - PullRequest
1 голос
/ 08 апреля 2020

У меня есть набор данных из нескольких тысяч географических точек, каждому из которых назначен кластер (в моем воспроизводимом примере ниже я упрощаю это до 8 точек). Я хочу раскрасить всю глобальную карту (только суши), используя k ближайших соседей к этим точкам. Я хочу визуализировать карту, используя буклет в r (в конечном итоге для блестящего приложения). Я могу построить результаты хорошо, используя ggplot, но столкнуться с некоторыми проблемами при использовании листовки. Проблемы:

  1. Растр не покрывает все antarcti c на листовой карте (я предполагаю, что мне нужно использовать набор данных, отличный от wrld_smpl, чтобы замаскировать растр, но не удалось при этом).
  2. Где бы ни встречались два разных кластера, в растровом покрытии есть пробел
  3. Береговые линии сильно пикселированы.

Я очень ценю любые руководство по решению этой проблемы!

Воспроизводимый пример:

# ggplot2 approach ###################################################################################

# Randomly generate 8 points with 8 clusterlabels
train = data.frame(lon=runif(8, -180, 180),lat=runif(8,-90,90), clustername=1:8)
train

library(ggplot2)
library(raster)
library(class)
library(maptools) # for wrld_smpl data

# Get data for land borders
data(wrld_simpl)

# Make grid of lat/lon points covering whole world
dfgrid = expand.grid(lon=seq(-180,180,by=.1), lat =seq(-90,90, by=.1))

# Convert to spatial points, specify correct coordinate reference system (CRS), same as wrld_smpl
pts <- SpatialPoints(dfgrid, proj4string=CRS(proj4string(wrld_simpl)))

# Only keep points over land
dfgrid = dfgrid[!is.na(over(pts, wrld_simpl)$FIPS),]

#dfgrid$clusterlabels = 1
# Asign cluster labels using knn
dfgrid$clusterlabels = knn(train=train[,c("lon","lat")],
                        test=dfgrid[,c("lon", "lat")],
                        cl=train$clustername,
                        k=1)

r = rasterFromXYZ(dfgrid, crs =  "+proj=longlat")
r

#plotting
var_df <- as.data.frame(rasterToPoints(r))
p <- ggplot() +
  geom_polygon(data = wrld_simpl[wrld_simpl@data$UN!="10",], 
               aes(x = long, y = lat, group = group),
               colour = "black", fill = "grey") # does the fortification automatically
p <- p + geom_tile(data = var_df, aes(x = x, y = y, fill = as.factor(clusterlabels)))+
  theme(legend.title = element_blank())
p = p + scale_fill_brewer(palette = "Paired")
p


# leaflet approach #############################################################################################

library(leaflet)

pal <- colorFactor("Paired", values(r),na.color = "transparent")

leaflet() %>% addTiles()

leaflet() %>% addTiles() %>%
  addRasterImage(r, colors = pal, opacity = 0.8) %>%
  addLegend(pal = pal, values = values(r),
            title = "Cluster label")

ggplot results

leaflet resutls showing raster gap in antarctica

zoomed in leaflet results showing pixelated coastline and gap between clusters

...