5 votos

¿Poner puntos aleatorios sólo en partes seleccionadas de una línea en QGIS?

Estoy tratando de crear puntos aleatorios a lo largo de una línea, sin embargo sólo quiero hacerlo en el área seleccionada. ¿Hay alguna forma de hacerlo?

1 votos

¿Podría ampliar un poco su pregunta? ¿Tal vez algunas capturas de pantalla? Es difícil entender exactamente lo que preguntas o lo que has probado.

1 votos

No hay manera de hacer esto directamente, tendrás que hacer una nueva capa con sólo los segmentos de la línea a lo largo de la cual quieres puntos, y luego generar puntos a lo largo de esa línea.

4voto

Mue Puntos 2469

Por el momento, el Puntos aleatorios a lo largo de la línea crea puntos aleatorios en todas las líneas de su capa, independientemente de que el Use only selected features está activada en Processing > Options > General .

Sin embargo, puede utilizar el siguiente script que es fuertemente basado en el código fuente de la herramienta. El script le permite:

  • Crear puntos aleatorios para cada línea seleccionada.
  • Si no hay líneas seleccionadas, crea puntos aleatorios compartidos entre todas las líneas (que es lo que hace la herramienta original).
  • (Opcional) Tratar todas las líneas seleccionadas como una sola característica.

Para ejecutarlo, vaya a:

Processing Toolbox > Scripts > Create new script

A continuación, copie/pegue el código siguiente. Asegúrate de guardar el script en tu /.qgis2/processing/scripts directorio.

##Random points along line(s)=name
##Input_layer=vector line
##Group_selected_features=boolean False
##Number_of_points=number 1
##Minimum_distance=number 0.00
##Output=output vector

from qgis.core import QgsField, QgsFields, QGis, QgsSpatialIndex, QgsDistanceArea, \
QgsFeatureRequest, QgsGeometry, QgsPoint, QgsFeature
from PyQt4.QtCore import QVariant
import random

def checkMinDistance(point, index, distance, points):
    if distance == 0:
        return True
    neighbors = index.nearestNeighbor(point, 1)
    if len(neighbors) == 0:
        return True
    if neighbors[0] in points:
        np = points[neighbors[0]]
        if np.sqrDist(point) < (distance * distance):
            return False
    return True

layer = processing.getObject(Input_layer)

fields = QgsFields()
fields.append(QgsField('id', QVariant.Int, '', 10, 0))
writer = processing.VectorWriter(Output, None,
    fields, QGis.WKBPoint, layer.crs())

nPoints = 0
nIterations = 0
maxIterations = Number_of_points * 200
featureCount = layer.featureCount()
total = 100.0 / Number_of_points
index = QgsSpatialIndex()
points = dict()
da = QgsDistanceArea()
request = QgsFeatureRequest()
random.seed()

while nIterations < maxIterations and nPoints < Number_of_points:
    features = layer.selectedFeatures()
    if features:
        if Group_selected_features:
            feat = []
            feat.append(random.choice(features))
        else:
            feat = layer.selectedFeatures()
    else:
        feat = layer.getFeatures()

    for f in feat:            
        fGeom = QgsGeometry(f.geometry())

        if fGeom.isMultipart():
            lines = fGeom.asMultiPolyline()
            lineId = random.randint(0, len(lines) - 1)
            vertices = lines[lineId]
        else:
            vertices = fGeom.asPolyline()

        if len(vertices) == 2:
            vid = 0
        else:
            vid = random.randint(0, len(vertices) - 2)
        startPoint = vertices[vid]
        endPoint = vertices[vid + 1]
        length = da.measureLine(startPoint, endPoint)
        dist = length * random.random()

        if dist > Minimum_distance:
            d = dist / (length - dist)
            rx = (startPoint.x() + d * endPoint.x()) / (1 + d)
            ry = (startPoint.y() + d * endPoint.y()) / (1 + d)

            # generate random point
            pnt = QgsPoint(rx, ry)
            geom = QgsGeometry.fromPoint(pnt)
            if checkMinDistance(pnt, index, Minimum_distance, points):
                f = QgsFeature(nPoints)
                f.initAttributes(1)
                f.setFields(fields)
                f.setAttribute('id', nPoints)
                f.setGeometry(geom)
                writer.addFeature(f)
                index.insertFeature(f)
                points[nPoints] = pnt
                nPoints += 1
        nIterations += 1

del writer


Ejemplo:

  1. Esta es la interfaz cuando se ejecuta el script:

    Script interface


  1. Ejecución del script en una línea seleccionada:

    One selected line


  1. Ejecutando el script en dos líneas seleccionadas con el Group selected features opción marcada:

    Two selected lines

0 votos

No puedo controlar el número de puntos que coloca. Introduje 1 pero generó 385. ayuda

0 votos

@pbice - ¿Podría compartir su shapefile de líneas? He probado esto en líneas rectas, curvas y múltiples y parece funcionar bien.

0 votos

He descubierto lo que está mal. ¿Hay una manera de hacer que se traten todas las características seleccionadas como una característica y sólo generar un punto al azar en algún lugar del grupo de características seleccionadas?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X