sábado, 3 de marzo de 2018

Memory layers de líneas en PyQGIS3

A diferencia de las memory layers de puntos que se consideraron en el post anterior, el código que había sido probado en la version 2 de QGIS para las memory layers de líneas corrió, sorprendentemente sin cambios, en la versión 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
#line
points2 = [ [QgsPoint(363489.618853, 4472331.05714),
             QgsPoint(403879.00375, 4457064.58548)] ,
            [QgsPoint(405737.411031, 4434626.03831),
             QgsPoint( 466087.46672, 4453196.34514)] ]

print (points2)

print (len(points2))

epsg = 32612

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

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

prov = mem_layer.dataProvider()

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

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

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(mem_layer)

lines = [ feat.geometry().asWkt() for feat in mem_layer.getFeatures() ]

print (lines)

Cuando se ejecuta en la Python Console de QGIS se obtiene lo siguiente:


Usando la lista de puntos (points2) correspondiente a:

points2 = [ [QgsPoint(363489.618853, 4472331.05714),
             QgsPoint(403879.00375, 4457064.58548) ,
             QgsPoint(405737.411031, 4434626.03831),
             QgsPoint( 466087.46672, 4453196.34514)] ]

se obtiene algo similar a lo siguiente:


y con esta otra:

points2 = [ [QgsPoint(363489.618853, 4472331.05714),
             QgsPoint(403879.00375, 4457064.58548),
             QgsPoint(405737.411031, 4434626.03831),
             QgsPoint( 466087.46672, 4453196.34514),
             QgsPoint(363489.618853, 4472331.05714)] ]

una línea cerrada:


Lo que si he podido corroborar es que las definiciones de geometría en QGIS 3 han sido ampliadas y lo que antes era una LineString en QGIS 2 ahora es una MultiLineString en QGIS 3. Las consecuencias de ésto es que el código producido para el primero puede no funcionar simplemente porque ahora se necesita una bifurcación de control para tener en cuenta diferencias posibles en la geometría.

Me ocurrió en el plugin que estoy tratando de adaptar para QGIS 3 y finalmente lo puse a funcionar; tal como se observa en la imagen siguiente. Allí se rota 60 º un sistema de 2 líneas (2 features).


No hay comentarios: