or “How to use RGL to plot 3d maps of API map tiles”

OK more nerd than ninja. RGL is R’s box of power-tool for 3D object rendering, with functionality for creating 3d mesh objects and curved surfaces, and for using materials and directional lighting. ¬†For example the line:


creates a 3d scatterplot of x-y-z normal distributions, producing:


OpenStreetMap provides a nice way to import map tiles via the OSM API (among others). A helpful StackOverFlower (Spacedman) has provided this useful function for adding ‘z’ values to OSM map objects, enabling them to be plotted in 3d:

map3d <- function(map, ...){
  if(length(map$tiles)!=1){stop("multiple tiles not implemented") }
  nx = map$tiles[[1]]$xres
  ny = map$tiles[[1]]$yres
  xmin = map$tiles[[1]]$bbox$p1[1]
  xmax = map$tiles[[1]]$bbox$p2[1]
  ymin = map$tiles[[1]]$bbox$p1[2]
  ymax = map$tiles[[1]]$bbox$p2[2]
  xc = seq(xmin,xmax,len=ny)
  yc = seq(ymin,ymax,len=nx)
  colours = matrix(map$tiles[[1]]$colorData,ny,nx)
  m = matrix(0,ny,nx)
  surface3d(xc,yc,m,col=colours, ...)

A benefit of the approach is that it enables you to adjust the map to the ideal perspective for representing the data in the final rendered image. Here I've applied the function to data on London's rental costs (for the year to December 2012), extruding thick lines for cost comparisons:


The satellite version, simply replacing 'osm' with 'bing' in the code..

Code @ Github

Tagged with →  
Share →

2 Responses to Map like a 3d Ninja in R

  1. help moppy says:

    Healing’s Dragon

    to seek out matters to further improve my web-site!I suppose its ok to make use of some of one’s principles!!

  2. Souls in the Waves

    Great Early morning, I just stopped in to visit your website and imagined I would say I experienced myself.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>