Ось спосіб у 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="."
:
Набагато миттєвий за 10 000 очок на растрі 200х300, половина очок як одиниця . Збільшиться в часі лінійно, скільки думаю в растрі, я думаю.
Щоб зберегти як файл форми, перетворіть його на SpatialPoints
об'єкт, надайте йому правильну посилання на систему координат (те саме, що і ваш растр) та збережіть:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Це створить файл форми, який включає в себе атрибути номер комірки та зміщення.