Tworzysz losowe punkty wzdłuż polilinii w QGIS?


11

Próbuję utworzyć losowe punkty wzdłuż pliku kształtu polilinii w QGIS. Zasadniczo, podobnie jak narzędzie „losowe punkty” w „narzędziach badawczych”, ale dla polilinii zamiast wielokątów.

Próbowałem przekonwertować plik linii na plik kształtu wielokąta, ale wypełnia on niektóre obszary wielokątami, podczas gdy inne obszary pozostają długimi wielokątami.

Jestem całkiem nowy w QGIS i tak naprawdę nie znam kodu Python.


Jeśli chcesz dostać się do R, pakiet spatstat ma narzędzia do tworzenia losowych punktów na liniach.
Micha,

Dzięki za kod. Zastanawiałem się, czy ktoś mógłby mi pomóc go zmodyfikować, aby umieszczał punkty na linii w regularnych odstępach czasu z losowym początkiem? Byłoby to bardzo mile widziane. Nie mam praktycznej wiedzy na temat Pythona.

Odpowiedzi:


14

Ten kod będzie działał na najnowszej kompilacji programistów 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)

Wiem, że powiedziałeś, że nie znasz się dobrze na kodzie Python, ale powinieneś być w stanie uruchomić to całkiem łatwo. Skopiuj powyższy kod do pliku (nazywa się mój locate.py) i umieść go w swoim ~/.qgis/pythonsystemie Windows 7, który będzie w C:\Users\{your user name}\.qgis\python\systemie Windows XP lub Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Gdy plik znajdzie się w folderze python, otwórz QGIS i wybierz niektóre obiekty liniowe.
Wybór warstwy

Następnie otwórz konsolę Python i uruchom następujący kod:

import locate.py 
locate.createRandomPoints(10)

Konsola Python

Wynik powinien wyglądać mniej więcej tak

Wyniki

Jeśli chcesz uruchomić go ponownie, po prostu wybierz więcej linii i uruchom locate.createRandomPoints(10)ponownie w konsoli Python.

Uwaga: locate.createRandomPoints (10) 10 tutaj to liczba punktów do wygenerowania na linię


Dzięki za wszelką pomoc! Nie jestem jednak pewien, w jakim formacie zapisać kod - jak zrobić z niego plik z rozszerzeniem py? Przepraszamy, jeśli są to dość podstawowe pytania.
Cec.g

Skopiuj tekst do normalnego pliku tekstowego i po prostu zapisz go z rozszerzeniem .py.
Nathan W

Próbowałem, ale pojawia się ten błąd: ImportError: Żaden moduł o nazwie locate.py
Cec.g

To jest ścieżka do pliku: C: \ Users \ Cecily \ .qgis \ python
Cec.g

czy nie korzystałeś import locatez pliku .py w konsoli Python?
Nathan W

3

Możesz buforować polilinie (minimalnie), a następnie uruchomić próbkowanie uzyskanych wielokątów. Może działać samo z siebie, jeśli nie masz żadnych innych czynników ograniczających, np. na minimalne odstępy między punktami, gęstość lub jakoś.

W przypadku bardziej skomplikowanych przypadków stworzyłbym znacznie gęstszą próbkę losową, a następnie wybrałem odpowiednie (cokolwiek to może być) punkty w drugim kroku. Coś podobnego można zrobić za pomocą narzędzia zagęszczania, ale wtedy wszystkie punkty będą na poliliniach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.