Aquí hay una manera en R:
Haga un ráster de prueba, 20x30 celdas, haga 1/10 de las celdas establecidas en 1, trace:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Para un ráster existente en un archivo, por ejemplo, un geoTIFF, puede hacer lo siguiente:
> m = raster("mydata.tif")
Ahora obtenga una matriz de las coordenadas xy de las celdas 1, trace esos puntos y veremos que tenemos centros de celdas:
> 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])
Paso 1. Genera 1000 pares (xo, yo) centrados en 0 en un cuadro del tamaño de una sola celda. Tenga en cuenta el uso de res
para obtener el tamaño de celda:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Paso 2. Determine en qué celda se encuentra cada uno de los puntos anteriores al muestrear aleatoriamente 1000 valores de 1 a la cantidad de 1 celdas:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Finalmente calcule la coordenada agregando el centro de la celda al desplazamiento. Parcela para verificar:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Aquí hay 10,000 puntos (reemplaza los 1000 anteriores con 10000), trazados con pch="."
:
Bastante instantáneo para 10,000 puntos en una trama de 200x300 con la mitad de los puntos como unos. Aumentará en el tiempo linealmente con cuántos en la trama, creo.
Para guardar como un archivo shape, conviértalo en un SpatialPoints
objeto, dele la referencia correcta del sistema de coordenadas (igual que su ráster) y guarde:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Eso creará un archivo de forma que incluye el número de celda y las compensaciones como atributos.