首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中将底图添加到tmap图中?

如何在R中将底图添加到tmap图中?
EN

Stack Overflow用户
提问于 2019-07-05 20:36:54
回答 2查看 5.2K关注 0票数 7

我想知道,当tmap模式设置为plot而不是交互模式时,是否可以将底图添加到在tmap中创建的地图。

这是我用来生成地图的代码

代码语言:javascript
运行
复制
library(sf)

library(spData)

library(tmap)

tm_shape(nz) +
  tm_polygons(
    "Median_income",
    palette = "Blues",
    n = 10,
  ) +
  tm_layout(basemaps = leaflet::providers$OpenStreetMap)

有了这段代码,我可以查看底图,而它是在绘图,因为我只想可视化新西兰,而不是周围的海洋。

这是我的代码生成的地图

EN

回答 2

Stack Overflow用户

发布于 2019-07-10 21:58:54

至少有两种方法:

使用tmaptools

通过tmaptools中的read_osm函数,该函数使用OpenStreetMap包来获取磁贴。下面是直接从文档中摘录的示例:

代码语言:javascript
运行
复制
> library(tmaptools)
> library(tmap)
Warning message:
replacing previous import ‘gdalUtils::gdal_rasterize’ by ‘sf::gdal_rasterize’ when loading ‘mapview’ 
> data(NLD_muni)
> osm_NLD <- read_osm(NLD_muni, ext=1.1)
> tm_shape(osm_NLD) + tm_rgb()
> 

注意:如果您想要通过删除此rgb层并添加标准底图层来制作交互式web浏览器地图,则应修改您的映射链。

或者:

使用rosm

调用osm.raster以获取给定空间对象的光栅图像。将光栅重新投影到源坐标系。

代码语言:javascript
运行
复制
> bg = osm.raster(NLD_muni)
Zoom: 8
> bg
class      : RasterBrick 
dimensions : 1046, 1074, 1123404, 3  (nrow, ncol, ncell, nlayers)
resolution : 373, 372  (x, y)
extent     : -28610.91, 371991.1, 303384.1, 692496.1  (xmin, xmax, ymin, ymax)
crs        : +init=epsg:28992 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs 
source     : memory
names      :   layer.1,   layer.2,   layer.3 
min values : -6.848990, 41.156879,  1.062173 
max values :  266.3927,  290.5641,  263.3747 

这还不能用于tm_rgb(),因为对于某些层,最小-最大值在0-255之外。我认为这是因为内部使用的投影函数正在进行插值,在某些地方进行外推。粗略地修复:

代码语言:javascript
运行
复制
> bg[bg[]>255]=255
> bg[bg[]<0]=0

然后你就可以

代码语言:javascript
运行
复制
> tm_shape(bg) + tm_rgb() + tm_shape(NLD_muni) + tm_borders()

请注意,投影的结果是一个非正方形的栅格,因此它周围有NA值。

票数 11
EN

Stack Overflow用户

发布于 2019-07-06 19:04:24

根据{tmap}文档,底图功能仅在视图模式https://www.rdocumentation.org/packages/tmap/versions/2.2/topics/tm_basemap中可用

这似乎是合乎逻辑的,因为底图不是直接来自tmap,而是来自leaflet js包。

如果您绝对需要静态r图的底图,您应该能够通过{ggplot} / {ggmap}工作流程获得一个底图(例如:ggmap::get_stamenmap() +常规的ggplot技术)。

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

https://stackoverflow.com/questions/56903210

复制
相关文章

相似问题

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