Створення випадкових точок вздовж полілінії в 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.