Створення символіки заповнення випадкових точок у QGIS?


9

Використовуючи QGIS 2.18.3, я хотів би застосувати випадкову точкову схему до моєї багатокутної символіки. Типовий менеджер стилів має регулярно розподілений точковий візерунок, який називається Cemetery-25-50k (див. Зображення нижче). Це хороша відправна точка, але, очевидно, не випадкова.

введіть тут опис зображення

Крім того, я переглянув параметри заповнення шаблону точок у Властивості шару (внизу), але нічого, що могло б створити випадковий шаблон, не з’явиться.

введіть тут опис зображення

Що мені потрібно відтворити, це символічна точкова символіка Arcmap ESRI, показана тут:

введіть тут опис зображення


одна з можливостей (яка дозволяє більше контролювати випадковість, а також використовувати атрибутивні символи, як дерева) - використовувати Inkscape для створення SVG (з використанням кахельних клонів із випадковістю) та використання заливки SVG.
Стівен Кей

Відповіді:


12

Можна додати випадкову символіку точок, виконавши наступні кроки:

  1. Додайте новий шар символів за допомогою кнопки "+":

введіть тут опис зображення

  1. Змініть тип шару Symbol на "Заповнення шаблону точок"
  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
Це не зовсім повторює випадковість вбудованої символіки дуги, але це приємне рішення. Щоб збільшити випадковість, використовуйте функцію randf () на горизонтальній та вертикальній відстанях, а також повторюйте заливку кілька разів.
Ед Ролласон

1
@EdRollason Дякуємо за ваш коментар Також непогано додати кілька шарів за допомогою функції randf ().
ахмадханб

1
@ahmadhanb Цікаве рішення, закладки!
mgri

2

інша методика передбачає використання InkScape для створення SVG та використання шару заливки SVG у QGIS.

Це дозволяє більше контролювати символіку (наприклад, ви можете намалювати навмання розкидані дерева, а не лише точки) та більше контролю над інтервалом

  • У Inkscape намалюйте коло / дерево та виберіть об’єкт
  • Правка> Клон> Черепичні клони
  • Створіть (скажімо) 5 х 5 або 10x10 кахельні клони. Хороша ідея, щоб розмір сітки був невеликим, оскільки QGIS буде боротися, якщо у вас занадто багато символів.
  • На вкладці Shift виберіть щось подібне ... використовувати налаштування за замовчуванням нормально, але змініть параметр Randomise , щоб додати "тремтіння".

Експериментуйте з налаштуваннями, ви завжди можете натиснути, Removeякщо результат не гарний.

введіть тут опис зображення

  • Клацніть Create.
  • Виберіть усі клонові клони за допомогою CtrlA
  • CtrlShiftD виховувати властивості документа
  • Виберіть Сторінка розміру до креслення або вибору
  • Збережіть як SVG, але обов'язково використовуйте простий формат SVG
  • Тепер введіть QGIS як заповнення символу SVG.

Ось один, де я зробив випадкову сітку розміром 5 х 5 копій одного з вбудованих дерев QGIS. Експериментуючи з інтервалом і тремтінням, ви можете отримати різний вигляд. Ви також можете експериментувати з горизонтальним переміщенням QGIS . Встановивши, що на половину горизонтальної відстані, він розбиває "кахельний" вигляд (надаючи візерунок, як цегла в стіні)

введіть тут опис зображення


0

Щойно знайшли онлайн-скрипт, який з деякими налаштуваннями працює з qgis 3.5.x

Я втратив оригінальну публікацію, тому не можу почитати автора.

Що ви робите:

  • створити шар заливки, змінити його на "генератор геометрії"
  • змінити "тип геометрії" на точки
  • для виразу натисніть кнопку "сигма" праворуч до текстового поля
  • на вкладці зміни вікна "діалог виразів" перейдіть до "Редактора функцій" і вставте код нижче
  • Тепер поверніться до діалогу "виразів", вставте виклик функції так: fillGrid (0,001,0.001,1) (перші 2 значення - випадковий розмір)
  • Збережіть зміни та оновіть подання.
  • Дивовижні випадкові точки є.

Завдяки оригінальному автору сценарію.

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.