Membuat poin acak di sepanjang polyline di QGIS?


11

Saya mencoba membuat titik acak di sepanjang polyline shapefile di QGIS. Pada dasarnya, seperti alat 'titik acak' dalam 'alat penelitian' tetapi untuk polyline dan bukan poligon.

Saya telah mencoba mengonversi file baris ke bentuk poligon, tetapi mengisi beberapa area dengan poligon, sedangkan area lain tetap menggunakan poligon tipe garis panjang.

Saya cukup baru di QGIS, dan saya tidak terlalu mengenal kode Python.


Jika Anda ingin masuk ke R, paket spatstat memiliki alat untuk membuat titik acak pada garis.
Micha

Terima kasih untuk kodenya. Saya bertanya-tanya apakah seseorang dapat membantu saya memodifikasinya sehingga menempatkan titik pada garis dengan interval spasi reguler dengan awal yang acak? Itu akan sangat dihargai. Saya tidak memiliki pengetahuan tentang python.

Jawaban:


14

Kode ini akan bekerja pada pengembangan dev terbaru QGIS.

from qgis.utils import iface
from qgis.core import *
from PyQt4.QtCore import QVariant
import random

def createRandomPoints(count):       
    # Create a new memory layer to store the points.
    vl = QgsVectorLayer("Point", "distance nodes", "memory") 
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = iface.mapCanvas().currentLayer()

    # For each selected object
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        length = geom.length()
        feats = []
        # Loop until we reach the needed count of points.
        for i in xrange(0,count):
            # Get the random distance along the line.
            distance = random.uniform(0, length)
            # Work out the location of the point at that distance.
            point = geom.interpolate(distance)

            # Create the new feature.
            fet = QgsFeature()
            fet.setAttributeMap( { 0 : distance } )
            fet.setGeometry(point)
            feats.append(fet)

        pr.addFeatures(feats)
        vl.updateExtents()  

    QgsMapLayerRegistry.instance().addMapLayer(vl)

Saya tahu Anda mengatakan Anda tidak terlalu terbiasa dengan kode Python tetapi Anda harus dapat menjalankan ini dengan cukup mudah. Salin kode di atas ke dalam file (milik saya disebut locate.py) dan letakkan di Anda ~/.qgis/pythonjika Anda berada di Windows 7 yang akan berada di C:\Users\{your user name}\.qgis\python\atau di Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Setelah file ada di folder python buka QGIS dan pilih beberapa objek garis.
Pemilihan layer

Kemudian buka konsol Python dan jalankan kode berikut:

import locate.py 
locate.createRandomPoints(10)

Konsol Python

Hasilnya akan terlihat seperti ini

Hasil

Jika Anda ingin menjalankannya kembali cukup pilih beberapa baris lagi dan jalankan locate.createRandomPoints(10)di konsol Python lagi.

Catatan: temukan.createRandomPoints (10) 10 di sini adalah jumlah poin yang akan dihasilkan per baris


Terima kasih atas seluruh bantuan Anda! Saya tidak yakin dalam format apa untuk menyimpan kode - bagaimana cara menjadikannya file dengan ekstensi py? Maaf jika ini adalah pertanyaan yang cukup mendasar.
Cec.g

Salin teks ke file teks normal dan simpan saja dengan .py sebagai ekstensi.
Nathan W

Saya memang mencobanya tetapi muncul dengan kesalahan ini: ImportError: Tidak ada modul bernama loc.py
Cec.g

Ini adalah path file: C: \ Users \ Cecily \ .qgis \ python
Cec.g

apakah Anda menggunakan import locatetidak perlu untuk .py di konsol Python.
Nathan W

3

Anda dapat menyangga polylines (minimal) dan kemudian menjalankan pengambilan sampel pada poligon yang dihasilkan. Ini bisa bekerja dengan baik jika Anda tidak memiliki faktor pembatas lain, misalnya. pada jarak antar titik minimum, kepadatan atau semacamnya.

Untuk kasus yang lebih rumit, saya akan membuat sampel acak yang jauh lebih padat dan kemudian memilih yang tepat (apa pun itu) poin dalam langkah kedua. Hal serupa dapat dilakukan dengan alat densify, tetapi semua poin akan ada di polyline.

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.