使用QGIS根据属性值在多边形内创建规则间隔的点?


11

我有一个附加了属性值的多边形层,该属性值表示多边形内的个体数。我正在使用QGIS 3.0。

我需要将计数可视化为多边形内部的点网格(即1个点= 100只青蛙,以实物着色)。这些点不必一定要占据整个多边形,而最好以预先定义的间距(即300 m)围绕质心绘制,以便它们可以以特定的分辨率表示整齐的网格。

我发现的当前解决方法是使用带有counts参数的“规则点”在地图上绘制的范围内创建网格,然后删除算法创建的多余点(算法四舍五入为网格,您可能会得到20点而不是17点输入)。这将产生所需的结果,但需要为每个多边形绘制规则点的面积范围,以及手动输入属性和清理所创建的点。此外,由于我运行的是指定计数的“常规点”,而不是间隔,因此每个多边形会获得不同间隔的点。

简而言之:每个多边形(批处理)的常规点(定义的点数,绘制范围)>删除多余的点>将属性值分配给#个点

替代方法(避免不规则间距,但需要更多操作):

整个图层范围内的规则点(定义的间距,即300m)>裁剪到多边形范围>删除每个多边形中的多余点,直到获得所需的点数>将属性值分配给点。

解决方法的主要问题是逐个多边形处理,这使得更新数据和处理大量多边形变得困难。

有人问类似的问题,即在QGIS中在多边形内创建规则间隔的,已定义的点数,但具体情况有所不同。

所需结果的屏幕截图:

属性表L:


1
问题中的图像是否代表您期望得到的结果?彩色点数从何而来?您可以添加图层的属性表吗?尤其是包括Edmonton和Sherwood Park在内的多边形的属性,可以更好地理解颜色和数量。
卡迪尔·沙哈巴兹(KadirŞahbaz)

1.这只是被遮罩的数据,与实际的多边形没有多大关系,但是,是的,我希望得到那种结果,但是点围绕多边形的中心。2.计数来自属性表列,因为我将点的类型分为三列/类型,我将它们汇总到一列中,以便首先获得每个多边形的正确点数,然后使用表达式分配属性/颜色。编辑:问题添加了excel表,不代表值,但代表我的数据的结构。
罗斯兰

Answers:


5

QGIS 3在群集渲染器中带有一种称为“网格”的新置换方法。看起来这几乎是您所需要的。只需在多边形的质心处创建所需的点数即可。

在此处输入图片说明

我不知道仅使用gui工具生成点的方法,但是相对简单的python脚本应该可以做到这一点。

with edit(point_layer):
    for polygon_feature in polygon_layer.getFeatures():
        point_feature = QgsFeature(point_layer.fields())
        point_feature.setGeometry(polygon_feature.geometry().centroid())

        point_feature['type'] = 'Frog'
        for i in range(polygon_feature['Frogs']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Cat'
        for i in range(polygon_feature['Cats']):
            point_layer.addFeature(point_feature)

        point_feature['type'] = 'Diplodoc'
        for i in range(polygon_feature['Diplodocs']):
            point_layer.addFeature(point_feature)

如果您想发疯,请将其包装在自定义处理算法中。


感谢Matthias,这似乎比其他解决方案还要好。您能建议一种基于属性表快速创建所需的点数的方法吗?
Ruslan

除了编写一些python脚本之外,我不知道一种简单的方法。该代码完全未经测试,因此可能会有一些错别字;)
Matthias Kuhn

再次感谢。我可能必须对许多层/范围等进行类似的可视化处理,因此我将尝试为此至少构建一个处理模型。
罗斯兰

5

萨拉(Sarth SRK)的答案可能是另一种启发人的方式:

  1. 多边形质心
  2. 使用带有正方形的表达式并根据您的比例调整的缓冲区:即(1000 *(sqrt(“ Frogs” +“ Cats” +“ Diplodocs”)/ 2))+ 1和Segment = 1,End cap style = Square
  3. 间距与缓冲区比例一致的新网格点。
  4. 删除点不与缓冲层相交(按位置选择)
  5. 按位置加入属性(缓冲区或原始多边形的属性)

