miércoles, 15 de marzo de 2017

Cómo colocar puntos a lo largo de una línea usando una lista de distancias con PyQGIS

Existe un procedimiento en processing (qgis:createpointsalonglines) que permite realizar la tarea y, posiblemente, se pueda programar para diferentes separaciones. No obstante, a continuación, expondré un código muy sencillo que emplea PyQGIS. La base del mismo es el método 'interpolate' de QgsGeometry. Se usa para generar puntos irregularmente espaciados sobre una línea con base en una lista de separaciones entre los puntos. Por tanto, las distancias se determinan como suma de las respectivas separaciones.



El código completo se encuentra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
registry = QgsMapLayerRegistry.instance()

layer = registry.mapLayersByName('my_line2')

distances = [50, 100, 51]

sum = 0

sum_distances = []

for dist in distances:
    sum += dist
    sum_distances.append(sum)

feat = layer[0].getFeatures().next()

geom_points = [feat.geometry().interpolate(distance).exportToWkt()
               for distance in sum_distances]

epsg = layer[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(sum_distances)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromWkt(geom_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
   

Después de ejecutado en la Python Console de QGIS se obtiene:


Las geometrías (como WKT) de los puntos interpolados (en rojo) fueron incorporados en una memory layer de puntos; que es lo que se despliega como capa en la imagen anterior.

No hay comentarios: