İkili taramada büyük miktarda rastgele noktalar mı oluşturuyorsunuz?


9

Noktaların raster değerinin 1 olduğu alanlarla sınırlandırılması gereken ikili bir raster içinde 10000 nokta (veya daha büyük) bir nokta vektör veri kümesi oluşturmak istiyorum.

Aşağıdaki adımları denedim.

  1. Poligonize tarama
  2. QGIS: Vektör -> Araştırma Araçları -> Rastgele Noktalar

Bu 2000 noktaya kadar iyi çalışır, ancak yukarıdaki herhangi bir şey QGIS'in çökmesine neden olur.

İkili bir tarama (veya çokgenleştirilmiş sürümü) tarafından kısıtlanan çok sayıda nokta özelliğine sahip bir vektör veri kümesi oluşturmanın bir yolu var mı?

Aşağıdaki araçlar elimde, en azdan en az lehine sıralandı: QGIS, Python, R, ArcGIS

Ben bunun için gidiyorum, sadece 10x nokta özellikleri ile.

1k rastgele puan


Rasteriniz genellikle ne kadar büyük?
Spacedman

Yukarıdaki örnekteki örnek 19200 x 9600'dür. Tipik tarama yaklaşık 10000 x 10000 pikseldir.
Kersten

Tamam, makineniz ne kadar RAM olursa o kadar iyidir. Her zaman rasterleri bölebilir, parçalara
ayırabilir

Raster neden çokgenleşiyor? bu cevabın sizin için yararlı olduğunu düşünüyor musunuz? gis.stackexchange.com/questions/22601/…
Luigi Pirelli

Çünkü o zaman "Çokgende Rastgele Noktalar" fonksiyonunu kullanabilirim, oysa QGIS "Raster'in belirli değerlerinin içinde Rasgele Noktalar" fonksiyonuna sahip değildir.
Kersten

Yanıtlar:


7

İşte R'de bir yol:

Bir test tarama yapın, 20x30 hücre, 1 / 10'a ayarlanmış hücrelerin 1 / 10'unu yapın:

> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)

Bir dosyadaki mevcut bir tarama, örneğin bir geoTIFF için şunları yapabilirsiniz:

> m = raster("mydata.tif")

Şimdi 1 hücrenin xy koordinatlarının bir matrisini alın, bu noktaları çizin ve hücre merkezlerimiz olduğunu görüyoruz:

> 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])

Adım 1. Tek bir hücre boyutunda bir kutuda 0 üzerinde merkezlenmiş 1000 (xo, yo) çiftleri oluşturun. resHücre boyutunu elde etmek için kullanımını not edin:

> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])

Adım 2. Yukarıdaki değerlerin her birinin hangi hücreye gireceğini 1000'den 1'e 1 hücre sayısına rastgele örnekleyerek hesaplayın:

> pts$cell = sample(nrow(ones), 1000, replace=TRUE)

Son olarak, ofsete hücre merkezini ekleyerek koordinatı hesaplayın. Kontrol edilecek arazi:

> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)

İşte 10.000 puan (yukarıdaki 1000'i 10000 ile değiştirin) pch=".":

birindeki puanlar

200x300 rasterde 10.000 puan için yarı puan olarak yarı anlık . Rasterde kaç tane ile zaman içinde doğrusal olarak artacağını düşünüyorum.

Şekil dosyası olarak kaydetmek için, bir SpatialPointsnesneye dönüştürün , ona doğru koordinat sistemi referansını (rasterinizle aynı) verin ve kaydedin:

> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")

Bu, hücre numarasını ve ofsetleri öznitelik olarak içeren bir şekil dosyası oluşturur.


Bu çok umut verici görünüyor. Benim R biraz paslı oldu: Nasıl bir vektör formatında (Shapefile, geojson, gml, ... gerçekten ne olursa olsun) noktaları vermek mümkün olacak - Daha sonra kullanmak için örnek noktalarının yerleri kaydetmek gerekir.
Kersten

Düzenlemeler, bir raster nasıl okunacağını ve
puanları

3

Büyük veri kümeleriyle her çalıştığımda, bağımsız bir komut dosyası veya OSGeo4W Kabuğu gibi QGIS dışında araçlar / komutlar çalıştırmayı seviyorum . Çok değil çünkü QGIS çöküyor ("Yanıt vermiyor" yazsa bile, muhtemelen Görev Yöneticisi'nden kontrol edebileceğiniz verileri işliyor ), ancak verileri işlemek için RAM gibi daha fazla CPU kaynağı mevcut olduğundan. QGIS, çalıştırmak için adil bir bellek kullanır.

Her neyse, QGIS dışında bir araç çalıştırmak için ( OSGeo4W yükleyicisi aracılığıyla QGIS'i yüklemiş olmanız gerekir ), bu yayında @gcarrillo tarafından açıklanan ilk 2 adımı izleyin : Tek başına bir PyQGIS komut dosyası yazarken içe aktarma qgis.core ile ilgili sorun (.Bat dosyasını indirip kullanmanızı öneririm).

PATHS ayarlandıktan pythonsonra komut satırına yazın. Kolaylık sağlamak için, aşağıdaki kodu Not Defteri gibi bir metin düzenleyicisine kopyalayın, şekil dosyanızın yol adı gibi parametreleri düzenleyin ve ardından sağ tıklayın> Yapıştır ile her şeyi komut satırına yapıştırı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)

Komut dosyasını kullanarak, oldukça büyük bir şekil dosyası için katman sınırları aracında Rastgele noktaları çalıştırdım ve 10k puan oluşturmak 20 saniyenin altında sürdü. QGIS içinde çalıştırmak neredeyse 2 dakika sürdü, bu yüzden benim için en az, önemli bir fark var.


1
Mükemmel bir alternatif, +1. Sadece benim uygulama için test ve R yaklaşım biraz daha yavaş olsa da istenen sonuçları oluşturur.
Kersten

@Kersten - Harika, işe yarıyor :)
Joseph

1

GRASS GIS'i doğrudan bu iş için de kullanabilirsiniz - Tabakalı rastgele örnekleme: Vektör haritadan mekansal kısıtlamalarla rastgele örnekleme :

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

Ek olarak, vektör haritadan özniteliğe göre rastgele örnekleme ve komutta birkaç yöntem daha uygulanır.

Not: QGIS'te işleme yoluyla ortaya çıkan v.random sürümü, tam işlevselliği yansıtmaz, yalnızca basitleştirilmiş bir görünümü yansıtır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.