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?
No puedo controlar el número de puntos que coloca. Introduje 1 pero generó 385. ayuda
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?
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:
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:
@pbice - ¿Podría compartir su shapefile de líneas? He probado esto en líneas rectas, curvas y múltiples y parece funcionar bien.
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 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.
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.