但是,您将拥有这样的东西 在此处输入图片说明

  1. 使用à图形建模器使用命令“ @row_number”创建一个新字段 在此处输入图片说明

  2. 通过缓冲层上的迭代执行模型 在此处输入图片说明

  3. 合并所有新层

  4. 删除ID_pt字段大于字段总和的所有点(“青蛙” +“猫” +“ Diplodocs”)

  5. 按规则分类(即
    • “ ID_pt” <=“青蛙”
    • “ ID_pt”>“ Frogs”和“ ID_pt” <=(“ Cats +” Frogs“)
    • “ ID_pt”>(“猫” +“青蛙”)和“ ID_pt” <=(“猫” +“青蛙” +“ Diplodocs”) 在此处输入图片说明

谢谢你!我今天没有时间尝试此操作,但是考虑到您希望得到的输出,这似乎是一个可行的解决方案。
Ruslan

1

您可以为此使用几何生成器。

  1. 在符号中添加3个子层,每种颜色/属性一个。
  2. 创建一个表达式,为每个子层生成一个多面体。
  3. 现在,最困难的部分是根据属性为多面生成方形部分。我想这将需要一个自定义的python表达式函数。
  4. 可选,使用渲染变量进行地图缩放以确定多边形和间距的缩放比例。

抱歉,我现在很忙,无法提供完整的答案,但是尝试从此处食谱中烹制一些东西将是一个非常有趣的挑战。也许有人会基于此为我们提供一个不错的解决方案。
Matthias Kuhn,

1

一种解决方案是创建一个在每个多边形的质心处具有点的点层。例如,您在Edmonton的质心处有25个叠加点:5个具有青蛙属性,20个具有cat属性,0个具有diplodocs。

然后,使用将Placement方法设置为网格的点位移渲染器,您应该能够获得效果。

困难在于创建点层。


0

一个非常简单的替代方法是使用图层属性中可用的饼图?属性和大小可以由表达式决定。

在此处输入图片说明


2
我很了解映射数据的其他方法。问题的关键是使可视化工作流程成为可能。饼图并没有真正起作用,因为当您查看表格时,您会非常了解个人人数。试图从饼图中估计每个多边形的精确个体计数几乎是不可能的。
Ruslan

0

您可以在从多边形质心开始的螺旋路径上生成点。以下Stack Overflow帖子提供了可创建等距点的python代码,但由于我缺乏空闲时间,因此目前无法对其进行测试。


似乎足够接近,但是正如问题中提到的那样,我不足以编写此代码/更改那里建议的代码。
Ruslan

希望有人有足够的知识和时间将插入内容。
Techie_Gus

0

就你而言

  1. 使用给定的距离为整个AOI创建规则间隔的点
  2. 为所有多边形(输入)创建质心点。
  3. 创建缓冲区用于使用质心点固定距离缓冲器值“1”。它将创建正方形缓冲区而不是圆形(如果要旋转缓冲区多边形,请在Qgis中使用旋转工具)。
  4. 使用矢量->研究工具->按位置选择(多边形规则中的点),可以创建位于缓冲区多边形内的点的选择。
  5. 切换选择和删除缓冲区多边形外部的点。所以现在您得到了围绕多边形质心的规则间隔的点。
  6. 为整个点提供多数属性,其余点需要手动分类。使用QuickMultiAttributeEdit工具可以轻松更新属性。

谢谢,这似乎减少了处理步骤,但这并不能解决需要手动选择的问题(多边形内的缓冲区的大小相同,即每个多边形的点数相同),删除和属性化了每个点多边形,这是我和我的工作流程的主要问题。
Ruslan
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.