[R] 3d plot of earth with cut

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Thu Oct 22 21:28:34 CEST 2020

On 21/10/2020 8:45 a.m., Balint Radics wrote:
> Hello,
> Could someone suggest a package/way to make a 3D raster plot of the Earth
> (with continent boundaries), and then make a "cut" or "slice" of it such
> that one can also visualize some scalar quantity as a function of the
> Radius/Depth across that given slice ?
> Formally, I would have a given, fixed longitude, and a list of vectors
> {latitude, radius, Value}
> that would show the distribution of the quantity "Value" at various depths
> and latitudes in 3D.

The rgl package has a full sphere of the Earth with (obsolete) political 
boundaries in example(persp3d).  To cut it in half along the plane 
through a given longitude (and that longitude + 180 deg), you could use 
clipPlanes3d, or clipObj3d.  For example,

lat <- matrix(seq(90, -90, len = 50)*pi/180, 50, 50, byrow = TRUE)
long <- matrix(seq(-180, 180, len = 50)*pi/180, 50, 50)

r <- 6378.1 # radius of Earth in km
x <- r*cos(lat)*cos(long)
y <- r*cos(lat)*sin(long)
z <- r*sin(lat)

ids <- persp3d(x, y, z, col = "white",
         texture = system.file("textures/worldsmall.png", package = "rgl"),
         specular = "black", axes = FALSE, box = FALSE, xlab = "", ylab 
= "", zlab = "",
         normal_x = x, normal_y = y, normal_z = z)

clipFn <- function(coords) {
   pmax(coords[,1], coords[,2]) # Just an example...
clipObj3d(ids["surface"], clipFn)

Filling in the exposed surface could be done with polygon3d(), with some 
work to construct the polygon. Displaying the function across that 
surface could be done in a couple of ways, either by using a texture map 
(like for the map), or subdividing the polygon and setting colour by the 
coordinates of each vertex.

Note that the clipObj3d function isn't on CRAN yet; there you'd have to 
use clipPlanes3d.  You can get the newer version from R-forge.

Duncan Murdoch

More information about the R-help mailing list