QGISでランダムポイントポリゴンフィルシンボルを作成しますか?


9

QGIS 2.18.3を使用して、ランダムポイントパターンをポリゴンシンボルに適用したいと思います。デフォルトのスタイルマネージャーには、Cemetery-25-50kと呼ばれる規則的な間隔のポイントパターンがあります(下の画像を参照してください)。これは良い出発点ですが、明らかにランダムではありません。

ここに画像の説明を入力してください

または、レイヤープロパティ(下)内のポイントパターンの塗りつぶしオプションを確認しましたが、ランダムパターンを生成するものは何も表示されません。

ここに画像の説明を入力してください

再作成する必要があるのは、次に示すESRI Arcmapランダムポイントシンボルです。

ここに画像の説明を入力してください


1つの可能性(ランダム性をより詳細に制御でき、ツリーのような単純な記号も使用できます)は、inkscapeを使用してSVGを作成し(ランダムなタイルクローンを使用)、SVG塗りつぶしを使用します。
Steven Kay

回答:


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 2017

1
@EdRollasonコメントありがとうございます。randf()関数を使用して複数のレイヤーを追加することもお勧めします。
ahmadhanb 2017

1
@ahmadhanb興味深いソリューション、ブックマーク済み!
mgri

2

別の手法には、InkScapeを使用してSVGを作成し、QGISでSVG塗りつぶしレイヤーを使用することが含まれます。

記号をより詳細に制御でき(たとえば、点だけでなくランダムに散在する木を描くことができます)、間隔をより詳細に制御できます

  • Inkscapeで、円/木を描き、オブジェクトを選択します
  • 編集>クローン>タイルクローン
  • (たとえば)5 x 5または10x10のタイルクローンを作成します。シンボルの数が多すぎるとQGISが苦労するため、グリッドのサイズを小さくしておくことをお勧めします。
  • [Shift]タブで、次のようなものを選択します。デフォルトの設定を使用しても問題ありませんが、Randomise設定を変更して「ジッター」を追加します。

設定を試してみてRemove、結果が良くない場合はいつでもクリックできます。

ここに画像の説明を入力してください

  • をクリックしCreateます。
  • を使用してすべてのタイルクローンを選択します CtrlA
  • CtrlShiftD ドキュメントのプロパティを表示する
  • 図面または選択範囲に合わせてページのサイズを変更を選択します
  • SVGとして保存しますが、必ずSimple SVG形式を使用してください
  • 次に、SVGシンボルフィルとしてQGISに取り込みます。

これは、QGIS組み込みツリーの1つの5 x 5コピーのランダムグリッドを作成したものです。間隔とジッターを試してみると、さまざまな外観を得ることができます。QGISのHorizo​​ntal Displacementを試すこともできます。これを水平距離の半分に設定すると、「タイル状」の外観が崩れます(壁にレンガのようなパターンが与えられます)

ここに画像の説明を入力してください


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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.