Suite

Créer une nouvelle couche mémoire vide avec le schéma de champs d'une autre couche dans QGIS?

Créer une nouvelle couche mémoire vide avec le schéma de champs d'une autre couche dans QGIS?


Étant nouveau avec python jusqu'à présent, je me suis inspiré de cette réponse: /a/155988/8202 pour m'y plonger un peu.

Lors de la création d'entités dans une nouvelle couche cible à partir d'une couche source existante, toutes les "solutions" que j'ai trouvées jusqu'à présent pour créer cette nouvelle couche étaient soit

  1. préparer la nouvelle couche cible manuellement dans QGIS au préalable, en ajoutant tous les champs (avec les types de champs, les longueurs, etc.).
  2. Codez en dur les paramètres de champ dans le script python lors de la création de cette nouvelle couche cible. Comment créer une nouvelle couche vectorielle vide par programme ?

Il me semble un peu étrange qu'il n'y ait aucun moyen de cloner le schéma d'attributs d'un calque et de créer un nouveau calque (mémoire) avec ce schéma, de sorte que vous n'aurez pas à modifier votre script pour chaque nouveau calque, ou à tâtonner les choses ensemble manuellement.

Je me concentre sur la création de couches de mémoire, car je veux avoir la possibilité de décider par moi-même si le résultat est satisfaisant et de l'enregistrer manuellement lorsqu'il correspond à mes besoins.


Voici du code Python simple et rapide qui fonctionne sur une simple couche de fichier de formes :

# Obtenir le calque actuellement sélectionné inLayer = iface.activeLayer() # Obtenir sa liste de champs inFields = inLayer.dataProvider().fields() # Convertir son enum de type de géométrie en une chaîne que nous pouvons passer au # Constructeur de QgsVectorLayer inLayerGeometryType = [' Point','Line','Polygon'][inLayer.geometryType()] # Convertit son CRS en une chaîne que nous pouvons passer au constructeur de QgsVectorLayer inLayerCRS = inLayer.crs().authid() # Rendre la couche de sortie outLayer = QgsVectorLayer (inLayerGeometryType + '?crs='+inLayerCRS,  inLayer.name() + u'_copy',  'memory') # Copier les champs de l'ancienne couche dans la nouvelle couche outLayer.startEditing() outLayer.dataProvider() .addAttributes(inFields.toList()) outLayer.commitChanges() # L'ajouter à la carte QgsMapLayerRegistry.instance().addMapLayer(outLayer)

Je charge un simple fichier de forme, sélectionne ce calque dans la zone Calques, colle le code ci-dessus dans la console Python et un nouveau calque apparaît avec les mêmes attributs.

Les éléments clés ici (je suppose d'après votre question) sont les lignes qui obtiennent la liste des champs de la couche d'entrée (inLayer.dataProvider().fields(), documenté ici) et ajoutez ces mêmes champs à la couche de sortie (outLayer.dataProvider().addAttributes(inFields.toList()), documenté ici)


Voir la vidéo: 15 Min Flat Belly Tummy Workout मटप Natural way to Fatloss Motapa Kam Kare