Muestreos aleatorios sobre la península Ibérica, por ejemplo

El problema fue sugerido por Eloy Ortiz en un mensaje a r-help-es. Quería saber cómo muestrear aleatoriamente (i.e., uniformemente) puntos sobre una región de la superficie terrestre delimitada por su bounding box (i.e., las coordenadas que definen un rectángulo sobre la esfera).

Obviamente, no vale con muestrear latitud y longitud uniformemente: el área comprendida entre dos meridianos cerca del ecuador es mayor que la comprendida entre otros dos más próximos al polo. Los husos se estrechan lejos del ecuador.

Sin embargo, la superficie de una zona esférica depende solo de h (su grosor, en la nomenclatura del enlace anterior) y no de la latitud en la que se ubique y es A = 2 \pi R h.

Por tanto, es posible muestrear aleatoriamente sobre h (o el rango de h definido por el bb) y para convertir de nuevo esos puntos en grados. El código en R que permite hacer lo anterior es el siguiente:

# bb de la península Ibérica
lat.lims <- c(36, 44)
lon.lims <- c(-10, 4)
 
# número de puntos
n <- 1000
 
# la longitud se puede muestrear uniformemente
lon.sample <- runif(n, min = min(lon.lims), max = max(lon.lims))
 
# transformamos grados a radianes
lat.lims.rads <- lat.lims / 360 * 2 * pi
 
# latitud del bb en términos de h
h.lims <- sin(lat.lims.rads)
h.sample <- runif(n, min = min(h.lims), max = max(h.lims))
 
# de nuevo, grados
lat.sample <- asin(h.sample) / 2 / pi * 360
 
plot(lon.sample, lat.sample)

Y sí, sé que debería pintar esos puntos sobre un mapa, etc., pero…