我想在二进制栅格中创建10000个点(或更大点)的点矢量数据集,该点应限制在栅格值为1的区域中。
我尝试了以下步骤。
- 多边形栅格化
- QGIS:矢量->研究工具->随机点
这可以正常工作到2000点,但是任何以上都会导致QGIS崩溃。
有没有一种方法来创建具有大量点特征且受二进制栅格(或其多边形化版本)约束的矢量数据集?
我可以使用以下工具,从最不喜欢到最不受欢迎:QGIS,Python,R,ArcGIS
这就是我要的,只有10倍的点特征。
我想在二进制栅格中创建10000个点(或更大点)的点矢量数据集,该点应限制在栅格值为1的区域中。
我尝试了以下步骤。
这可以正常工作到2000点,但是任何以上都会导致QGIS崩溃。
有没有一种方法来创建具有大量点特征且受二进制栅格(或其多边形化版本)约束的矢量数据集?
我可以使用以下工具,从最不喜欢到最不受欢迎:QGIS,Python,R,ArcGIS
这就是我要的,只有10倍的点特征。
Answers:
这是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,其中包含单元格编号和偏移量作为属性。
每当我使用大型数据集时,我都喜欢在 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分钟,所以对我来说,这是一个很大的不同。
您也可以直接使用GRASS GIS进行此工作- 分层随机抽样:从具有空间限制的矢量地图中随机抽样:
此外,在命令中还实现了按属性从矢量映射中进行随机采样以及其他一些方法。
注意:通过处理在QGIS中公开的v.random版本并不反映完整的功能,而只是一个简化的视图。