นี่คือวิธีใน R:
ทำการทดสอบแรสเตอร์เซลล์ 20x30 สร้าง 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 สร้างคู่ 1,000 (xo, yo) ที่อยู่ตรงกลางบน 0 ในกล่องขนาดของเซลล์เดียว หมายเหตุการใช้res
เพื่อให้ได้ขนาดเซลล์:
> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])
ขั้นตอนที่ 2 กำหนดว่าเซลล์ใดที่จุดใดจุดหนึ่งข้างต้นนั้นสุ่มโดยสุ่มค่า 1,000 ค่าจาก 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)
นี่คือ 10,000 คะแนน (แทนที่ 1,000 ข้างต้นด้วย 10,000), พล็อตด้วยpch="."
:
สวยมากทันทีสำหรับ10,000คะแนนในแรสเตอร์200x300โดยมีครึ่งหนึ่งของคะแนน จะเพิ่มขึ้นในเวลาเชิงเส้นกับจำนวนคนในแรสเตอร์ฉันคิดว่า
หากต้องการบันทึกเป็นรูปร่างไฟล์ให้แปลงเป็นSpatialPoints
วัตถุให้การอ้างอิงระบบพิกัดที่ถูกต้อง (เช่นเดียวกับแรสเตอร์ของคุณ) และบันทึก:
> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")
ที่จะสร้าง shapefile ที่มีหมายเลขเซลล์และออฟเซ็ตเป็นแอตทริบิวต์