Learn R Programming

osmplotr (version 0.2.0)

add_osm_surface: add_osm_suface

Description

Adds a colour-coded surface of spatial objects (polygons, lines, or points generated by extract_osm_objects ()) to a graphics object initialised with plot_osm_basemap(). The surface is spatially interpolated between the values given in 'dat', which has to be a matrix or data.frame of 3 colums (x, y, z), where (x,y) are (longitude, latitude), and z are the values to be interpolated. Interpolation uses spatstat::Smoothing.ppp, which applies a Gaussian kernel smoother optimised to the given data, and is effectively non-parametric.

Usage

add_osm_surface(map, obj, dat, method = "idw", grid_size = 100,
  cols = heat.colors(30), bg, size, shape)

Arguments

map
A ggplot2 object to which the surface are to be added
obj
an sp SPDF or SLDF (list of polygons, lines, or points) returned by extract_osm_objects ()
dat
A matrix or data frame of 3 columns (x, y, z), where (x, y) are (longitude, latitude), and z are the values to be interpolated
method
Either 'idw' (Inverse Distance Weighting as spatstat::idw; default), otherwise uses 'Gaussian' for kernel smoothing (as spatstat::Smooth.ppp)
grid_size
size of interpolation grid
cols
Vector of colours for shading z-values (for example, 'terrain.colors (30)')
bg
If specified, OSM objects outside the convex hull surrounding 'dat' are plotted in this colour, otherwise they are included in the interpolation (which will generally be inaccurate for peripheral values)
size
Size argument passed to ggplot2 (polygon, path, point) functions: determines width of lines for (polygon, line), and sizes of points. Respective defaults are (0, 0.5, 0.5). If 'bg' is provided and 'size' has 2 elements, the second determines the 'size' of
shape
Shape of lines or points, for details of which see '?ggplot2::shape'. If 'bg' is provided and 'shape' has 2 elements, the second determines the 'shape' of the background objects.

Value

  • modified version of map (a ggplot object) to which surface has been added

See Also

plot_osm_basemap, add_colourbar.

Examples

Run this code
# Get some data
bbox <- get_bbox (c (-0.13, 51.5, -0.11, 51.52))
# dat_B <- extract_osm_objects (key='building', bbox=bbox)
# These data are also provided in
dat_B <- london$dat_BNR
# Make a data surface across the map coordinates, and remove periphery
n <- 5
x <- seq (bbox [1,1], bbox [1,2], length.out=n)
y <- seq (bbox [2,1], bbox [2,2], length.out=n)
dat <- data.frame (
    x=as.vector (array (x, dim=c(n, n))),
    y=as.vector (t (array (y, dim=c(n, n)))),
    z=x * y
    )
map <- plot_osm_basemap (bbox=bbox, bg='gray20')
map <- add_osm_surface (map, dat_B, dat=dat, cols=heat.colors (30))
print (map)

# If data do not cover the entire map region, then the peripheral remainder can
# be plotted by specifying the 'bg' colour. First remove periphery from
# 'dat':
d <- sqrt ((dat$x - mean (dat$x)) ^ 2 + (dat$y - mean (dat$y)) ^ 2)
dat <- dat [which (d < 0.01),]
map <- plot_osm_basemap (bbox=bbox, bg='gray20')
map <- add_osm_surface (map, dat_B, dat=dat, cols=heat.colors (30), bg='gray40')
print (map)

# Polygons and (lines/points) can be overlaid as data surfaces with different
# colour schemes.
# dat_HP <- extract_osm_objects (key='highway', value='primary', bbox=bbox)
# These data are also provided in
dat_HP <- london$dat_HP
cols <- adjust_colours (heat.colors (30), adj=-0.2) # darken by 20\%
map <- add_osm_surface (map, dat_HP, dat, cols=cols, bg='gray60', size=c(1.5,0.5))
print (map)

# Adding multiple surfaces of either polygons or (lines/points) produces a
# 'ggplot2' warning, and forces the colour gradient to revert to the last given
# value.
dat_T <- london$dat_T # trees
map <- plot_osm_basemap (bbox=bbox, bg='gray20')
map <- add_osm_surface (map, dat_B, dat=dat, cols=heat.colors (30), bg='gray40')
map <- add_osm_surface (map, dat_HP, dat, cols=heat.colors (30), bg='gray60', 
                        size=c(1.5,0.5))
map <- add_osm_surface (map, dat_T, dat, cols=topo.colors (30),
                        bg='gray70', size=c(5,2), shape=c(8, 1))
print (map) # 'dat_HP' is in 'topo.colors' not 'heat.colors'

# Add axes and colourbar
map <- add_axes (map)
map <- add_colourbar (map, cols=heat.colors (100), zlims=range (dat$z),
                      barwidth=c(0.02), barlength=c(0.6,0.99), vertical=TRUE)
print (map)

Run the code above in your browser using DataLab