viernes, 2 de marzo de 2018

Memory layers de puntos en PyQGIS 3

Después de estar luchando con la adaptación de un plugin, desde QGIS2 a QGIS3, para rotar rasgos de diferente geometría y no tener éxito me dije: "vamos a simplificarlo al máximo y a ejecutar como paso previo en la Python Console la creación de una simple capa de puntos como memory layer". Del análisis de los errores me di cuenta que ahora existe una nueva clase, QgsPointXY, que aunque admite operaciones de geometría sus objetos no son geometrías como los QgsPoint. Asumo que esta decisión tiene como finalidad fomentar el uso de los formatos WKT; más manejables a la hora de considerar geometrías.

Una vez analizado el código que no funcionaba, inmediatamente propuse el siguiente:

 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
points = [ QgsPointXY(363489.618853, 4472331.05714).asWkt(),
           QgsPointXY(403879.00375, 4457064.58548).asWkt(),
           QgsPointXY(405737.411031, 4434626.03831).asWkt(),
           QgsPointXY( 466087.46672, 4453196.34514).asWkt() ]

print (points)

epsg = 32612

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

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

prov = mem_layer.dataProvider()

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

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

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(mem_layer)

el cual al ser ejecutado en la Python Console produjo el efecto esperado: la producción de la memory layer de puntos; tal como se observa en la imagen a continuación:


Comprobada la nueva lógica del código para las memory layer, me enfoqué otra vez en el plugin y, para los conjuntos de puntos, pude encontrar la solución y producir su rotación tal como era de esperar. Para los puntos presentados en la imagen siguiente:


el resultado de la rotación 90 grados en el sentido antihorario se presenta a continuación (puntos rojos):


Como en el plugin la transferencia de control se basa en el tipo de geometría, pude descubrir además que los grupos enumerados que antes se encontraban en la clase QGis no están siquiera en la que lo sustituyó (Qgis); sino en la nueva clase QgsWkbTypes. Los grupos enumerados correspondientes a la nueva forma de referir las geometrías pueden ser encontrados aquí.

No hay comentarios: