Ecco un modo in R:
Crea un test raster, 20x30 celle, crea 1/10 delle celle impostate su 1, traccia:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Per un raster esistente in un file, ad esempio un geoTIFF, puoi semplicemente fare:
> m = raster("mydata.tif")
Ora prendi una matrice delle coordinate xy delle 1 celle, traccia questi punti e vediamo che abbiamo centri cellulari:
> ones = xyFromCell(m,1:prod(dim(m)))[getValues(m)==1,]
> head(ones)
x y
[1,] -42 85.5
[2,] 102 85.5
[3,] 162 85.5
[4,] 42 76.5
[5,] -54 67.5
[6,] 30 67.5
> points(ones[,1],ones[,2])
Passaggio 1. Generare 1000 coppie (xo, yo) centrate su 0 in una casella delle dimensioni di una singola cella. Nota l'uso di res
per ottenere le dimensioni della cella:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Passaggio 2. Calcola in quale cella si trova ciascuno dei punti precedenti campionando casualmente 1000 valori da 1 al numero di 1 celle:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Infine calcola le coordinate aggiungendo il centro della cella all'offset. Trama per controllare:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Ecco 10.000 punti (sostituisci i 1000 sopra con 10000), tracciati con pch="."
:
Praticamente istantaneo per 10.000 punti su un raster 200x300 con metà dei punti come quelli. Aumenterò nel tempo in modo lineare con quanti nel raster, penso.
Per salvare come file di forma, converti in un SpatialPoints
oggetto, dagli il giusto riferimento al sistema di coordinate (lo stesso del tuo raster) e salva:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Ciò creerà un file di forma che include il numero di cella e gli offset come attributi.