从QGIS中的加权点生成密度图的最佳方法是什么?


18

我真的很想重复ArcGIS Kernel Density工具的功能-我该怎么做?

我想将答案限制在易于安装的免费和开源软件上,即QGIS可以在所有平台上轻松地通过GRASS进行安装,因此QGIS + GRASS可以,但是SAGA不能(不幸的是,因为它具有是理想的工具)。

我正在尝试制作QGIS保护区内的野生动物密度图。以下示例中的密度图是在ArcGIS中根据野生动植物的点观测生成的,原始大小的组大小(矢量文件中的字段)用于加权内核密度(SpatialAnalyst)工具中每个网格单元的密度,选定的搜索半径和网格像元大小:

Kafue国家公园内的野生动物密度为5x5 km的网格单元和7.5 km的半径内核密度

在先前关于密度的问题中,建议使用GRASS v.kernel工具来模仿ArcGIS Kernel Density工具,但是v.kernel不能完成相同的工作。看完手册并(成功地)生成密度图后,似乎v.kernel函数仅适用于点密度,并且没有机会为每个点提供变量(例如原始计数)以加权每个点。

更新

*.surf.*GRASS中似乎有各种工具可以帮助创建密度曲面-并且这些工具确实接受加权列或z值,或者在栅格上执行。@underdark建议v.surf.rst-“ zcolumn”将是我的权重(计数)变量-但我不知道如何要求该工具创建特定的网格大小或使用特定的半径。

有关如何使用v.surf.rst或其他任何方法的建议?


样本数据

x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0

您能否进一步描述输入数据?也许v.surf.rst比v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html更合适。上面显示的每个网格单元是否有一个计数值?
昏暗

@underdark-添加了一些示例数据。它是带有计数(看到的大象数量)的点数据,每个网格单元可以有多个观测值。通常,在ArcGIS中,“计数”将成为内核密度工具的“填充”字段。
Simbamangu '11年

我考虑得越多,就越不相信v.kernel是您的用例的好选择。你检查文献了吗?也许首先要问一个问题,在这种情况下哪种方法合适。
黑暗

我的主要问题是如何从Arcview中重复内核密度的功能,这是一种已知方法。没错,v.kernel几乎肯定不是执行此操作的正确工具!
Simbamangu

@underdark,谢谢-我将问题扩展了一些,可能会有帮助;v.surf.rst看起来确实合适,但是可以使用一些指导。
Simbamangu 2012年

Answers:


8

根据其手册页,GRASS命令r.resamp.filter将与表示点数据的栅格完全一样,而ArcGIS将对点图层进行处理:将filter=box选项用于“简单”栅格,并将filter=gauss选项用于其他ArcGIS内核。使用该-n标志可避免传播空值。


请注意,内核密度估计值(也称为“热图”)不是数据的插值。 位置x处的KDE值估计x附近每单位面积的值“ Z ” 。(半径或“带宽”量化了“附近”的含义。)不需要在地图上的每个可能位置都定义Z的值。例如,Z可能表示某物(例如人)的存在,在这种情况下,KDE给出了人口密度Z的值也不需要在整个地图上连续变化。对于插值,它是假定ž在所有位置定义,并且数据是在指定点处Z值的观测值。内插器尝试在所有其他点上预测Z的未观测值。当Z是温度或压力时,这将是有意义的,但是当Z记录某物的存在或数据是完整的普查时,这通常是无意义的。(在后一种情况下,请考虑某个地区的道路密度图可能意味着什么,以及如何理解跨非道路区域的“插值”道路。)


我的GRASS工具箱中似乎没有r.resamp.filter(在OS X上为GRASS 6.4)。但是,直到您提到它,我才意识到“热图”与KD是同一回事。我以为它们是对整个表面进行插值。QGIS中的Raster | Heatmap工具可以做KD吗?什么是“衰减率”?
Simbamangu '11

