【问题标题】:How to add a basemap to a tmap plot in R?如何将底图添加到 R 中的 tmap 图?
【发布时间】:2019-11-16 02:19:39
【问题描述】:

我想知道当 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 中查看底图,因为我只想可视化新西兰而不是周围的海洋。

这是我的代码生成的地图

【问题讨论】:

    标签: r tmap


    【解决方案1】:

    至少有两种方式:

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

    请注意,如果您想通过删除此 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 值。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案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 创建

        【讨论】:

          猜你喜欢
          • 2018-06-21
          • 1970-01-01
          • 2019-11-08
          • 1970-01-01
          • 1970-01-01
          • 2020-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多