如何在R中的tmap图中添加底图?

11

我想知道在tmap模式设置为绘图而不是交互模式时,是否可以向在tmap中制作的地图添加底图。

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

library(sf)

library(spData)

library(tmap)

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

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

这是我的代码生成的地图enter image description here

3个回答

15

至少有两种方法:

使用tmaptools:

通过tmaptools中的read_osm函数,该函数使用OpenStreetMap包来获取瓦片。以下示例直接从文档中提取:

> 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()
> 

地图图像

请注意,如果您想创建交互式的Web浏览器地图,请通过删除此RGB图层并添加标准底图图层来修改映射链。

或者:

使用rosm

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

> 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。我想这是因为内部使用的投影函数在某些地方进行了外推插值。解决方法如下:

> bg[bg[]>255]=255
> bg[bg[]<0]=0

那么你可以

> tm_shape(bg) + tm_rgb() + tm_shape(NLD_muni) + tm_borders()

请注意,投影结果会产生非方形的光栅化图像,因此周围会有NA值。

在此输入图片描述


6

ceramic 提供了一个很好的解决方案。您可以通过Mapbox生成底图,但需要注册,但他们提供慷慨的免费层,因此您不需要支付任何费用。


library(sf)
library(spData)
library(tmap)
library(ceramic)

basemap <- cc_location(loc=nz, max_tiles = 4,
                       base_url = "https://api.mapbox.com/styles/v1/mdsumner/cjs6yn9hu0coo1fqhdqgw3o18/tiles/512/{zoom}/{x}/{y}")


tm_shape(basemap) +
  tm_rgb() +
  tm_shape(nz) +
  tm_polygons(
    "Median_income",
    palette = "Blues",
    n = 10,
    alpha = 0.3
  ) 

该示例由 reprex软件包 (v0.3.0) 于2020年5月4日创建


3
根据{tmap}文档,底图功能仅在查看模式下可用https://www.rdocumentation.org/packages/tmap/versions/2.2/topics/tm_basemap
这似乎是合理的,因为底图不是直接来自{tmap},而是来自leaflet js包。
如果您绝对需要静态r绘图的底图,则应通过{ggplot}/{ggmap}工作流获得一个(例如ggmap::get_stamenmap()+常规ggplot技术)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接