Cómo crear puntos en una distancia específica a lo largo de la línea en QGIS?

16

Quiero usar QGIS creando puntos a lo largo de la línea, pero en una distancia específica. Encontré dos herramientas de GRASS en SEXTANTE Toolbox :

  • v.to.points
  • v.segment

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

La segunda foto mostraba una mirada cercana desde la superior. El resultado fue lo que quería, pero quiero obtener menos puntos , pero incluso si establecí la distancia máxima en 1000 o 1000000, el resultado fue el mismo.

Intenté usar v.segment , pero no tenía ningún archivo que contenga reglas de segmento.

Underdark me dio algunos consejos y probé Densificar geometrías en un intervalo . Primero me dio un archivo de forma de polilínea de la misma forma que yo ingresé, y luego usé extraer nodos para intentar obtener esos puntos. Pero el resultado fue el mismo que obtuve al utilizar v.to.points , sin importar cuál sea el intervalo de distancia.

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

    
pregunta Heinz 11.06.2013 - 11:10

6 respuestas

16

En la consola de Python:

1) cree 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 algebraicas de vectores (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) dirección cosines

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

4) línea de proceso 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

Luego solo ajusta el intervalo

    
respondido por el gene 11.06.2013 - 18:19
12

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

    
respondido por el Jason 25.06.2014 - 05:13
10

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

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

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

    
respondido por el underdark 11.06.2013 - 15:08
0

Si no quiere andar con los scripts de Python, simplemente puede instalar y usar el complemento "Perfil desde la línea" e ignorar / eliminar la columna de valor ráster. El PK será lo que usted establezca para que sea el intervalo de muestreo.

    
respondido por el user19425 15.07.2013 - 13:49
0

No estoy seguro de si esto está en la versión estable, pero en la caja de herramientas de sextante en 1.9 alpha bajo Geoalgorithims- > Vector es la opción "Convertir líneas en puntos". Sin embargo, funciona bien, sé genial si agregó un campo para la distancia a lo largo de la línea.

Lo interesante es que agregó el campo NOMBRE de mi capa vectorial.

Intenté que Python Script de Nathan Woodrow funcionara, pero apesto con Python. Y con el código en general parece.

    
respondido por el Kapanther 05.07.2013 - 06:40
0

Pasé mucho tiempo luchando con este problema, pero finalmente obtuve más o menos lo que estaba buscando usando QChainage. Lo que me gustaría compartir es algo que pueda ayudar a otros. Al utilizar la herramienta de disolución de geoprocesamiento SAGA en la línea, QChainage produce resultados incorrectos. El uso de una herramienta de disolución diferente hace que funcione bien.

    
respondido por el Chester H 16.05.2018 - 22:40

Lea otras preguntas en las etiquetas