QGIS'de çoklu hat boyunca rastgele noktalar mı oluşturuyorsunuz?


11

Ben QGIS bir polyline şekil dosyası boyunca rastgele noktalar oluşturmaya çalışıyorum. Temel olarak, 'araştırma araçları'ndaki' rastgele noktalar 'aracı gibi, ancak çokgenler yerine çoklu çizgiler için.

Çizgi dosyasını bir çokgen şekil dosyasına dönüştürmeyi denedim, ancak bazı alanları çokgenlerle doldururken, diğer alanlar uzun çizgi tipi çokgenler olarak kalıyor.

QGIS için oldukça yeniyim ve Python koduna gerçekten aşina değilim.


R'ye girmek istiyorsanız spatstat paketinde çizgiler üzerinde rastgele noktalar oluşturmak için araçlar vardır.
Micha

Kod için teşekkürler. Birisinin rastgele bir başlangıç ​​ile düzenli aralıklarla çizgilere nokta yerleştirmesi için değiştirmeme yardım edip edemeyeceğini merak ediyordum. Çok takdir edilecektir. Python ile ilgili çalışma bilgim yok.

Yanıtlar:


14

Bu kod, QGIS'in en son geliştirici geliştirmesinde çalışacaktır.

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)

Python koduna çok aşina olmadığınızı söylediğinizi biliyorum, ancak bunu oldukça kolay çalıştırabilmelisiniz. Yukarıdaki kodu bir dosyaya kopyalayın (benim adı verilir locate.py) ve ~/.qgis/pythonWindows 7'de C:\Users\{your user name}\.qgis\python\veya Windows XP'de olacaksanız,C:\Documents and Settings\{your user name}\.qgis\python\

Dosya python klasörüne girdikten sonra QGIS'i açın ve bazı çizgi nesnelerini seçin.
Katman seçimi

Ardından Python konsolunu açın ve aşağıdaki kodu çalıştırın:

import locate.py 
locate.createRandomPoints(10)

Python Konsolu

Sonuç böyle bir şey olmalı

Sonuçlar

Tekrar çalıştırmak istiyorsanız, daha fazla satır seçip locate.createRandomPoints(10)Python konsolunda tekrar çalıştırın .

Not: locate.createRandomPoints (10) 10 burada satır başına üretilecek nokta sayısıdır


Yardımların için teşekkür ederim! Kodu kaydetmek için hangi biçimde olsa emin değilim - nasıl py uzantılı bir dosya yapabilirim? Bunlar oldukça basit sorularsa özür dilerim.
Cec.g

Metni normal bir metin dosyasına kopyalayın ve uzantı olarak .py ile kaydedin.
Nathan W

Bunu denedim ama şu hatayla geliyor: ImportError: locate.py adlı bir modül yok
Cec.g

Bu dosya yolu: C: \ Kullanıcılar \ Cecily \ .qgis \ python
Cec.g

Kullanmak vermedi import locatePython konsolunda .py gerek.
Nathan W

3

Çoklu çizgileri (minimum) arabelleğe alabilir ve daha sonra elde edilen çokgenler üzerinde örnekleme çalıştırabilirsiniz. Başka sınırlayıcı faktörleriniz yoksa, kendi başına iyi çalışabilir, örn. minimum ara nokta aralığı, yoğunluk veya buna bağlı olarak.

Daha karmaşık vakalar için, çok daha yoğun bir rastgele örnek oluşturacağım ve sonra ikinci bir adımda uygun (ne olursa olsun) noktaları seçerdim. Yoğunlaştırma aracıyla benzer bir şey yapılabilir, ancak daha sonra tüm noktalar çoklu çizgi üzerinde olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.