Existe-t-il un moyen rapide d'effacer tous les attributs d'une couche mais de laisser les polygones en place?


9

J'ai une couche Shapefile dans QGIS 2.6 avec plusieurs polygones, chacun ayant des données dans plus de 100 champs. J'ai besoin de créer une nouvelle couche avec tous les mêmes polygones, mais avec tous leurs champs de données vides (mis à 0, nul ou vide selon le type de champ). Existe-t-il un moyen plus rapide de le faire que d'appuyer sur Supprimer sur chaque champ de chaque polygone un à la fois, je devrais le faire plus de 1000 fois de cette façon.


1
Veuillez modifier la question pour inclure la version du logiciel SIG et le format des données (par exemple, shapefile, FGDB, PostGIS, ..)
Vince

Réponses:


3

Ne pouvez-vous pas simplement copier-coller vos données dans la couche X (une couche / un fichier de formes / une classe d'entités / quoi que ce soit) qui n'a aucun attribut (en plus de l'OID et de la géométrie), puis copier-coller la géométrie désormais "vide" en arrière dans votre couche d'origine?


6

Vous pouvez entrer le code suivant dans la console Python pour effacer TOUS les attributs d' NULLun fichier de formes chargé dans QGIS. Sélectionnez le calque dans le panneau des calques (Table des matières) et exécutez le code:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

Cela a été testé sur QGIS 2.8.2.


MISE À JOUR :

En réponse au commentaire de @Vince, le code suivant peut être directement copié / collé dans la console Python et changera les valeurs des attributs en fonction du type de champ (c'est- 0à- dire pour les champs entiers ; NULLpour les champs chaîne ; et une époque de 1900-01-01for un champ Date ):

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()

1
Pouvez-vous modifier la logique pour attribuer zéro aux chiffres, vide / NULL aux chaînes et l'époque aux dates?
Vince

@Vince - Merci mon pote, je peux certainement essayer car je ne suis pas un expert en la matière :)
Joseph

@Vince - Merci encore d'avoir mentionné le tweak, il m'est arrivé d'en apprendre plus sur python =)
Joseph

1
Je suppose que mon âge montre quand je pense à une époque du 1er janvier 1970 ou 1900, pas 2000;)
Vince

3

Vous pouvez simplement l'enregistrer dans un nouveau fichier et cocher la case "Ignorer la création d'attribut" dans la boîte de dialogue "Enregistrer sous ...". Il fait exactement ce qu'il dit.

Il y aura une colonne de compteur numérique nommée FID, apparemment le format Shapefile nécessite au moins un attribut? Si vous le pouvez, utilisez quelque chose de mieux, spatialite ou géopackage.


+1, vous avez raison car il doit y avoir au moins un attribut. Mais c'est une méthode très agréable et simple car vous pouvez exécuter le calculateur de champ et remplacer toutes les valeurs du FID NULL.
Joseph

1
Le comportement de QGIS semble étrange. La colonne FID est modifiable et ce n'est pas le mappage réel entre la géométrie et les attributs. Si vous supprimez la colonne, vous obtenez un nommé "identifiant de fonctionnalité" qui n'est pas modifiable. Ce devrait déjà être le premier résultat. QGIS 2.10. Je déposerai un bug plus tard.
bugmenot123

2

Ouvrez le fichier .dbf avec openoffice ou autres et supprimez les données.
Vous pouvez utiliser python pour parcourir les fichiers et supprimer tout sauf les en-têtes Voir module dbf python


1
L'utilisation d'outils ignorant les fichiers de formes sur le composant de fichier dBase est susceptible de provoquer une corruption du fichier de formes. Si le but est de remplir des blancs et des zéros, la «suppression» des données ne produira probablement qu'un fichier dBase avec moins d'enregistrements que le .shp / .shx.
Vince

En effet, mais nous supprimons simplement les données, il n'y a aucun risque.
julsbreakdown

Non, la tâche consiste à conserver les polygones et à éliminer les attributs correspondants, le risque est donc très élevé. Toute réponse qui ne met pas en garde contre une corruption potentielle ne prend pas le risque suffisamment au sérieux.
Vince

Je reconnais que c'est une manière difficile, c'est-à-dire pas une méthode régulière, mais cela fonctionne. De toute évidence, il est préférable de conserver une sauvegarde des données d'origine.
Leehan

Dans ce cas particulier, le risque n'est pas si grand car tous les attributs de tous les champs sont initialisés. Par conséquent, si l'ordre des enregistrements change dans le fichier dbf, il ne causera toujours aucun problème car tous les enregistrements ont les mêmes données dans les attributs. L'utilisateur doit toujours veiller à ce que le nombre de fonctionnalités dans .dbf soit le même que dans .shp. Cependant, comme l'a écrit @Vince, les utilisateurs doivent être avertis que a) changer l'ordre des lignes de b) le nombre de lignes dans .dbf conduit généralement à un fichier de formes corrompu et inutilisable.
user30184

2

QGIS peut ouvrir des fichiers de forme sans le .dbf.

Vous pouvez donc simplement supprimer le composant .dbf et le charger dans le .shp, qui apportera juste la géométrie.


C'est une bonne astuce bien que je m'abstienne personnellement de ne supprimer aucun fichier associé :)
Joseph

1
Oui, renommer peut être une option plus sûre.
HeikkiVesanto

2

Vous pouvez peut-être modifier le fichier * .dbf avec Excel.

Ensuite, vous supprimez tous les champs sauf celui de geom.

Enfin, enregistrez et quittez.

Il serait utile de conserver une archive du * .shp avant de faire cela.


Le sens semble être de garder le schéma intact, donc seules les valeurs des attributs doivent être définies sur une valeur par défaut. Et vous ne pouvez pas enregistrer au format dbf avec Excel.
user30184

2
Le champ de géométrie n'existe pas dans le composant dBase d'un fichier de formes.
Vince

il n'y a pas de champ wkt lors de l'édition de dbf avec excel.
Leehan

Le champ FID relie les lignes du .dbf à la géométrie, qui est stockée dans le .shp. Vraiment, le .dbf n'a rien à voir avec la géométrie. en.wikipedia.org/wiki/Shapefile
mr.adam

1

Dans QGIS 2.8.x, vous pouvez également vous débarrasser de certains ou de tous les champs. Ouvrez la table des attributs, Basculez le mode d'édition, cliquez sur le bouton "Supprimer la colonne", sélectionnez tous vos attributs indésirables et cliquez sur "OK". Enregistrez les modifications.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.