从开源GIS解决方案中的多边形叠加层获取栅格值


16

我有两层。包含许多图块的多边形形状层和包含CORINE 2006土地覆盖物的栅格层,并在色图中包含许多类别。我想为shapelayer中的每个多边形获取栅格图层的每个土地覆盖类别的总和。

例如,有一个ID为'2'的多边形,我要为此多边形设置这样的属性(以百分比或平方米为单位):

  • 耕地:15%
  • 森林:11%
  • 街道:2%(...等等)

我试图在草,qgis(无功能),saga(将每个总和求和成一个总值)r(总和)中做到这一点,但我仍然没有找到解决方案。大多数插件(qgis中的区域统计信息)仅支持0-1栅格图层。v.rast.stats也没有帮助。Iam接受任何优秀而明智的解决方案!也许我什至使用了错误的方法或犯了错误。

如果记得正确的话,在Arcgis中,此任务非常容易,但是对于您的日常linux用户,我仍然缺少一个好的解决方案。

我正在运行一个debian linux系统,这就是为什么我只能为此操作系统使用程序的原因。


编辑:因为这个问题仍然有这么多的视图和访问者:我写了一个QGIS插件,它也能够计算栅格图层的土地覆盖。我还没有编写多边形叠加层的代码,但是它确实经过了规划。在此处找到插件然后首先安装Scipy库。


绝对可以在R中完成,这只是确定哪些功能的问题。您需要使用栅格覆盖每个多边形,然后使用table()获取“ Cookie剪切”像素的摘要。软件包raster,rgdal和rgeos可能会有用。阅读“ R Spatial Task View”(谷歌会找到它)
Spacedman

当然可以,但是我如何得到这样的总结。您可以使用!is.na(overlay(Poly,Raster))轻松地将多边形图层与栅格图层叠加,但是使用诸如extract这样的命令,我只能计算Cookie剪切像素中的总面积,而不能计算色图的不同类别。我不知道rgeos,但我查看了api,发现没有函数可以执行此操作。
Curlew 2012年

在GRASS中检查r.univar,请参见grasswiki.osgeo.org/wiki/Zonal_statistics
markusN 2012年

嗨!感谢您制作QGIS插件!我只想提一下,该插件崩溃(> 13000个多边形)。如果它将任务分解成不崩溃,那就太好了。并且可以选择一次添加所有类(例如,使属性表获得2个新字段LandcoverID和Landcover%,它们都持有带有值的CSV列表),这将是
很棒的

@Joran:如果您认为这是一个错误,请提出一个错误报告,而不要在注释中编写(github.com/Martin-Jung/LecoS/issues)。此外1)序列化或批处理您的任务不是插件工作。然后在较小的子集上运行它。2)当然。将添加许多奇妙的东西。代码是开源的,请随意编写:)
Curlew

Answers:


13

使用“提取”在栅格上覆盖SpatialPolygonsDataFrame(可以使用maptools:readShapeSpatial从shapefile读取)中的面要素,然后使用“表”进行汇总。例:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

因此,我的第一个多边形覆盖542个像素,第二个多边形覆盖958个像素。我可以总结一下每个像素:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

因此,我的第一个多边形是26类的287像素,以及27类的255像素。求和,求和除以100即可得到百分比。


太好了,非常感谢您的努力。我将尝试尝试并进行报告:-)
Curlew 2012年

6

我想报告,我在这里。Spacedman的解决方案效果很好,我能够导出形状中每个多边形的所有信息。以防万一有人有相同的问题,这是我之前的方式:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

如果我正确理解您想要的内容,并假设您的GRASS GIS数据库中已经具有矢量层“ mypolygonlayer”和栅格层“ corina”,则:

首先,我将向量转换为栅格。这只猫将确保您为每个多边形拥有一个唯一的标识符。如果您的列具有唯一的数字标识符,则可以改用该列。labelcolumn是可选的:

v.to.rast输入= mypolygonlayer图层= 1输出= mypolygons使用= cat labelcolumn = NameMappingUnit

然后运行r.stats以获得统计信息:

r.stats -a -l input = mypolygons,科琳娜分隔符=; 输出= / home / paulo / corinastats.csv

最后一步是在例如LibreOffice中打开corinastats.csv并创建数据透视表或使用R创建交叉表


3

我知道这篇文章已经很老了,但是最近我希望进行同样的分析,但是下载诸如R之类的程序在我的工作计算机上有点麻烦,需要批准。经过数小时的研究,我只能使用QGis和Excel来使用此方法,我发现此方法对我来说效果最好,并希望将其提供给处于相同情况的人们。

  1. 将多边形剪切到栅格图层(栅格→提取→ 剪切器:输入文件=栅格图层,选择输出名称和位置,单击遮罩层,选择多边形→确定)

  2. 使裁剪器层多边形化(栅格→转换→多边形化:输入文件=您的裁剪层,保存输出→确定)

  3. 计算像素数(单击刚创建的形状文件→打开字段计算器:勾选“创建新字段”并添加字段名称,功能=几何形状→面积→确定)。现在,您应该在属性表中有一个新列,显示像素数。

  4. 保存多边形图层(右键单击多边形图层,另存为:格式= DBF文件,另存为→确定)

  5. 汇总每个栖息地的像素数(启动excel,打开文件,如果您没有标题,请为每列现在添加一个像素,单击一个空单元格,转到“数据”选项卡,合并,确保其总和是正确的,然后单击“浏览…”旁边的红色箭头,然后选择两列(包括标题),单击“添加”,然后在“顶行”和“左列”框中打勾,然后单击确定。

  6. 如果像我一样,有很多多边形需要分析,并且需要在同一张表中进行比较,那么此步骤将很有帮助。在新的Excel工作簿中,将栖息地编号列在A列中(对我来说是1到48),然后将刚刚合并的两列放在B和C列中(B中的栖息地,C中的像素数)。在单元格D1中,编写以下公式:= IFNA(INDEX(C:C; MATCH(A2; B:B; 0));“”)并将(或双击右下角)向下拖动到您的最后一个值(因此,您有48个栖息地,直到单元格D48)。现在,像素数位于您所栖息的相应单元格中,您可以对所有多边形重复此过程。


2

如何使用QGIS(“ 栅格”>“转换”>“多边形”),然后使用“联合”功能(“ 向量”>“地理处理工具”>“联合”)将CORINE数据转换为矢量多边形数据集,以与多边形组合。所得的矢量数据集将包含每个多边形中每个CORINE类的面积。


感谢您的建议。尚未考虑向量联合。如果R处理由于某种原因失败了,也许我会尝试一下。
库里

0

QGIS。

在QGIS中继中,还有另一个可用的ZonalStats版本,称为Zonal Statistics。

这将执行您需要的功能。

至于工作流程,我不清楚您有多少个栅格,或者它们只是栅格中的带状?


感谢您的评论,但Zonal Statistics只吃没有类别的栅格。Iam使用QGIS Trunk 1.9
Curlew 2012年

0

与上述大多数答案相反,我认为更好的选择是对多边形进行栅格化,而不是使用两个栅格数据集而不是两个多边形数据集。这要少得多的处理强度,因此是在R中处理大栅格和大多边形文件的唯一易于实现的解决方案。

将多边形栅格化到与栅格数据完全相同的程度和分辨率之后,您可以按此处说明的方式将汇总统计信息制成表格,如果栅格适合内存(中/小型栅格图层),或者可以使用reclass函数对每个类别进行二值化,则这是适当的然后计算zonal每个类别的统计信息。是一个将栅格化和区域统计信息合并到一个函数中的解决方案,并且可以很好地处理非常大的数据集。

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.