Criando pontos aleatórios ao longo da polilinha no QGIS?


11

Estou tentando criar pontos aleatórios ao longo de um shapefile de polilinha no QGIS. Basicamente, como a ferramenta 'pontos aleatórios' em 'ferramentas de pesquisa', mas para polilinhas em vez de polígonos.

Tentei converter o arquivo de linha em um shapefile de polígono, mas ele preenche algumas áreas com polígonos, enquanto outras áreas permanecem polígonos do tipo linha longa.

Eu sou muito novo no QGIS e não estou muito familiarizado com o código Python.


Se você deseja entrar no R, o pacote spatstat possui ferramentas para criar pontos aleatórios nas linhas.
Micha

Obrigado pelo código. Eu queria saber se alguém poderia me ajudar a modificá-lo para que ele colocasse pontos na linha em intervalos regulares espaçados com um início aleatório? Seria muito apreciado. Não tenho conhecimento prático de python.

Respostas:


14

Esse código funcionará na última versão do QGIS para desenvolvedores.

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)

Eu sei que você disse que não está muito familiarizado com o código Python, mas deve ser capaz de executar isso com bastante facilidade. Copie o código acima em um arquivo (o meu é chamado locate.py) e coloque-o no seu ~/.qgis/pythonse você estiver no Windows 7 que estará C:\Users\{your user name}\.qgis\python\no Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Quando o arquivo estiver na pasta python, abra o QGIS e selecione alguns objetos de linha.
Seleção de camada

Em seguida, abra o console do Python e execute o seguinte código:

import locate.py 
locate.createRandomPoints(10)

Console Python

O resultado deve ser algo como isto

Resultados

Se você deseja executá-lo novamente, basta selecionar mais algumas linhas e executar locate.createRandomPoints(10)no console Python novamente.

Nota: localize.createRandomPoints (10), o 10 aqui é o número de pontos a serem gerados por linha


Obrigado por toda sua ajuda! Não tenho certeza de que formato salvar o código - como faço para torná-lo um arquivo com uma extensão py? Desculpe se estas são perguntas bastante básicas.
Cec.g

Copie o texto em um arquivo de texto normal e salve-o com .py como extensão.
Nathan W

Eu tentei isso, mas ele aparece com este erro: ImportError: Nenhum módulo chamado Locate.py
Cec.g

Este é o caminho do arquivo: C: \ Users \ Cecily \ .qgis \ python
Cec.g

você não usou import locateo .py no console do Python?
Nathan W

3

Você pode armazenar em buffer as polilinhas (minimamente) e executar a amostragem nos polígonos resultantes. Poderia funcionar bem por si só se você não tiver outros fatores limitantes, por exemplo. espaçamento mínimo entre pontos, densidade ou algo assim.

Para casos mais complicados, eu criaria uma amostra aleatória muito mais densa e depois selecionaria pontos apropriados (o que quer que fosse) em uma segunda etapa. Algo semelhante poderia ser feito com a ferramenta densify, mas todos os pontos estariam nas polilinhas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.