Вот способ в R:
Создайте тестовый растр, 20х30 ячеек, сделайте 1/10 из ячеек, установленных на 1, построите график:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Для существующего растра в файле, например, geoTIFF, вы можете просто сделать:
> m = raster("mydata.tif")
Теперь возьмите матрицу координат xy ячеек 1, нарисуйте эти точки, и мы увидим, что у нас есть центры клеток:
> 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])
Шаг 1. Создайте 1000 (xo, yo) пар, которые центрированы на 0 в коробке размером с одну ячейку. Обратите внимание на использование, res
чтобы получить размер ячейки:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Шаг 2. Определите, в какую ячейку входит каждая из вышеперечисленных точек, путем случайной выборки 1000 значений от 1 до числа 1:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Наконец, вычислите координату, добавив центр ячейки к смещению. Участок для проверки:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Вот 10000 точек (замените 1000 выше на 10000), построенных с помощью pch="."
:
Практически мгновенно для 10000 точек на растре 200x300 с половиной точек как единица. Думаю, со временем они будут линейно увеличиваться с тем, сколько в растре.
Чтобы сохранить как шейп-файл, преобразуйте его в SpatialPoints
объект, задайте ему правильную ссылку на систему координат (так же, как и в растре) и сохраните:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Это создаст шейп-файл, который включает номер ячейки и смещения в качестве атрибутов.