Criando simbologia de preenchimento de polígono de ponto aleatório no QGIS?

9

Usando o QGIS 2.18.3, gostaria de aplicar um padrão de ponto aleatório à minha simbologia de polígono. O Style Manager padrão possui um padrão de pontos com espaçamento regular , chamado Cemetery-25-50k (veja a imagem abaixo). Este é um bom ponto de partida, mas obviamente não é aleatório.

insira a descrição da imagem aqui

Como alternativa, revi as opções de preenchimento do padrão de ponto nas propriedades da camada (abaixo), mas nada aparece que geraria um padrão aleatório.

insira a descrição da imagem aqui

O que eu preciso recriar é a simbologia de ponto aleatório ESRI Arcmap, mostrada aqui:

insira a descrição da imagem aqui

Stu Smith
fonte
uma possibilidade (que permite mais controle sobre a aleatoriedade e também usar símbolos abreviados como árvores) é usar o inkscape para criar um SVG (usando clones lado a lado com aleatoriedade) e usar um preenchimento SVG.
21417 Steven

Respostas:

12

Você pode adicionar simbologia de ponto aleatório usando as seguintes etapas:

  1. Adicione nova camada de símbolo usando o botão '+':

insira a descrição da imagem aqui

  1. Altere o tipo de camada Símbolo para 'Preenchimento de padrão de ponto'
  2. Destaque 'Preenchimento de padrão de ponto' na árvore do lado esquerdo
  3. Altere as distâncias horizontal e vertical para valores razoáveis. Neste exemplo, escolhi o mesmo valor para as duas distâncias de2.0
  4. Em deslocamento horizontal e deslocamento vertical, use as seguintes funções:

    5.1 Para deslocamento horizontal:

    randf(3,5) 

    5.2 Para deslocamento vertical

    randf(2,4) 
  5. Duplique a camada de ponto e altere as distâncias horizontal e vertical para 6 e 3, respectivamente. Em deslocamento horizontal e deslocamento vertical, use as seguintes funções:

    6.1 Para deslocamento horizontal:

    randf(0,1) 

    6.2 Para deslocamento vertical

    randf(1,2) 
  6. Você precisa reduzir o tamanho do símbolo para 2 Pixels

Você pode ver a saída na seguinte imagem:

insira a descrição da imagem aqui

No compositor, a legenda será assim:

insira a descrição da imagem aqui

ahmadhanb
fonte
2
Não duplica completamente a aleatoriedade da simbologia de arco integrada, mas é uma boa solução. Para aumentar a aleatoriedade, use a função randf () nas distâncias horizontal e vertical e duplique o preenchimento várias vezes.
precisa saber é o seguinte
11
@EdRollason Obrigado pelo seu comentário. Também é uma boa idéia adicionar várias camadas com a função randf ().
ahmadhanb
11
@ahmadhanb Solução interessante, marcada!
MGRI
2

outra técnica envolve o uso do InkScape para criar um SVG e o uso de uma camada de preenchimento SVG no QGIS.

Permite mais controle sobre a simbologia (por exemplo, você pode desenhar árvores espalhadas aleatoriamente, não apenas pontos) e mais controle sobre o espaçamento

  • No Inkscape, desenhe um círculo / árvore e selecione o objeto
  • Editar> Clone> Clones lado a lado
  • Crie (digamos) 5 x 5 ou 10x10 clones lado a lado. É uma boa idéia manter o tamanho da grade pequeno, pois o QGIS terá problemas se você tiver muitos símbolos.
  • Na guia Shift, escolha algo como isto ... use as configurações padrão como ok, mas altere a configuração Randomise para adicionar 'jitter'.

Experimente as configurações. Você sempre pode clicar Removese o resultado não for bom.

insira a descrição da imagem aqui

  • Clique em Create.
  • Selecione todos os clones lado a lado usando CtrlA
  • CtrlShiftD para abrir propriedades do documento
  • Selecione Redimensionar página para desenho ou seleção
  • Salve como SVG, mas use o formato SVG simples
  • Agora, traga para o QGIS como um preenchimento de símbolo SVG.

Aqui está uma onde eu fiz uma grade aleatória de 5 x 5 cópias de uma das árvores integradas do QGIS. Ao experimentar espaçamento e tremulação, você pode obter visuais diferentes. Você também pode experimentar o deslocamento horizontal do QGIS . Ao definir isso para metade da distância horizontal, ele quebra a aparência "lado a lado" (dando um padrão como tijolos na parede)

insira a descrição da imagem aqui

Steven Kay
fonte
0

Acabei de encontrar um script online que, com alguns ajustes, funciona com o qgis 3.5.x

Perdi o post original, então não posso creditar o autor.

O que você faz é:

  • criar camada de preenchimento altere-o para "gerador de geometria"
  • alterar "tipo de geometria" para pontos
  • para a expressão, clique no botão "sigma" à direita do campo de texto
  • na guia "janela da expressão", mude para o "Editor de funções" e cole o código abaixo
  • Agora, de volta ao "diálogo de expressão", cole a chamada de função assim: fillGrid (0.001,0.001,1) (os 2 primeiros valores são do tamanho aleatório)
  • Salve as alterações e atualize a visualização.
  • Pontos aleatórios impressionantes estão lá.

Agradecimentos ao autor original do roteiro.

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)
MichałKraków
fonte