lunes, 5 de marzo de 2018

Memory layers de polígonos en PyQGIS3

La inclusión de la clase QgsPointXY ha impuesto nuevos métodos en QgsGeometry y a la que más ha afectado a la hora de hacer funcionar el código es a las geometrías tipo polígono. Esto es así, en mi caso, porque he implementado mis propios procedimientos para rotar y mover geometrías (para comprender mejor las operaciones) en lugar de usar las propias clases de PyQGIS para estos procedimientos; donde los formatos WKT son los que traerían los menores problemas en lugar de las listas de puntos.

Así como me vi en la necesidad de probar nuevamente el código con las geometrías tipo punto y línea en PyQGIS3, tuve que crear un procedimiento para transformar QgsPoint en QgsPointXY para geometrías tipo polígono y hacer que funcionara el viejo código. A continuación incluyo un ejemplo.

 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
#polygon
points3 = [[[QgsPoint(374221.55598425801144913, 4446916.80224049557000399),
             QgsPoint(378997.10746914322953671, 4453056.79700677655637264),
             QgsPoint(392095.7629705427098088, 4452101.68670979980379343),
             QgsPoint(397826.4247524049715139, 4438457.25389584247022867),
             QgsPoint(376268.22090635169297457, 4432180.8148014210164547),
             QgsPoint(374221.55598425801144913, 4446916.80224049557000399)]],
            [[QgsPoint(405057.97414380253758281, 4456195.01655398681759834),
              QgsPoint(407241.08339403581339866, 4465200.34221119899302721),
              QgsPoint(426206.84500543709145859, 4463563.01027352456003428),
              QgsPoint(432619.7284279972082004, 4450327.91044398490339518),
              QgsPoint(423750.84709892468526959, 4443642.13836514577269554),
              QgsPoint(410106.41428496694425121, 4446916.80224049557000399),
              QgsPoint(405057.97414380253758281, 4456195.01655398681759834)]]]

n = len(points3)

points3 = [ [ [ QgsPointXY(element.x(), element.y()) for item in points3[i] for element in item ] ] for i in range(n) ]

epsg = 32612

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

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

prov = mem_layer.dataProvider()

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

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

prov.addFeatures(feats)

QgsProject.instance().addMapLayer(mem_layer)

Después de ejecutado el código anterior en la Python Console de QGIS se obtuvo, tal como se esperaba, la memory layer de la imagen siguiente:


Con base en este resultado modifiqué el código del plugin para rotar features y el resultado fue satisfactorio; tal como se presenta en la imagen a continuación:




No hay comentarios: