domingo, 14 de junio de 2020

Conectando multipolígonos con líneas utilizando la distancia más corta como parámetro con PyQGIS 3

El ejemplo que se refiere a continuación permite conectar multipolígonos con líneas utilizando la distancia más corta como parámetro con PyQGIS 3. Es la adaptación de un código que se realizó con anterioridad con PyQGIS 2. El código con PyQGIS 3 se presenta 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
40
41
42
43
44
45
import itertools

layer = iface.activeLayer()

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

comb = range(len(feats))

lines = []

for i, j in itertools.combinations(comb, 2):
    d = feats[i].geometry().distance(feats[j].geometry())
    if d < 14:

        vertices1 = [ vertex for vertex in feats[i].geometry().vertices() ]
        vertices2 = [ vertex for vertex in feats[j].geometry().vertices() ]

        dist = []

        for k in range(len(vertices1)):
           for l in range(len(vertices2)):
              dist.append([k,l, vertices1[k].distance(vertices2[l])])
        res = [[i.index(min(i)), min(i)] for i in zip(*dist)][2]

        lines.append([vertices1[dist[res[0]][0]], vertices2[dist[res[0]][1]]])

epsg = layer.crs().postgisSrid()

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

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

prov = mem_layer.dataProvider()

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

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

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(mem_layer)

Después de ejecutado en la Python Console de QGIS 3 se obtiene, tal como se esperaba, el resultado siguiente:


No hay comentarios: