이진 래스터에 많은 양의 임의의 점을 만드시겠습니까?


9

이진 래스터 내에 10000 포인트 이상의 포인트 벡터 데이터 세트를 만들고 싶습니다. 여기서 래스터 값이 1 인 영역으로 포인트를 제한해야합니다.

나는 다음 단계를 시도했다.

  1. 다각형 래스터
  2. QGIS : 벡터-> 연구 도구-> 임의의 점

이것은 최대 2000 포인트까지 잘 작동하지만 위의 모든 것은 QGIS 충돌을 유발합니다.

이진 래스터 (또는 다각형 버전)에 의해 제한되는 많은 수의 점 피쳐로 벡터 데이터 세트를 생성하는 방법이 있습니까?

QGIS, Python, R, ArcGIS 중에서 가장 선호하는 것부터 다음과 같은 도구를 사용할 수 있습니다.

이것은 내가 포인트 기능의 10 배 만 사용하려고합니다.

1k 랜덤 포인트


일반적으로 래스터는 얼마나 큽니까?
Spacedman

위 예제에서 하나는 19200 x 9600입니다. 일반적인 래스터는 약 10000 x 10000 픽셀입니다.
Kersten

좋아, 기계의 RAM이 많을수록 좋습니다. 나는 항상 작은 래스터 PC에서 10,000x10,000 래스터를 테스트하지는 않지만, 래스터를 분할하고 샘플을 부분적으로 나누어 결합 할 수는 있지만 ...
Spacedman

왜 래스터를 다각형 화합니까? 이 답변이 유용하다고 생각하십니까? gis.stackexchange.com/questions/22601/…
Luigi Pirelli

QGIS에는 "Random Points in Polygon"기능을 사용할 수있는 반면 QGIS에는 "Raster의 특정 값 안에있는 Random Points"기능이 없습니다.
Kersten

답변:


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

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=".".

1 점

200x300 래스터 에서 10,000 포인트에 대해 거의 순간적 으로 절반을 차지하는 거의 순간적 . 래스터에있는 것들의 수와 선형으로 시간이 증가 할 것이라고 생각합니다.

모양 파일로 저장하려면 SpatialPoints객체 로 변환 하고 올바른 좌표계 참조 (래스터와 동일)를 제공 한 후 저장하십시오.

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

셀 번호와 오프셋을 속성으로 포함하는 shapefile을 만듭니다.


이것은 매우 유망한 것으로 보입니다. 내 R은 조금 녹슬 었습니다. 점을 벡터 형식 (Shapefile, geojson, gml 등)으로 내보낼 수있는 방법-나중에 사용하기 위해 샘플 점의 위치를 ​​저장해야합니다.
Kersten

편집은 래스터를 읽고 pt를 shapefile로 변환하는 방법을 보여줍니다 ...
Spacedman

3

큰 데이터 세트로 작업 할 때마다 독립형 스크립트 또는 OSGeo4W Shell 과 같은 QGIS 외부 에서 도구 / 명령을 실행 하고 싶습니다 . QGIS 충돌로 인해 "응답하지 않음"이라고해도 작업 관리자 에서 확인할 수있는 데이터를 처리하고있을 수 있지만 RAM과 같은 더 많은 CPU 리소스를 사용하여 데이터를 처리 할 수 ​​있기 때문입니다. QGIS 자체는 실행하기 위해 상당한 양의 메모리를 소비합니다.

어쨌든 QGIS 외부에서 도구를 실행 하려면 (OSGeo4W 설치 프로그램을 통해 QGIS를 설치해야 함 ) 이 게시물의 @gcarrillo에 설명 된대로 처음 2 단계 를 따르십시오. 독립형 PyQGIS 스크립트를 작성할 때 qgis.core 가져 오기 문제 (그의 .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

@Kersten-굉장하다, 다행이다 :)
Joseph

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.