我认为,“热图”一词已在GIS中从其原始含义中被选为可以普遍且含糊地指代几乎所有类似栅格的地图。我怀疑任何GIS都提供与原始含义相匹配的功能。
ub

经调查,如果将衰减比设置为0(将半径的边缘处的密度减小为0),则QGIS中的热图工具会执行与Arc中的KD类似的操作。似乎存在一些差异:计算的像元值高出25倍(半径为5km /像元为2.5km),以及该函数应用于像元的方式-Arc似乎使用围绕实际点的半径,而QGIS选择重叠的像元然后从那一点逐渐缩小。
Simbamangu '11年

2
常用的“热度图”似乎有很多含义-环顾四周,我发现它适用于插值曲面,内核密度以及非平滑像素的简单着色。关于原始用法/历史的有趣文章-似乎我们应该在标记QGIS工具时使用更精确的术语。
Simbamangu 2012年

3
@Simbamangu r.resamp.filter是GRASS 7中的新增功能,但是OS X每月都有快照。另外,热图工具似乎并未为密度分布算法提供选择,因此,我认为它并不完全等同于内核密度或r.resamp.filter。
Torsti 2012年

3

您正在寻找SAGA的模块“内核密度估计”。

在QGIS中安装SAGA Module接口(在菜单中:Plugins-> Fetch Python plugins ..)并使用该模块。祝好运!


我本来希望使用SAGA,但我正在OSX 10.7中工作,但尚未成功构建它(OSX没有二进制文件)。最近,我花了数小时尝试了多种编译方法,但构建始终失败。
Simbamangu '11年

然后,您必须问有关OSX 10.7上SAGA编译的问题。正如我所见,SAGA是ArcGIS KD工具的唯一合理替代品。
弗拉基米尔

3

使用GRASS GIS的一种非常简单的方法,它比内核密度更接近ArcMap中的点密度:

  1. r.in.xyz使用method = sum以指定的栅格分辨率(通过设置g.region)将点导入栅格地图。

  2. 用于使用r.neighborsmethod = average(默认值)对地图进行平滑处理,并使用选项大小设置搜索半径。

(我目前无法访问GRASS,因此我实际上没有尝试过!)


v.in.xyz并且v.neighbors可能也可以。该手册未指定您如何设置使用哪个属性v.neighbors
Torsti 2012年

2

当您要求获得有关v.surf.rst的更多指南时,以下是我的意见

首先,关于栅格大小-您可以使用插件-> GRASS->编辑当前GRASS区域并设置输出分辨率。来自v.surf.rst的输出将具有该分辨率。

对于半径,“张力”似乎是参数。我不是该算法的专家,但请阅读手册,这似乎与之相关

“ ...高张力“增加点之间的距离”并减小每个点的影响范围,低张力“减小距离”,并且点在更长的范围内相互影响)。

因此,可以像使用radius参数那样大致使用张力参数。

从您的样本数据来看,v.surf.rst的结果如下所示,由于它使用计数作为权重进行插值,因此看起来是合理的

在此处输入图片说明


1
谢谢您-比帮助页面更容易理解。如上文@whuber所指出的那样,对于这种类型的点样本数据,插值并不是正确的方法。
Simbamangu '11年

2

尽管我尚未对其进行测试,但在QGIS Contributors存储库中有一个名为“带有R的住宅范围估算”的插件。这包括内核(密度?)计算。我认为,如果可行,这将是最好的方法。R将执行计算核密度的真实统计方法。

如果您已经安装了R,则应该能够安装插件并开始使用。


1

如果您接受在qgis之外进行一些Java编程,则可以简单地使用此密度图构建器库

使用构造函数HeatMapBuilder(int w, int h, int[][] pts, int[] weights),可以根据需要为每个点赋予权重。可以使用getImage()方法检索输出图像,并使用将该图像保存在磁盘上ImageIO.write("mymap.png")

这是输出示例:

Opencarto Java库的热图

可以更改平滑强度和调色板。

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.