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

时间:2019-07-05 12:36:54

标签: r tmap

我想知道,当将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)

使用此代码,我可以在Plot中查看底图,因为我只是想可视化新西兰而不是周围的海洋。

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

3 个答案:

答案 0 :(得分:3)

陶瓷 package为此提供了一个很好的解决方案。您可以通过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 package(v0.3.0)于2020-05-04创建

答案 1 :(得分:1)

至少有两种方法:

使用type OutputType = Store<typeof options>; /* type OutputType = { state: {}; buildings: { state: {}; school: { state: {}; }; cafe: { state: {}; }; }; } */

通过tmaptools中的read_osm函数,该函数使用tmaptools包来获取图块。此处的示例直接来自文档:

OpenStreetMap

map image

请注意,如果要制作交互式Web浏览器地图,请删除该rgb层并添加一个标准底图图层,从而修改映射链。

或者:

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

调用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 还是行不通的,因为某些图层的最小-最大值在0-255之外。我认为这是因为内部使用的投影函数正在执行在某些位置进行推断的插值。大致修复:

tm_rgb()

那么你可以

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

请注意,投影会导致非正方形栅格,因此周围会有NA值。

enter image description here

答案 2 :(得分:0)

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

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

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