lok*_*oki 9 plot r geospatial ggplot2 ggmap
我想在ggplot2中使用覆盖GoogleMaps基本地图的栅格绘制地图.因此,我用get_map()和insert_raster()这样的:
library(ggplot2)
library(ggmap)
bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid"))
bm + inset_raster(as.raster(r), xmin = r@extent[1], xmax = r@extent[2],
ymin = r@extent[3], ymax = r@extent[4])
Run Code Online (Sandbox Code Playgroud)
是否有可能设置alpha和更改fill颜色?
lok*_*oki 10
fortify:阅读下面的原始帖子以获取更多信息
从这篇博文中我发现我们可以直接使用空间多边形ggplot::geom_polygon()
r <- raster(system.file("external/test.grd", package="raster"))
# just to make it reproducible with ggmap we have to transform to wgs84
r <- projectRaster(r, crs = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
rtp <- rasterToPolygons(r)
bm <- ggmap(get_map(location = bbox(rtp), maptype = "hybrid", zoom = 13))
bm +
geom_polygon(data = rtp,
aes(x = long, y = lat, group = group,
fill = rep(rtp$test, each = 5)),
size = 0,
alpha = 0.5) +
scale_fill_gradientn("RasterValues", colors = topo.colors(255))
Run Code Online (Sandbox Code Playgroud)
如下所述,对于大量像素,这种绘图可能变得非常慢.因此,在将其转换为多边形之前,您可以考虑减少像素数(在大多数情况下,这不会真正减少地图中的信息量).因此,raster::aggregate可以用来将像素数减少到合理的数量.
该示例示出了像素数量如何减少4的量级(即2*2,水平*垂直).欲了解更多信息,请参阅?raster::aggregate.
r <- aggregate(r, fact = 2)
# afterwards continue with rasterToPolygons(r)...
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我找到了解决这个问题的方法.将栅格转换为多边形!这个想法基本上是在Marc Needham的博客文章之后实现的.
然而,有一个缺点:ggplot因大量多边形而变得非常慢,你将不可避免地面对这些多边形.但是,您可以通过绘制到png()(或其他)设备来加快速度.
这是一个代码示例:
library(raster)
library(ggplot2)
library(ggmap)
r <- raster(....) # any raster you want to plot
rtp <- rasterToPolygons(r)
rtp@data$id <- 1:nrow(rtp@data) # add id column for join
rtpFort <- fortify(rtp, data = rtp@data)
rtpFortMer <- merge(rtpFort, rtp@data, by.x = 'id', by.y = 'id') # join data
bm <- ggmap(get_map(location = "Shanghai", maptype = "hybrid", zoom = 10))
bm + geom_polygon(data = rtpFortMer,
aes(x = long, y = lat, group = group, fill = layer),
alpha = 0.5,
size = 0) + ## size = 0 to remove the polygon outlines
scale_fill_gradientn(colours = topo.colors(255))
Run Code Online (Sandbox Code Playgroud)
这导致如下所示: