A pesar de que QGIS 2 ya no tiene mantenimiento en versiones de esta rama, todavía existen usuarios que se niegan a actualizar a QGIS 3 para no tener que adaptar el código ya desarrollado para que funcione en QGIS 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 2. Difiere en varias líneas de código del que se desarrolló también para PyQGIS 3 con el mismo fin (que se incluirá, Dios mediante, en un post futuro). 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 46 | 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: print(d) vertices1 = feats[i].geometry().asPolygon()[0] vertices2 = feats[j].geometry().asPolygon()[0] dist = [] for k in range(len(vertices1)): for l in range(len(vertices2)): dist.append([k,l, QgsPoint(vertices1[k]).distance(QgsPoint(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) QgsMapLayerRegistry.instance().addMapLayer(mem_layer) |
La distancia umbral es de 14 metros y se probó con la capa vectorial que se presenta en la imagen siguiente; donde también se observan las líneas generadas con la ejecución del script anterior en la Python Console de QGIS 2.18.
No hay comentarios:
Publicar un comentario