在QGIS中创建随机点多边形填充符号系统?


9

使用QGIS 2.18.3,我想对我的多边形符号系统应用随机点模式。默认的样式管理器具有规则间隔的点模式,称为Cemetery-25-50k(请参见下图)。这是一个很好的起点,但显然不是随机的。

在此处输入图片说明

另外,我已经检查了“图层属性”(如下)中的“点图案”填充选项,但是没有任何东西会生成随机图案。

在此处输入图片说明

我需要重新创建的是ESRI Arcmap随机点符号系统,如下所示:

在此处输入图片说明


一种可能性(允许对随机性进行更多控制,并且还使用树之类的缩写符号)是使用inkscape创建SVG(使用具有随机性的平铺克隆),并使用SVG填充。
史蒂文·凯

Answers:


12

您可以使用以下步骤添加随机点符号:

  1. 使用“ +”按钮添加新的符号层:

在此处输入图片说明

  1. 将符号图层类型更改为“点图案填充”
  2. 在左侧树中突出显示“点图案填充”
  3. 将水平和垂直距离更改为合理的值。在此示例中,我为两个距离选择了相同的值2.0
  4. 在水平位移和垂直位移下,使用以下功能:

    5.1对于水平位移:

    randf(3,5) 

    5.2垂直位移

    randf(2,4) 
  5. 复制点图层,并将水平和垂直距离分别更改为6和3。在水平位移和垂直位移下,使用以下功能:

    6.1对于水平位移:

    randf(0,1) 

    6.2对于垂直位移

    randf(1,2) 
  6. 您需要将符号大小减小到2 Pixels

您可以在下图中看到输出:

在此处输入图片说明

在作曲家中,图例将如下所示:

在此处输入图片说明


2
它并不能完全复制内置Arc符号系统的随机性,但这是一个不错的解决方案。要增加随机性,请在水平和垂直距离上使用randf()函数,并将填充重复几次。
Ed Rollason

1
@EdRollason谢谢您的评论。用randf()函数添加几层也是一个好主意。
ahmadhanb

1
@ahmadhanb有趣的解决方案,已添加书签!
mgri

2

另一种技术涉及使用InkScape创建SVG,并在QGIS中使用SVG填充层。

它可以更好地控制符号系统(例如,您可以绘制随机散布的树,而不仅仅是点),还可以更好地控制间距

  • 在Inkscape中,绘制一个圆/树,然后选择对象
  • 编辑>克隆>平铺的克隆
  • 创建(说)5 x 5或10x10平铺克隆。保持网格较小是一个好主意,因为如果符号过多,QGIS将会遇到困难。
  • 在Shift选项卡中,选择类似的内容...使用默认设置是可以的,但是请更改Randomise设置以添加“抖动”。

尝试设置,Remove如果效果不好,您可以随时单击。

在此处输入图片说明

  • 点击Create
  • 使用选择所有平铺的克隆 CtrlA
  • CtrlShiftD 调出文件属性
  • 选择调整页面大小以进行绘图或选择
  • 另存为SVG,但请确保使用简单的SVG格式
  • 现在将QGIS作为SVG符号填充。

这是我在其中随机制作一个5 x 5个QGIS内置树的副本的网格。通过试验间距和抖动,您可以得到不同的外观。您还可以尝试使用QGIS的“ 水平位移”。通过将其设置为水平距离的一半,可以破坏“平铺”的外观(给墙上的砖块一样的图案)

在此处输入图片说明


0

刚刚找到了经过一些调整的在线脚本,该脚本可以与qgis 3.5.x一起使用

我丢掉了原来的帖子,所以不能相信作者。

您要做的是:

  • 创建填充层,将其更改为“几何生成器”
  • 将“几何类型”更改为点
  • 对于表达式,请单击文本字段右侧的“ sigma”按钮
  • 在“表达式对话框”窗口中,将选项卡更改为“函数编辑器”,并将代码粘贴到此处
  • 现在回到“表达式对话框”,粘贴函数调用,如下所示:fillGrid(0.001,0.001,1)(前两个值是随机大小)
  • 保存更改并更新视图。
  • 很棒的随机点在那里。

感谢脚本的原始作者。

from qgis.core import *
from qgis.gui import *
import math
import random

"""
Define a grid based on the interval and the bounding box of
the feature. Grid will minimally cover the feature and be centre aligned

Create a multi-point geometry at the grid intersections where
the grid is enclosed by the feature - i.e. apply a clipping mask

Random value determines amount of randomness in X/Y within its
grid square a particular feature is allowed to have
"""
@qgsfunction(args='auto', group='Custom')
def fillGrid(xInterval, yInterval, rand, feature, parent):
  box = feature.geometry().boundingBox()

  #Create a grid that minimally covers the boundary
  #using the supplied intervals and centre it
  countX = math.ceil(box.width() / xInterval)
  countY = math.ceil(box.height() / yInterval)

  #Align the grid
  gridX = countX * xInterval
  gridY = countY * yInterval
  dX= gridX - box.width()
  dY= gridY - box.height()
  xMin = box.xMinimum() - (dX/2)
  yMin = box.yMinimum() - (dY/2)

  points = []
  #+1 to draw a symbol on the n+1th grid element
  for xOff in range(countX+1):
    for yOff in range(countY+1):

      ptX = xMin + xOff*(xInterval) + rand * random.uniform(0,xInterval)
      ptY = yMin + yOff*(yInterval) + rand * random.uniform(0,xInterval)

      pt = QgsPointXY(ptX,ptY)
      point = QgsGeometry.fromPointXY(pt)
      if feature.geometry().contains(point):
        points.append(pt)

  return QgsGeometry.fromMultiPointXY(points)
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.