25 votos

Creación de puntos en distancia especificada a lo largo de línea usando QGIS?

Quiero usar QGIS creando puntos a lo largo de la línea, pero en la distancia especificada. He encontrado dos herramientas GRASS en SEXTANTE Toolbox

  • v.a.puntos
  • v.segmento

Intenté v.a.puntos , estableciendo la distancia máxima entre puntos en unidades de mapa a 100 y obtuve esto

points along the line

close look

La segunda foto muestra un primer plano desde la parte superior. El resultado fue lo que quiero, pero quiero conseguir menos puntos , pero incluso puse la distancia máxima a 1000, o 1000000, el resultado fue el mismo.

Intenté utilizar v.segmento pero no tenía ningún archivo que contuviera las reglas de los segmentos.

Underdark me dio algunos consejos, y traté de Densificar geometrías dado un intervalo . Primero me dio un shapefile de polilíneas igual al que introduje, y luego utilicé extraer nodos para intentar conseguir esos puntos. Pero el resultado fue el mismo que obtuve utilizando v.a.puntos , no importa lo que yo establezca el intervalo de distancia.

¿Cómo puedo crear puntos a lo largo de la línea, y en la distancia especificada

24voto

Jason Puntos 221

Ahora hay un plugin llamado QChainage que hace exactamente lo que quieres. Usted especifica una distancia de intervalo y el plugin crea puntos a lo largo de su línea en el intervalo especificado.

22voto

GreyCat Puntos 146

En la consola de Python:

1) crear una clase de capa de memoria (clase completa (sin atributos) en crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) funciones de álgebra vectorial (de algèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) cosenos de dirección

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) procesar línea o segmentos de línea

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Resultados

polilínea, punto equidistante con Shapely o PyQGIS2, con cosenos de dirección

polylineshapelyvector_algebra

A continuación, sólo tiene que ajustar el intervalo

12voto

tobes Puntos 19

He escrito un script que cambia la herramienta Sextante Densificar geometrías para aceptar una distancia determinada. Se llama Densificar geometrías dado un intervalo .

Después de ejecutar Densify, puede extraer los puntos utilizando Extraer nodos herramienta.

Puede obtenerlo en Github y las instrucciones de instalación están en mi blog .

enter image description here

10voto

BillRo Puntos 16

En QGIS 3 (al menos en QGIS 3.10) existe una herramienta de tratamiento para tal fin: "Puntos a lo largo de la geometría"

enter image description here

0voto

Zack Li Puntos 43

Bueno, no estoy seguro de si esto está en la versión estable, pero en la caja de herramientas sextante en 1.9 alfa en Geoalgorithims->Vector es la opción "Convertir líneas a puntos". Funciona a las mil maravillas, aunque sería genial si añadiera también un campo para la distancia a lo largo de la línea.

Sin embargo, es interesante que haya añadido el campo NOMBRE de mi capa vectorial.

Intenté hacer funcionar ese script de Python de Nathan Woodrow, pero soy pésimo con python. Y con el código en general parece.

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