การสร้างสัญลักษณ์เติมหลายเหลี่ยมแบบสุ่มใน QGIS?


9

ใช้ QGIS 2.18.3 ฉันต้องการใช้รูปแบบจุดแบบสุ่มกับสัญลักษณ์รูปหลายเหลี่ยมของฉัน ตัวจัดการรูปแบบเริ่มต้นมีรูปแบบจุดที่เว้นระยะสม่ำเสมอเรียกว่า Cemetery-25-50k (โปรดดูภาพด้านล่าง) นี่คือจุดเริ่มต้นที่ดี แต่เห็นได้ชัดว่าไม่ได้สุ่ม

ป้อนคำอธิบายรูปภาพที่นี่

อีกวิธีหนึ่งฉันได้ตรวจสอบตัวเลือกการเติมรูปแบบจุดภายในคุณสมบัติเลเยอร์ (ด้านล่าง) แต่ไม่มีอะไรปรากฏที่จะสร้างรูปแบบสุ่ม

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่ฉันต้องสร้างใหม่ก็คือสัญลักษณ์สุ่ม ESRI Arcmap ที่แสดงที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่


ความเป็นไปได้หนึ่งอย่าง (ซึ่งช่วยให้สามารถควบคุมการสุ่มได้มากขึ้นและใช้สัญลักษณ์แบบผิด ๆ เช่นต้นไม้) คือการใช้ inkscape เพื่อสร้าง SVG (ใช้โคลนกระเบื้องที่มีการสุ่ม) และใช้การเติม SVG
Steven Kay

คำตอบ:


12

คุณสามารถเพิ่มสัญลักษณ์จุดสุ่มโดยใช้ขั้นตอนต่อไปนี้:

  1. เพิ่มเลเยอร์สัญลักษณ์ใหม่โดยใช้ปุ่ม '+':

ป้อนคำอธิบายรูปภาพที่นี่

  1. เปลี่ยนประเภทเลเยอร์ Symbol เป็น 'Fill pattern point'
  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 () บนระยะทางแนวนอนและแนวตั้งและทำซ้ำการเติมหลายครั้ง
Ed Rollason

1
@ErRollason ขอบคุณสำหรับความคิดเห็นของคุณ เป็นความคิดที่ดีที่จะเพิ่มหลายเลเยอร์ด้วยฟังก์ชัน randf ()
ahmadhanb

1
@ahmadhanb ทางออกที่น่าสนใจบุ๊คมาร์ค!
mgri

2

อีกเทคนิคที่เกี่ยวข้องกับการใช้ InkScape เพื่อสร้าง SVG และใช้เลเยอร์การเติม SVG ใน QGIS

มันช่วยให้สามารถควบคุมสัญลักษณ์ (เช่นคุณสามารถวาดต้นไม้ที่กระจัดกระจายแบบสุ่มไม่ใช่แค่จุด) และควบคุมระยะห่างได้มากขึ้น

  • ใน Inkscape วาดวงกลม / ต้นไม้และเลือกวัตถุ
  • แก้ไข> Clone> Tiled clones
  • สร้าง (พูด) 5 x 5 หรือ 10x10 โคลนกระเบื้อง เป็นความคิดที่ดีที่จะรักษาขนาดของกริดให้เล็กลงเนื่องจาก QGIS จะต่อสู้หากคุณมีสัญลักษณ์มากเกินไป
  • ในแท็บ Shift เลือกอะไรเช่นนี้ ... ใช้การตั้งค่าเริ่มต้นก็โอเค แต่เปลี่ยนการตั้งค่าแบบสุ่มเพื่อเพิ่ม 'กระวนกระวายใจ'

ทดลองกับการตั้งค่าคุณสามารถคลิกRemoveหากผลลัพธ์ไม่ดี

ป้อนคำอธิบายรูปภาพที่นี่

  • Createคลิก
  • เลือกโคลนกระเบื้องทั้งหมดที่ใช้ CtrlA
  • CtrlShiftD เพื่อแสดงคุณสมบัติของเอกสาร
  • เลือกปรับขนาดหน้าเพื่อวาดหรือเลือก
  • บันทึกเป็น SVG แต่ต้องแน่ใจว่าคุณใช้รูปแบบSimple SVG
  • ตอนนี้นำมาเป็น QGIS ในฐานะสัญลักษณ์เติม SVG

นี่คือตารางที่ฉันสร้างตารางสุ่มขนาด 5 x 5 สำเนาของต้นไม้ในตัว QGIS โดยการทดลองกับระยะห่างและกระวนกระวายใจคุณสามารถดูแตกต่างกัน คุณสามารถทดลองใช้ QGIS ' Horizontal Displacementได้ โดยการตั้งค่าให้ห่างจากแนวนอนครึ่งหนึ่งจะเป็นการแบ่งลักษณะ "ปูกระเบื้อง" (ให้ลวดลายเหมือนอิฐในผนัง)

ป้อนคำอธิบายรูปภาพที่นี่


0

เพิ่งพบสคริปต์ออนไลน์ที่มีการปรับค่าบางอย่างทำงานกับ qgis 3.5.x

ฉันทำโพสต์ต้นฉบับหายไปดังนั้นจึงไม่น่าเชื่อถือผู้แต่ง

สิ่งที่คุณทำคือ:

  • สร้างเลเยอร์การเติมเปลี่ยนเป็น "เครื่องกำเนิดเรขาคณิต"
  • เปลี่ยน "ประเภทรูปทรงเรขาคณิต" เป็นจุด
  • สำหรับนิพจน์ให้คลิกปุ่ม "sigma" ทางด้านขวาของฟิลด์ข้อความ
  • ในแท็บเปลี่ยนหน้าต่าง "นิพจน์โต้ตอบ" เพื่อ "แก้ไขฟังก์ชั่น" และวางรหัสด้านล่างมี
  • ตอนนี้กลับไปที่ "กล่องโต้ตอบนิพจน์" วางการเรียกใช้ฟังก์ชันดังนี้: 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.