在二进制栅格中创建大量随机点?


9

我想在二进制栅格中创建10000个点(或更大点)的点矢量数据集,该点应限制在栅格值为1的区域中。

我尝试了以下步骤。

  1. 多边形栅格化
  2. QGIS:矢量->研究工具->随机点

这可以正常工作到2000点,但是任何以上都会导致QGIS崩溃。

有没有一种方法来创建具有大量点特征且受二进制栅格(或其多边形化版本)约束的矢量数据集?

我可以使用以下工具,从最不喜欢到最不受欢迎:QGIS,Python,R,ArcGIS

这就是我要的,只有10倍的点特征。

1k随机点


通常,您的栅格有多大?
Spacedman

上例中的像素为19200 x9600。典型的栅格约为10000 x 10000像素。
2015年

好的,您的计算机拥有的内存越多越好。我不敢在这里的小PC上测试10,000x10,000的栅格,尽管您总是可以将栅格划分,采样并
合并

为什么将栅格多边形化?您介意此答案对您有用吗?gis.stackexchange.com/questions/22601/…–
路易吉·倍耐力

因为这样我可以使用“多边形中的随机点”功能,而QGIS没有“栅格的特定值内的随机点”功能。
2015年

Answers:


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点(用10000代替上方的1000),绘制为pch="."

点对点

对于200x300栅格中的10,000点,几乎是瞬时的,其中一半是点。我认为时间会随着栅格中的数量线性增加。

要将其另存为shapefile,请转换为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 2015年

编辑显示了如何读取栅格并将pts转换为shapefile ...
Spacedman

3

每当我使用大型数据集时,我都喜欢 QGIS 之外运行工具/命令,例如从独立脚本OSGeo4W Shell中运行。并不是因为QGIS崩溃(即使它说“没有响应”,它可能仍在处理可以从任务管理器检查的数据),而是因为有更多的CPU资源(例如RAM)可用于处理数据。QGIS本身消耗大量内存来运行。

无论如何,要在QGIS外部运行工具(您需要通过OSGeo4W安装程序安装QGIS),请按照本文@gcarrillo所述的前两个步骤进行操作:编写独立的PyQGIS脚本时导入qgis.core出现问题(我建议下载并使用他的.bat文件)。

设置PATHS后,python在命令行中键入。为了方便起见,将以下代码复制到文本编辑器(例如记事本)中,编辑参数(例如shapefile的路径名等),然后通过右键单击>粘贴将整个内容粘贴到命令行中:

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)

使用该脚本,我为相当大的shapefile 运行了“ 图层边界随机点”工具,并花费了不到20秒的时间才能生成10k点。在QGIS中运行它花费了将近2分钟,所以对我来说,这是一个很大的不同。


1
极好的选择,+ 1。刚刚针对我的应用程序对此进行了测试,尽管它比R方法要慢一些,但它可以产生所需的结果。
2015年

@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版本并不反映完整的功能,而只是一个简化的视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.