Membuat simbologi isian titik poligon acak di QGIS?

9

Menggunakan QGIS 2.18.3, saya ingin menerapkan pola titik acak ke simbologi poligon saya. Manajer Gaya default memiliki pola titik spasi-teratur , yang disebut Cemetery-25-50k (harap lihat gambar di bawah). Ini adalah titik awal yang baik, tetapi jelas tidak acak.

masukkan deskripsi gambar di sini

Atau, saya telah meninjau opsi isian Pola Titik dalam Properti Lapisan (di bawah), tetapi tidak ada yang muncul yang akan menghasilkan pola acak.

masukkan deskripsi gambar di sini

Apa yang saya perlukan untuk membuat ulang adalah simbologi titik acak ESRI Arcmap, yang diperlihatkan di sini:

masukkan deskripsi gambar di sini

Stu Smith
sumber
satu kemungkinan (yang memungkinkan lebih banyak kontrol atas keacakan, dan juga menggunakan simbol abritrary seperti pohon) adalah menggunakan inkscape untuk membuat SVG (menggunakan klon ubin dengan keacakan), dan menggunakan isian SVG.
Steven Kay

Jawaban:

12

Anda dapat menambahkan simbologi titik acak menggunakan langkah-langkah berikut:

  1. Tambahkan layer simbol baru menggunakan tombol '+':

masukkan deskripsi gambar di sini

  1. Ubah tipe layer Symbol ke 'Point pattern fill'
  2. Sorot 'Pola titik isian' di pohon sebelah kiri
  3. Ubah jarak horizontal dan vertikal ke nilai wajar. Dalam contoh ini, saya memilih nilai yang sama untuk kedua jarak2.0
  4. Di bawah perpindahan Horizontal dan perpindahan vertikal, gunakan fungsi-fungsi berikut:

    5.1 Untuk perpindahan horisontal:

    randf(3,5) 

    5.2 Untuk perpindahan Vertikal

    randf(2,4) 
  5. Gandakan layer titik dan ubah jarak horizontal dan vertikal menjadi masing-masing 6 dan 3. Di bawah perpindahan Horizontal dan perpindahan vertikal, gunakan fungsi-fungsi berikut:

    6.1 Untuk perpindahan horisontal:

    randf(0,1) 

    6.2 Untuk perpindahan Vertikal

    randf(1,2) 
  6. Anda harus mengurangi ukuran simbol menjadi 2 Pixels

Anda dapat melihat output dalam gambar berikut:

masukkan deskripsi gambar di sini

Dalam komposer, legenda akan terlihat seperti ini:

masukkan deskripsi gambar di sini

ahmadhanb
sumber
2
Itu tidak cukup menduplikasi keacakan dari simbologi Arc built-in tapi itu solusi yang bagus. Untuk meningkatkan keacakan, gunakan fungsi randf () pada jarak horizontal dan vertikal dan juga duplikat isian beberapa kali.
Ed Rollason
1
@EdRollason Terima kasih atas komentar Anda. Ini juga merupakan ide bagus untuk menambahkan beberapa layer dengan fungsi randf ().
ahmadhanb
1
@ahmadhanb Solusi menarik, ditandai!
mgri
2

teknik lain melibatkan menggunakan InkScape untuk membuat SVG, dan menggunakan lapisan isi SVG di QGIS.

Ini memungkinkan lebih banyak kontrol atas simbologi (misalnya Anda bisa menggambar pohon yang tersebar secara acak, bukan hanya titik) dan lebih banyak kontrol atas jarak

  • Di Inkscape, gambar sebuah lingkaran / pohon, dan pilih objek
  • Edit> Klon> Klon ubin
  • Buat (katakanlah) 5 x 5 atau 10x10 klon ubin. Merupakan ide bagus untuk menjaga ukuran grid tetap kecil karena QGIS akan kesulitan jika Anda memiliki terlalu banyak simbol.
  • Di tab Shift, pilih sesuatu seperti ini ... gunakan pengaturan default ok, tapi ubah pengaturan Randomise untuk menambahkan 'jitter'.

Eksperimen dengan pengaturan, Anda selalu dapat mengklik Removejika hasilnya tidak bagus.

masukkan deskripsi gambar di sini

  • Klik Create.
  • Pilih semua klon ubin menggunakan CtrlA
  • CtrlShiftD untuk memunculkan properti dokumen
  • Pilih Ubah ukuran halaman untuk menggambar atau memilih
  • Simpan sebagai SVG, tetapi pastikan Anda menggunakan format SVG Sederhana
  • Sekarang bawa ke QGIS sebagai isian simbol SVG.

Inilah salah satu tempat saya membuat grid acak 5 x 5 salinan dari salah satu pohon built-in QGIS. Dengan bereksperimen dengan spasi dan jitter Anda bisa mendapatkan tampilan yang berbeda. Anda juga dapat bereksperimen dengan Pemindahan Horizontal QGIS . Dengan mengatur bahwa untuk setengah jarak horizontal, itu memecah tampilan "ubin" (memberikan pola seperti batu bata di dinding)

masukkan deskripsi gambar di sini

Steven Kay
sumber
0

Baru saja menemukan skrip daring yang dengan beberapa penyesuaian berfungsi dengan qgis 3.5.x

Saya kehilangan posting asli sehingga tidak bisa kredit penulis.

Apa yang Anda lakukan adalah:

  • buat fill layer ubah menjadi "generator geometri"
  • ubah "tipe geometri" menjadi titik
  • untuk ekspresi, klik tombol "sigma" langsung ke bidang teks
  • di jendela "dialog ekspresi", ubah tab menjadi "Editor fungsi" dan rekatkan kode di bawah sana
  • Sekarang kembali ke "dialog ekspresi" tempel panggilan fungsi seperti itu: fillGrid (0.001,0.001,1) (2 nilai pertama adalah ukuran acak)
  • Simpan perubahan dan perbarui tampilan.
  • Poin acak yang mengagumkan ada di sana.

Terima kasih kepada penulis naskah aslinya.

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
sumber