Tạo số lượng lớn các điểm ngẫu nhiên trong raster nhị phân?


9

Tôi muốn tạo một tập dữ liệu vectơ điểm 10000 điểm (hoặc lớn hơn) trong raster nhị phân, trong đó các điểm nên được giới hạn ở các khu vực có giá trị raster là 1.

Tôi đã thử các bước sau.

  1. Đa giác raster
  2. QGIS: Vector -> Công cụ nghiên cứu -> Điểm ngẫu nhiên

Điều này hoạt động tốt lên đến 2000 điểm nhưng bất cứ điều gì ở trên chỉ khiến cho QGIS sụp đổ.

Có cách nào để tạo một tập dữ liệu vectơ với số lượng lớn các tính năng điểm bị ràng buộc bởi một raster nhị phân (hoặc phiên bản đa giác của nó) không?

Các công cụ sau đây theo ý của tôi, được xếp hạng từ hầu hết đến ít thuận lợi nhất: QGIS, Python, R, ArcGIS

Đây là những gì tôi sẽ làm, chỉ với 10 lần các tính năng điểm.

1k điểm ngẫu nhiên


Làm thế nào lớn là raster của bạn, thường?
Spainedman

Một trong ví dụ trên là 19200 x 9600. Trình raster điển hình là khoảng 10000 x 10000 pixel.
Kersten

Được rồi, máy của bạn càng có nhiều RAM thì càng tốt. Tôi không dám thử nghiệm raster 10.000x10.000 trên PC nhỏ của mình ở đây, mặc dù bạn luôn có thể chia raster, lấy mẫu theo từng phần và tham gia ...
Spacesman

Tại sao đa giác hóa raster? bạn có phiền câu trả lời này hữu ích cho bạn không? gis.stackexchange.com/questions/22601/ Cách
Luigi Pirelli

Bởi vì sau đó tôi có thể sử dụng chức năng "Điểm ngẫu nhiên trong đa giác", trong khi QGIS không có "Điểm ngẫu nhiên bên trong các giá trị cụ thể của hàm Raster".
Kersten

Câu trả lời:


7

Đâ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=".":

điểm trong những

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.


Điều này có vẻ rất hứa hẹn. R của tôi đã bị rỉ sét một chút: Làm thế nào tôi có thể xuất các điểm sang định dạng vectơ (Shapefile, Geojson, gml, ... bất cứ điều gì thực sự) - Tôi cần lưu vị trí của các điểm mẫu để sử dụng sau.
Kersten

Chỉnh sửa hiển thị như thế nào để đọc một raster và chuyển đổi điểm để shapefile ...
Spacedman

3

Bất cứ khi nào tôi làm việc với các bộ dữ liệu lớn, tôi thích chạy các công cụ / lệnh bên ngoài QGIS, chẳng hạn như từ một tập lệnh độc lập hoặc từ OSGeo4W Shell . Không nhiều vì QGIS gặp sự cố (ngay cả khi thông báo "Không phản hồi", có thể nó vẫn đang xử lý dữ liệu mà bạn có thể kiểm tra từ Trình quản lý tác vụ ), nhưng vì có sẵn nhiều tài nguyên CPU như RAM để xử lý dữ liệu. Bản thân QGIS tiêu tốn một đoạn bộ nhớ hợp lý để chạy.

Dù sao, để chạy một công cụ bên ngoài QGIS ( bạn cần phải cài đặt QGIS thông qua trình cài đặt OSGeo4W ), hãy làm theo 2 bước đầu tiên như được mô tả bởi @gcarrillo trong bài đăng này: Vấn đề với nhập qgis.core khi viết tập lệnh PyQGIS độc lập (Tôi đề nghị tải xuống và sử dụng tệp .bat của anh ấy).

Sau khi thiết lập PATHS, nhập pythonvào dòng lệnh. Để thuận tiện, hãy sao chép mã sau vào trình soạn thảo văn bản như Notepad, chỉnh sửa các tham số như tên đường dẫn của shapefile của bạn, v.v. rồi dán toàn bộ vào dòng lệnh bằng cách bấm chuột phải> Dán :

import os, sys
from qgis.core import *
from qgis.gui import *
from PyQt4.QtGui import *

from os.path import expanduser
home = expanduser("~")

QgsApplication( [], False, home + "/AppData/Local/Temp" )

QgsApplication.setPrefixPath("C://OSGeo4W64//apps//qgis", True)
QgsApplication.initQgis()
app = QApplication([])

sys.path.append(home + '/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

shape = home + "/Desktop/Polygon.shp"
result = home + "/Desktop/Point.shp"
general.runalg("qgis:randompointsinlayerbounds", shape, 10000, 0, result)

Sử dụng tập lệnh, tôi đã chạy công cụ Điểm ngẫu nhiên trong giới hạn lớp cho một shapefile khá lớn và phải mất dưới 20 giây để tạo ra 10 nghìn điểm. Chạy nó trong QGIS mất gần 2 phút vì vậy ít nhất đối với tôi, có một sự khác biệt đáng kể.


1
Thay thế tuyệt vời, +1. Chỉ cần thử nghiệm điều này cho ứng dụng của tôi và trong khi nó chậm hơn một chút so với cách tiếp cận R, nó tạo ra kết quả mong muốn.
Kersten

@Kersten - Tuyệt vời, rất vui vì nó hoạt động :)
Joseph

1

Bạn cũng có thể sử dụng GRASS GIS trực tiếp cho công việc này - Lấy mẫu ngẫu nhiên được phân tầng: Lấy mẫu ngẫu nhiên từ bản đồ vector với các ràng buộc không gian :

https://grass.osgeo.org/grass72/manuals/v.random.html#stratified-random-sampling:-random-sampling-from-vector-map-with-spatial-constraint

Ngoài ra, lấy mẫu ngẫu nhiên từ bản đồ vector theo thuộc tính và một vài phương thức khác được thực hiện trong lệnh.

Lưu ý: Phiên bản v.random được hiển thị trong QGIS thông qua quá trình xử lý không phản ánh đầy đủ chức năng mà chỉ là chế độ xem đơn giản hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.