Voici un moyen dans R:
Faire un raster de test, 20x30 cellules, faire 1/10 des cellules définies sur 1, tracer:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Pour un raster existant dans un fichier, par exemple un geoTIFF, vous pouvez simplement faire:
> m = raster("mydata.tif")
Maintenant, obtenez une matrice des coordonnées xy des 1 cellules, tracez ces points, et nous voyons que nous avons des centres de cellules:
> 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])
Étape 1. Générez 1000 paires (xo, yo) centrées sur 0 dans une boîte de la taille d'une seule cellule. Notez l'utilisation de res
pour obtenir la taille des cellules:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Étape 2. Déterminez dans quelle cellule chacun des points ci-dessus va entrer en échantillonnant au hasard 1000 valeurs de 1 au nombre de 1 cellules:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Enfin, calculez les coordonnées en ajoutant le centre de la cellule au décalage. Terrain à vérifier:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Voici 10000 points (remplacez les 1000 ci-dessus par 10000), tracé avec pch="."
:
Quasiment instantané pour 10 000 points sur un raster 200x300 avec la moitié des points comme des uns. Augmentera le temps de façon linéaire avec le nombre de pixels dans le raster, je pense.
Pour enregistrer en tant que fichier de formes, convertissez-le en SpatialPoints
objet, donnez-lui la bonne référence de système de coordonnées (la même que votre raster) et enregistrez:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Cela créera un fichier de formes qui comprend le numéro de cellule et les décalages en tant qu'attributs.