Создание случайных точек вдоль полилинии в QGIS?

11

Я пытаюсь создать случайные точки вдоль шейп-файла полилинии в QGIS. В основном, как инструмент «случайных точек» в «инструментах исследования», но для полилиний вместо полигонов.

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

Я довольно новичок в QGIS и не очень знаком с кодом Python.

Cec.g
источник
Если вы хотите попасть в R, в пакете spatstat есть инструменты для создания случайных точек на линиях.
Мика
Спасибо за код. Мне было интересно, может ли кто-нибудь помочь мне изменить его так, чтобы он размещал точки на линии через равные промежутки времени со случайным началом? Это будет с благодарностью. У меня нет рабочих знаний по Python.

Ответы:

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.
Натан W
Я пытался это сделать, но появляется эта ошибка: ImportError: Нет модуля с именем locate.py
Cec.g
Это путь к файлу: C: \ Users \ Cecily \ .qgis \ python
Cec.g
Вы не использовали import locate.py в консоли Python.
Натан W
3

Вы можете буферизовать полилинии (минимально), а затем выполнить выборку на полученных полигонах. Это может работать нормально само по себе, если у вас нет других ограничивающих факторов, например. на минимальном интервале между точками, плотности или тому подобное.

Для более сложных случаев я бы создал гораздо более плотную случайную выборку, а затем выбрал подходящие (какими бы они ни были) точки на втором этапе. Нечто подобное можно сделать с помощью инструмента уплотнения, но тогда все точки будут на полилиниях.

lynxlynxlynx
источник