首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌地图从dismo::gmap()和ggplot2

谷歌地图从dismo::gmap()和ggplot2
EN

Stack Overflow用户
提问于 2016-09-23 09:35:36
回答 2查看 1.1K关注 0票数 8

我获得了一个带有dismo::gmap()函数的映射,并希望用ggplot2绘制它,因为我想使用geom_point和其他ggplot函数添加不同的功能。我更喜欢使用dismo::gmap而不是ggmap::get_map()下载谷歌地图层。这是因为dismo::gmap()ggmap::get_map()不同,它从包光栅返回光栅层,包括完整的CRS信息,因此应该可以修改该层的投影。

代码语言:javascript
复制
> head(data_info$latitude, 20)
#[1] 49.11306 49.39333 48.78083 51.85000 53.57361 50.67806 52.69083 52.21389 53.46361 50.99917 53.99750 53.54528 53.61417 48.00556 48.01306 53.45000
#[17] 51.93667 54.53083 51.95500 54.29639
> head(data_info$longitude, 20)
#[1] 13.134722 12.323056 13.803889 12.177778 14.143611 13.175833 12.649444 13.454167 11.629722 10.906111 11.415556  8.426944  7.160000 11.123889 10.786111
#[16] 12.766667 11.987222 13.091389 10.967500 13.684167


   e = extent(-14 , 58 , 28 , 64)
mapImageData2 <- gmap(e, type = c("terrain"), lonlat = TRUE, 
                      path = "&style=feature:all|element:labels|visibility:off&style=feature:administrative.country|element:geometry.stroke|visibility:off")

mapImageData2_proj <- projectExtent(mapImageData2, crs = "+proj=utm +zone=31 +datum=WGS84")

# plot the points on the map 
ggplot(mapImageData2_proj, extent = "device") + 
  geom_point(inherit.aes = FALSE, aes(x = data_info$longitude, y = data_info$latitude),
             data = gps, colour = "red", size = 1, pch = 20)

尝试此操作后,将得到以下错误:

错误: ggplot2不知道如何处理RasterLayer类的数据

如果我试试这个

代码语言:javascript
复制
plot(mapImageData2_proj)

.plotraster2中的错误(x,col = col,max像素=max像素,add = add,:没有与此RasterLayer关联的值)

EN

回答 2

Stack Overflow用户

发布于 2017-03-31 01:53:23

这个问题有两个问题。一个是如何让ggplot2绘制一个Raster*对象。另一个是如何在保留光栅价值的同时重新投影光栅。

OP包含以下代码

代码语言:javascript
复制
library(dismo)
e = extent(-14 , 58 , 28 , 64)
mapImageData2 <- gmap(e, type = c("terrain"), lonlat = TRUE, 
                      path = "&style=feature:all|element:labels|visibility:off&style=feature:administrative.country|element:geometry.stroke|visibility:off")

如果我们运行这个,然后执行plot(mapImageData2),我们就得到了一个很好的情节。操作然后运行。

代码语言:javascript
复制
mapImageData2_proj <- projectExtent(mapImageData2, crs = "+proj=utm +zone=31 +datum=WGS84")

现在,如果我们运行plot(mapImageData2_proj),就会得到一个错误!这是因为projectExtent返回没有值的RasterLayer。我们需要使用projectRaster()代替。详情请参见?projectExtent。所以我们跑:

代码语言:javascript
复制
mapImageData2_proj <- projectRaster(mapImageData2, crs = "+proj=utm +zone=31 +datum=WGS84")
plot(mapImageData2_proj)

现在我们看到了重新投影的地图。进步!但是我们仍然不能用mapImageData2_proj绘制ggplot2,因为ggplot2不知道如何处理Raster*对象。我们得把我们的光栅转换成数据格式。有几种方法可以做到这一点,但没有加载任何额外的包,一个很好的选择是raster::rasterToPoints()。例如:

代码语言:javascript
复制
myPoints <- raster::rasterToPoints(myRaster)
myDataFrame <- data.frame(myPoints)
colnames(myDataFrame) <- c("Longitude", "Latitude", "Values")

ggplot(data=myDataFrame, aes_string(y = "Latitude", x = "Longitude")) + 
   geom_raster(aes(fill = Values))

因此,在OP的示例中将所有这些都放在一起:

代码语言:javascript
复制
library(dismo)
e = extent(-14 , 58 , 28 , 64)
mapImageData2 <- gmap(e, type = c("terrain"), lonlat = TRUE, 
                      path = "&style=feature:all|element:labels|visibility:off&style=feature:administrative.country|element:geometry.stroke|visibility:off")

plot(mapImageData2)

mapImageData2_proj <- projectRaster(mapImageData2, crs = "+proj=utm +zone=31 +datum=WGS84")

plot(mapImageData2_proj)

myRaster <- mapImageData2_proj
myPoints <- raster::rasterToPoints(myRaster)
myDataFrame <- data.frame(myPoints)
colnames(myDataFrame) <- c("X", "Y", "Values")

ggplot(data=myDataFrame, aes_string(y = "Y", x = "X")) + 
  geom_raster(aes(fill = Values))
票数 7
EN

Stack Overflow用户

发布于 2017-03-31 12:17:18

要在ggplot中直接绘制Raster*对象,可以使用库RasterVis,如下所示:

代码语言:javascript
复制
r <- raster(system.file("external/test.grd", package="raster"))
s <- stack(r, r*2)
names(s) <- c('meuse', 'meuse x 2')

library(ggplot2)

theme_set(theme_bw())
gplot(s) + geom_tile(aes(fill = value)) +
          facet_wrap(~ variable) +
          scale_fill_gradient(low = 'white', high = 'blue') +
          coord_equal()

正如您所看到的,我们使用的是gplot而不是ggplot。此函数用于Raster*对象,因为它只允许在RAM中加载Raster*对象的一部分。您甚至可以使用gplot(s, maxpixels=50000)选择要在地图上加载的最大像素数。

事实上,我建议不要把你的栅格转换成点,因为如果你的光栅很大,你就不能把它加载到内存中.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39657443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档