Hier ist ein Weg in R:
Machen Sie ein Testraster, 20x30 Zellen, machen Sie 1/10 der Zellen auf 1 gesetzt, zeichnen Sie:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Für ein vorhandenes Raster in einer Datei, z. B. ein geoTIFF, können Sie einfach Folgendes tun:
> m = raster("mydata.tif")
Holen Sie sich nun eine Matrix der xy-Koordinaten der 1 Zellen, zeichnen Sie diese Punkte auf und wir sehen, dass wir Zellzentren haben:
> 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])
Schritt 1. Generieren Sie 1000 (xo, yo) Paare, die in einem Feld von der Größe einer einzelnen Zelle auf 0 zentriert sind. Beachten Sie die Verwendung von res
, um die Zellengröße zu erhalten:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Schritt 2. Ermitteln Sie, in welche Zelle sich jeder der oben genannten Punkte befindet, indem Sie 1000 Werte von 1 bis zur Anzahl von 1 Zellen zufällig auswählen:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Berechnen Sie abschließend die Koordinate, indem Sie die Zellmitte zum Versatz hinzufügen. Grundstück zu überprüfen:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Hier sind 10.000 Punkte (ersetzen Sie die 1000 oben durch 10000), dargestellt mit pch="."
:
Ziemlich augenblicklich für 10.000 Punkte auf einem 200x300- Raster mit der Hälfte der Punkte als Eins. Wird mit der Zeit linear mit der Anzahl der Raster zunehmen, denke ich.
Um als Shapefile zu speichern, konvertieren Sie es in ein SpatialPoints
Objekt, geben Sie ihm die richtige Koordinatensystemreferenz (die gleiche wie Ihr Raster) und speichern Sie:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Dadurch wird ein Shapefile erstellt, das die Zellennummer und die Offsets als Attribute enthält.