Membuat poin di sepanjang garis sesuai dengan data atribut menggunakan QGIS?


9

Saya ingin membuat titik yang sama sepanjang garis dalam QGIS, tetapi masing-masing baris saya memiliki atribut berapa banyak poin harus ada pada mereka dalam kolom yang disebut "bagian" dan nilai-nilai ini berbeda di hampir setiap kasus.

masukkan deskripsi gambar di sini

Pikiran pertama saya adalah untuk membagi garis-garis menjadi potongan-potongan yang sama sesuai dengan nilai-nilai dalam tabel atribut dan kemudian menempatkan poin ke centroid garis tetapi saya tidak bisa melakukannya.

Pertanyaan ini sangat mirip dengan apa yang ingin saya lakukan, tetapi bukan untuk QGIS:

Bagaimana cara membuat jumlah titik yang sama di sepanjang banyak polyline?

Sebagian besar pertanyaan serupa yang dapat ditemukan di sini di stackexchange dalam topik ini adalah tentang jarak spesifik antara titik, angka yang dapat dengan mudah diketik ke dalam bidang (seperti dalam kasus Buat titik di sepanjang garis atau Konversi garis ke titik algoritma) dan tidak tentang data spesifik dari tabel atribut, yang saya tidak dapat menemukan cara menggunakannya untuk tujuan tersebut.

Akan luar biasa jika tidak ada poin tepat di titik awal dan akhir dari garis, tetapi saya akan melewati bulan jika ada banyak poin pada garis seperti pada tabel atributnya.

Jawaban:


10

Berikut ini adalah skrip PyQGIS cepat yang harus melakukan trik

from qgis.core import QgsFeature, QgsVectorFileWriter, QgsGeometry

def create_points(feat,writer):
    geometry = feat.constGeometry()
    if not geometry:
        return
    length = geometry.length()
    # -----------------
    # change 'num_points' to match your field name for the number of points field
    # -----------------
    num_points = feat['num_points']
    delta = length / ( num_points + 1.0 )
    distance = 0.0
    for i in range(num_points):
        distance += delta
        output_feature = QgsFeature(feat)
        output_feature.setGeometry( geometry.interpolate(distance) )
        writer.addFeature(output_feature)

layer = iface.activeLayer()

# ---------------
# change 'd:/test_points.shp' to desired output file name
# ---------------

writer = QgsVectorFileWriter('d:/test_points.shp',None, layer.fields(), QGis.WKBPoint, layer.crs())

for f in layer.getFeatures():
    create_points(f,writer)

del writer

Cukup ganti num_pointsnama bidang dan nama file keluaran untuk mencocokkan data Anda, pilih layer input, dan jalankan di konsol python.


Untuk beberapa alasan, setelah menyalin skrip ini, sebuah pesan kesalahan muncul: File "<input>", baris 1 length = geometry.length () ^ IndentationError: indentent tak terduga
Skye

1
ndawson - Saya telah mengedit format sehingga lebih mudah untuk menyalin / menempel ke konsol python tetapi merasa ragu untuk memutar kembali jika Anda tidak suka =). @ Skye - Saya akan menyarankan menyalin kode ke editor teks, mengubah nama bidang dan jalur output dan kemudian menyalin kode lagi ke konsol python. Semoga tidak ada kesalahan lekukan lagi.
Joseph

1
Terima kasih untuk kalian berdua !! :) ndawson, skrip Anda sangat bagus dan @Joseph, suntingan format Anda sangat membantu! Ditambah lagi ternyata saya seharusnya menggunakan tanda "/" alih-alih "\" di jalur keluaran.
Skye
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.