miércoles, 24 de enero de 2018

Reordenar rasgos en un vectorial de línea mediante PyQGIS

El vectorial de línea de la imagen siguiente es de partes sencillas (singleparts) con la particularidad de que sus rasgos, de izquierda a derecha y en orden ascendente, no están ordenados secuencialmente como se espera. Esta falta de secuencia puede producir errores a la hora de ejecutar ciertas consultas o algoritmos.


Para evitar esto, el código PyQGIS siguiente permite ordenar los features en una lista complementaria tomando como base la selección del primer rasgo del vectorial de línea. En este caso es el primero de la izquierda que tiene un id igual a 3. Una vez realizada la selección completa de los rasgos ordenados, éstos se conforman en la memory layer correspondiente.

 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
layer = iface.activeLayer()

selected_feature = layer.selectedFeatures()

feats = [ feat for feat in layer.getFeatures() ]

new_feats = []

new_feats.append(selected_feature[0])

del feats[selected_feature[0].id()]

n = len(feats)

for k in range(n):
    for i, feat in enumerate(feats):
        dist = feat.geometry().distance(new_feats[-1].geometry())
        if dist == 0:
            new_feats.append(feats[i])
            del feats[i]
            break

epsg = layer.crs().postgisSrid()

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

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

prov = mem_layer.dataProvider()

for i, feat in enumerate(new_feats):
    feat.setAttributes([i])

prov.addFeatures(new_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

La imagen a continuación señala la selección del primer rasgo del vectorial de línea antes de la ejecución del código.


Después de ejecutado el código anterior se obtiene la memory layer en la cual todos sus rasgos están secuencialmente ordenados; tal como se visualiza en la imagen siguiente:


No hay comentarios: