バイナリラスターに大量のランダムポイントを作成しますか?


9

バイナリラスタ内に10000ポイント(またはそれ以上)のポイントベクトルデータセットを作成します。この場合、ポイントはラスター値が1である領域に制限されます。

以下の手順を試しました。

  1. ラスターをポリゴン化
  2. QGIS:Vector-> Research Tools-> Random Points

これは最大2000ポイントまで正常に機能しますが、それを超えるとQGISがクラッシュするだけです。

バイナリラスタ(またはポリゴンポリゴンバージョン)によって制約された多数のポイントフィーチャを含むベクターデータセットを作成する方法はありますか?

次のツールは、自由に使用できます。優先度の高いものから順に、QGIS、Python、R、ArcGISです。

これが私が目指していることであり、ポイント機能の10倍のみです。

1kランダムポイント


通常、ラスターの大きさはどれくらいですか?
Spacedman、2015年

上記の例では、19200 x 9600です。通常のラスターは約10000 x 10000ピクセルです。
Kersten、2015年

さて、あなたのマシンはより多くのRAMを持っています。私は...あなたはいつも部品でラスタ、サンプルを分割することができますが、ここで私の小さなPC上10,000x10,000ラスタのないテストをあえて、そして参加
Spacedman

なぜラスターをポリゴン化するのですか?この回答が役に立ちますか?gis.stackexchange.com/questions/22601/...
ルイジピレリ

なぜなら、私は「ポリゴンのランダムポイント」関数を使用できるのに対し、QGISは「ラスターの特定の値内のランダムポイント」関数を持っていないからです。
Kersten、2015年

回答:


7

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

1セルのxy座標の行列を取得し、それらの点をプロットすると、セルの中心があることがわかります。

> 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.単一セルのサイズのボックスで、0を中心とする1000(xo、yo)ペアを生成します。resセルサイズを取得するためのの使用に注意してください。

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

ステップ2. 1から1セルの数までの1000個の値をランダムにサンプリングすることにより、上記の各ポイントがどのセルに入るかを調べます。

> 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ポイントです(上記の1000を10000に置き換えます)pch="."

もののポイント

200x300のラスターで10,000ポイントを半分のポイントとしてラスターで瞬間的に処理します。ラスター内の何個に比例して時間とともに増加すると思います。

シェープファイルとして保存するには、SpatialPointsオブジェクトに変換し、正しい座標系参照(ラスターと同じ)を指定して保存します。

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

これにより、セル番号とオフセットを属性として含むシェープファイルが作成されます。


これは非常に有望です。私のRは少し錆びてきました:ポイントをベクター形式(Shapefile、geojson、gmlなど)にエクスポートするにはどうすればよいですか-後で使用するためにサンプルポイントの場所を保存する必要があります。
Kersten、2015年

編集では、ラスターを読み取り、ptsをシェープファイルに変換する方法を示しています...
Spacedman

3

大規模なデータセットを扱うときはいつでも、スタンドアロンスクリプトOSGeo4W Shellからなど、QGISの外部でツール/コマンドを実行したいです。QGISがクラッシュするのはそれほどではありません(「応答しない」と表示されていても、タスクマネージャーから確認できるデータを処理している可能性があります)。ただし、RAMなどのより多くのCPUリソースがデータの処理に使用できるためです。QGIS自体は、実行するためにかなりの量のメモリを消費します。

とにかく、QGISの外部でツールを実行するには(OSGeo4Wインストーラーを介してQGISをインストールする必要があります)、この投稿の@gcarrilloで説明されている最初の2つの手順に従います。(私は彼の.batファイルをダウンロードして使用することをお勧めします)。

PATHSが設定されたら、pythonコマンドラインに入力します。便宜上、次のコードをメモ帳などのテキストエディターにコピーし、シェープファイルのパス名などのパラメーターを編集してから、右クリックして[貼り付け]を実行して、全体をコマンドラインに貼り付けます。

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)

スクリプトを使用して、かなり大きなシェープファイルに対してレイヤー境界ツールのランダムポイントを実行しました。10kポイントを生成するのに20秒未満かかりました。QGIS内で実行するのに2分近くかかったので、少なくとも私にとっては大きな違いがあります。


1
優れた選択肢、+ 1。私のアプリケーションでこれをテストしたところ、Rアプローチよりも少し遅いですが、望ましい結果が得られます。
Kersten、2015年

@Kersten-すごい、それが機能してうれしい:)
ジョセフ

1

このジョブにGRASS GISを直接使用することもできます- 層別ランダムサンプリング:空間制約のあるベクトルマップからのランダムサンプリング

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

さらに、属性によるベクターマップからのランダムサンプリングと他のいくつかのメソッドがコマンドに実装されています。

注:QGISで処理を通じて公開されたv.randomバージョンは、すべての機能を反映しているわけではなく、単純化されたビューを反映しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.