Створення випадкових точок вздовж полілінії в QGIS?


11

Я намагаюся створити випадкові точки уздовж полілінійного формату в QGIS. В основному, як інструмент "випадкових точок" в "інструментах дослідження", але для поліліній замість полігонів.

Я спробував перетворити файл рядка в файл форми багатокутника, але він заповнює в деяких областях багатокутники, тоді як інші області залишаються довгими полігонами типу рядка.

Я досить новачок у QGIS і не дуже знайомий з кодом Python.


Якщо ви готові потрапити в R, пакет spatstat має інструменти для створення випадкових точок на лініях.
Міха

Дякуємо за код. Мені було цікаво, чи може хтось допомогти мені змінити це так, щоб він розміщував точки на лінії через регулярні інтервали з рандомізованим початком? Було б дуже вдячно. У мене немає робочих знань пітона.

Відповіді:


14

Цей код буде працювати над останньою розробкою 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)

Я знаю, ви сказали, що ви не дуже знайомі з кодом Python, але ви повинні мати можливість запустити це досить просто. Скопіюйте вищевказаний код у файл (мій називається locate.py) і помістіть його у свій, ~/.qgis/pythonякщо ви перебуваєте в Windows 7, який буде в C:\Users\{your user name}\.qgis\python\Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Як тільки файл знаходиться в папці python, відкрийте QGIS і виберіть деякі об'єкти рядка.
Вибір шару

Потім відкрийте консоль Python і запустіть такий код:

import locate.py 
locate.createRandomPoints(10)

Консоль Python

Результат повинен виглядати приблизно так

Результати

Якщо ви хочете запустити його ще раз, виберіть ще кілька рядків і знову запустіть locate.createRandomPoints(10)на консолі Python.

Примітка: locate.createRandomPoints (10) 10 тут - кількість точок для генерації на рядок


Дякую за всю вашу допомогу! Я не впевнений, в якому форматі зберегти код - як зробити його файлом із розширенням py? Вибачте, якщо це досить основні питання.
Cec.g

Скопіюйте текст у звичайний текстовий файл і просто збережіть його .py як розширення.
Nathan W

Я це спробував, але виникає ця помилка: ImportError: Немає модуля з ім'ям locate.py
Cec.g

Це шлях до файлу: C: \ Users \ Cecily \ .qgis \ python
Cec.g

Ви не використовували import locate.py в консолі Python.
Nathan W

3

Ви можете буферувати полілінії (мінімально), а потім запустити вибірку на отриманих полігонах. Це може спрацювати само по собі, якщо у вас немає інших обмежуючих факторів, наприклад. на мінімальний інтерполітовий проміжок, щільність або дещо.

Для складніших випадків я б створив набагато більш щільну випадкову вибірку і потім підбирав відповідні (що б це не було) точки на другому кроці. Щось подібне можна було б зробити з інструментом ущільнення, але тоді всі точки опиняться на полілініях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.