Aqui está uma maneira no R:
Faça uma varredura de teste, 20x30 células, faça 1/10 das células definidas como 1, plote:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Para uma varredura existente em um arquivo, por exemplo, um geoTIFF, você pode apenas fazer:
> m = raster("mydata.tif")
Agora obtenha uma matriz das coordenadas xy das células 1, plote esses pontos e vemos que temos centros celulares:
> 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])
Etapa 1. Gere 1000 pares (xo, yo) centralizados em 0 em uma caixa do tamanho de uma única célula. Observe o uso de res
para obter o tamanho da célula:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Etapa 2. Calcule em qual célula cada um dos pontos acima está entrando, amostrando aleatoriamente 1000 valores de 1 ao número de 1 células:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Por fim, calcule a coordenada adicionando o centro da célula ao deslocamento. Traçar 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)
Aqui estão 10.000 pontos (substitua os 1000 acima por 10000), plotados com pch="."
:
Instantâneo para 10.000 pontos em uma varredura de 200x300 com metade dos pontos. Aumentará no tempo linearmente com quantos na varredura, eu acho.
Para salvar como um shapefile, converta para um SpatialPoints
objeto, forneça a referência correta do sistema de coordenadas (o mesmo que sua varredura) e salve:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Isso criará um shapefile que inclui o número da célula e as compensações como atributos.