Oto sposób na R:
Zrób testowy raster, komórki 20x30, zrób 1/10 komórek ustawionych na 1, wykreśl:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
W przypadku istniejącego rastra w pliku, na przykład geoTIFF, możesz po prostu:
> m = raster("mydata.tif")
Teraz uzyskaj macierz współrzędnych xy 1 komórek, wykreśl te punkty i zobaczymy, że mamy centra komórkowe:
> 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])
Krok 1. Wygeneruj 1000 par (xo, yo), które są wyśrodkowane na 0 w polu wielkości pojedynczej komórki. Zwróć uwagę na użycie, res
aby uzyskać rozmiar komórki:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Krok 2. Sprawdź, do której komórki wchodzi każdy z powyższych punktów, losowo próbkując 1000 wartości od 1 do liczby 1 komórek:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Na koniec oblicz współrzędną, dodając środek komórki do odsunięcia. Działka do sprawdzenia:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Oto 10 000 punktów (zamień 1000 powyżej na 10000), z wykreśleniem pch="."
:
Niemal natychmiastowe dla 10 000 punktów na rastrze 200 x 300 z połową punktów jako jedynymi. Wydaje mi się, że wraz z upływem czasu będzie rósł liniowo.
Aby zapisać jako plik kształtu, przekonwertuj na SpatialPoints
obiekt, nadaj mu właściwe odniesienie do układu współrzędnych (taki sam jak twój raster) i zapisz:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Spowoduje to utworzenie pliku kształtu zawierającego numer komórki i przesunięcia jako atrybuty.