Conversion de liste en champ avec PyQGIS

Oct 20 2020

J'essaye de convertir quelques listes en champs. Je n'ai aucun problème à créer les champs. Je n'ai simplement aucune idée de la façon de les remplir.

if result:
    layer = self.dlg.comboLayerLine.currentData()
    features = layer.getFeatures()
    ID = []
    X = []
    Y = []
    for feature in features:
        geom = feature.geometry()
            
        if geom.type() == QgsWkbTypes.PointGeometry:
            co = geom.asPoint()

            ID.append(feature.id())
            X.append(co[0]
            Y.append(co[1])

        elif geom.type() == QgsWkbTypes.LineGeometry:
            #Do the same with Line geometry

        elif geom.type() == QgsWkbTypes.PolygonGeometry:
            #Do the same with PolyLine geometry
           
        elif geom.type() == QgsWkbTypes.UnknownGeometry:
            #Prompt error box for unknown geometry

        #Add fields here

Ici, je fais 3 listes différentes. Je souhaite convertir chacun d'eux en 3 champs différents.

Edit: J'étais sur le point d'ajouter un échantillon des listes que je reçois mais j'ai réalisé qu'elles n'apparaissent même plus! Voici le reste de mon code.

new_layer = QgsVectorLayer(r'D:\Users\user\Desktop\trash temp', "essai.shp", "ogr") 
new_layer.startEditing() 
id_field = QgsField('ID', QVariant.String)
x_field = QgsField('X', QVariant.String)
y_field = QgsField('Y', QVariant.String)
new_layer.addAttribute(id_field)
new_layer.addAttribute(x_field)
new_layer.addAttribute(y_field)
print("Ok pressed")

Edit 2: J'ai réussi à corriger les listes donc voici la sortie de la liste "y":

[6414701.507300033, 6416326.521299997, 6414870.419924344, 6414629.207300014, 6414839.753699968, 6414545.455399935, 6414596.490248112, 6414756.708799932, 6414599.551207293, 6414792.136099978, 6414952.573700016, 6414714.024700028, 6414630.641128357, 6414606.850143043, 6414661.849399988, 6414634.387000008, 6414601.288791229, 6414930.830580306, 6414609.777690075]

Edit 3: J'ai essayé quelque chose qui n'a pas fonctionné. C'est ici:

#Add fields here 
layerFields = QgsFields()
layerFields.append(QgsField('ID', QVariant.Int))
layerFields.append(QgsField('x', QVariant.Double))
layerFields.append(QgsField('y', QVariant.Double))
path = r'D:\Users\me\Desktop\trash temp'
writer = QgsVectorFileWriter(path, 'UTF-8', layerFields, QgsWkbTypes.Point)
feat = QgsFeature(layerFields)
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(attrs[1], attrs[2])))
for i in range(2, len(attrs), 3):
   print(attrs)
   feat.setAttributes(attrs[i-2], attrs[i-1], attrs[i])
   writer.addFeature(feat)

#Finish

layer = iface.addVectorLayer(fn, '','ogr')
del(writer)

Cela me renvoie l'erreur suivante:

feat.setAttributes (attrs [i-2], attrs [i-1], attrs [i]) TypeError: QgsFeature.setAttributes (): l'argument 1 a un type inattendu 'int'

Edit 4: Après avoir reçu quelques conseils, j'ai décidé de faire une liste de listes. Donc ma nouvelle sortie est:

[[0, 506099.200000004, 6414701.507300033], [1, 505724.36900000286, 6416326.521299997], [2, 506076.8426659516, 6414870.419924344], [3, 506265.86200000404, 6414629.207300014], [4, 506945.2999999959, 6414839.753699968], [5, 506180.2869999982, 6414545.455399935], [6, 506047.2159920711, 6414596.490248112], [7, 506081.38259999966, 6414756.708799932], [8, 506045.6930898201, 6414599.551207293], [9, 506816.1533999958, 6414792.136099978], [10, 506090.7625000037, 6414952.573700016], [11, 506660.63870000176, 6414714.024700028], [12, 506112.8389316339, 6414630.641128357], [13, 506134.08904640994, 6414606.850143043], [14, 506548.10649999965, 6414661.849399988], [15, 506436.27269999706, 6414634.387000008], [16, 506303.8354239211, 6414601.288791229], [17, 506062.6988654828, 6414930.830580306], [18, 506047.52282746276, 6414609.777690075]]

Chaque liste représente une entité future avec son ID, ses coordonnées X et Y

Réponses

2 Taras Oct 21 2020 at 14:50

Veuillez essayer le code suivant:

layer = QgsVectorLayer("Point", "Test", "memory")
crs = QgsCoordinateReferenceSystem("EPSG:26912")
layer.setCrs(crs)

provider = layer.dataProvider()
provider.addAttributes([QgsField('ID', QVariant.Int),
                        QgsField('X', QVariant.Double),
                        QgsField('Y', QVariant.Double)])
layer.updateFields()

attributes = [[0, 506099.200000004, 6414701.507300033], [1, 505724.36900000286, 6416326.521299997], [2, 506076.8426659516, 6414870.419924344], [3, 506265.86200000404, 6414629.207300014], [4, 506945.2999999959, 6414839.753699968], [5, 506180.2869999982, 6414545.455399935], [6, 506047.2159920711, 6414596.490248112], [7, 506081.38259999966, 6414756.708799932], [8, 506045.6930898201, 6414599.551207293], [9, 506816.1533999958, 6414792.136099978], [10, 506090.7625000037, 6414952.573700016], [11, 506660.63870000176, 6414714.024700028], [12, 506112.8389316339, 6414630.641128357], [13, 506134.08904640994, 6414606.850143043], [14, 506548.10649999965, 6414661.849399988], [15, 506436.27269999706, 6414634.387000008], [16, 506303.8354239211, 6414601.288791229], [17, 506062.6988654828, 6414930.830580306], [18, 506047.52282746276, 6414609.777690075]]

for attr in attributes:
    f = QgsFeature()
    f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(attr[1], attr[2])))
    f.setAttributes(attr)
    provider.addFeature(f)

QgsProject.instance().addMapLayer(layer)

La sortie ressemblera à:


Les références:

  • PyQGIS 101: Création et modification d'une nouvelle couche vectorielle
  • OpenSourceOptions | PyQGIS: créer une entité ponctuelle