Đây là một cách trong R:
Tạo một raster thử nghiệm, 20x30 ô, tạo 1/10 các ô được đặt thành 1, vẽ đồ thị:
> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)
Đối với một raster hiện có trong một tệp, ví dụ như GeoTIFF, bạn chỉ có thể thực hiện:
> m = raster("mydata.tif")
Bây giờ hãy lấy một ma trận tọa độ xy của 1 ô, vẽ các điểm đó và chúng ta thấy chúng ta có các trung tâm ô:
> 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])
Bước 1. Tạo 1000 cặp (xo, yo) được căn giữa 0 trong một ô có kích thước của một ô. Lưu ý sử dụng res
để có được kích thước ô:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
Bước 2. Tìm ra ô nào trong số các điểm trên sẽ đi vào bằng cách lấy mẫu ngẫu nhiên 1000 giá trị từ 1 đến số 1 ô:
> pts$cell = sample(nrow(ones), 1000, replace=TRUE)
Cuối cùng tính toán tọa độ bằng cách thêm tâm ô vào phần bù. Lô đất để kiểm tra:
> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)
Dưới đây là 10.000 điểm (thay thế 1000 ở trên bằng 10000), được vẽ bằng pch="."
:
Khá nhiều tức thời cho 10.000 điểm trên một raster 200x300 với một nửa số điểm là một. Tôi sẽ tăng theo thời gian tuyến tính với bao nhiêu cái trong raster, tôi nghĩ vậy.
Để lưu dưới dạng shapefile, chuyển đổi thành SpatialPoints
đối tượng, cung cấp cho nó tham chiếu hệ tọa độ phù hợp (giống như raster của bạn) và lưu:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
Điều đó sẽ tạo ra một shapefile bao gồm số ô và offset làm thuộc tính.