至少有两种方法:
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值。
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日创建
ggmap::get_stamenmap()
+常规ggplot技术)。