¿Conectando puntos por líneas usando QGIS?


9

Tengo un archivo .shp, donde quiero conectar todos los puntos (aprox. 100) por líneas. Tengo un campo de datos con el orden (es decir, 1, 2, 3, ...).

He intentado PointConnector y Points2One, tal vez los estoy usando mal, pero no puedo obtener ningún resultado.

En mis búsquedas, he encontrado mención de los puntos del complemento a las rutas, pero ¿parece que se han ido?

Estoy usando QGIS 2.6.1

Respuestas:


8

Primero, aún puede usar el complemento PointsToPaths ( https://plugins.qgis.org/plugins/pointstopaths_v02/ ). Quizás deba habilitar la opción "Mostrar también complementos experimentales" en Complementos> Administrar e instalar complementos (Administrador de complementos)> Configuración.

En segundo lugar, asegúrese de que su campo de datos con el pedido tenga un tipo numérico (por ejemplo, entero, ...)

Traté de crear líneas a partir de una forma de punto con mi versión QGIS (2.0.1) y todo estuvo bien. Aquí una captura de pantalla:ingrese la descripción de la imagen aquí

¡Quizás esto ayude!

Captura de pantalla con los resultados de la forma test_coords: ingrese la descripción de la imagen aquí


Gracias, ahora al menos encontré e instalé los PointsToPaths, pero ninguna combinación de campo de grupo de puntos y campo de orden de puntos parece generar datos, ¿qué campos se necesitan aquí?
Magnus

Para el "Campo de grupo de puntos" tiene dos opciones: puede usar un campo existente o puede crear un nuevo campo con la calculadora de campo (tipo cadena). En caso de que esté creando un nuevo campo, debe escribir un texto predeterminado en la columna. Si lo deja "NULL", recibirá un error. Para el "campo de orden de puntos" puede usar su "campo de orden" con los números de serie (1,2,3, ...). ¡Asegúrese de que este sea un campo numérico! De todos modos, si todavía tiene problemas, publique su archivo de forma y lo intentaré con su datat.
anja

Gracias. He intentado utilizar tanto el texto como los campos enteros para el "Campo de grupo de puntos", y los enteros para el "Campo de orden de puntos" combinados con diferentes valores (y en blanco) del "Período de separación" sin éxito. Adjunto está el .shp que he estado probando con: drive.google.com/file/d/0B160CiiWCWKUbk9PbTF3dmpZYU0/…
Magnus

Lo probé con su archivo de formas y encontré el problema. El "campo de orden de puntos" combina solo los puntos con el mismo "texto" en el campo de grupo. Adjunté una captura de pantalla con los resultados a la respuesta anterior.
anja

Ah, ¿entonces necesito agregar un campo con el mismo texto a cada punto?
Magnus

5

El MMQGIScomplemento tiene una entrada de menú Create -> Hub Lines. Esto debería hacer lo que quieras.

Necesita dos capas (inicio y destino), por lo que es posible que deba agregar su capa de puntos dos veces al lienzo.


Perfecto, mi prueba a pequeña escala parece funcionar: solo necesito dos atributos diferentes, hice un campo de número y número + 1, y los uso como y desde.
Magnus

4

Un enfoque básico sería:

  1. cree un escritor de vectores para un nuevo archivo de formas (vea el Libro de cocina , Sección "Escribir capas de vectores", segundo ejemplo) como (multi) línea / polígono o lo que necesite (ver enumeraciones )
  2. cargar su capa de puntos desde iface.legendInterface().layers()
  3. iterar a través de sus puntos y agregar la función de geometría en su nueva forma

€: solo por diversión:

from PyQt4.QtCore import *

# easy 2 config vars
myPath = "/media/ymirsson/MyData/GIS/tmp/"
myPts = "test_coords.shp"
myLines = "test_lines.shp"
sortField = "No"
myCRS = "25832"

# load the points layer
myPtsLayer = QgsVectorLayer(myPath + myPts, "My Points", "ogr")

# field def. 4 lines-layer
fields = QgsFields()
fields.append(QgsField("id", QVariant.Int))
fields.append(QgsField("name", QVariant.String))

# create writer
writer = QgsVectorFileWriter(myPath + myLines, "utf-8", fields, QGis.WKBLineString, QgsCoordinateReferenceSystem(int(myCRS), QgsCoordinateReferenceSystem.EpsgCrsId), "ESRI Shapefile")

if writer.hasError() == QgsVectorFileWriter.NoError:
    # featureobject to list
    features = myPtsLayer.getFeatures()
    Points=([])
    for feature in features:
        geom = feature.geometry().asPoint()
        sortID = feature.attributes()[myPtsLayer.fieldNameIndex(sortField)]
        Points.append([sortID,geom])
    Points.sort()

    # create lines
    for i in range(1,len(Points)):
        Line = QgsFeature()
        Line.setGeometry(QgsGeometry.fromPolyline([Points[i-1][1], Points[i][1]]))
        Line.setAttributes([i,str(Points[i-1][0]) + " to " + str(Points[i][0])])
        writer.addFeature(Line)
    # don't forget the last one -.-
    Line = QgsFeature()
    Line.setGeometry(QgsGeometry.fromPolyline([Points[len(Points)-1][1], Points[0][1]]))
    Line.setAttributes([len(Points),str(Points[len(Points)-1][0]) + " to " + str(Points[0][0])])
    writer.addFeature(Line)

# flush 2 disk
del writer

# load both layers into qgis-project
QgsMapLayerRegistry.instance().addMapLayer(myPtsLayer)
QgsMapLayerRegistry.instance().addMapLayer(QgsVectorLayer(myPath + myLines, "My Lines", "ogr"))

print "Done .. "

Lo siento, no soy un usuario avanzado y me perdiste en el primer paso. ¿Podría elaborar o sugerir un enfoque más simple?
Magnus

veo que tienes una solución más simple, pero te escribí un pequeño script ... just4fun;)
ymirsson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.