Existe-t-il un moyen d'incrémentation automatique pour la colonne ID dans QGIS

22

Je crée une carte fictive et j'ai donc besoin de créer beaucoup de points, de lignes et à coup sûr des polygones. Plus tard, j'exporte mes données en tant que geojson. Mais avant cela, je dois toujours aller donner à chaque élément un identifiant unique.

Je n'ai pas besoin d'un tri spécial, comme le plus grand polygone obtient le plus petit ID. Je viens besoin tous les polygones avec un ID à la fin, sans faire cela manuellement comme je dois le faire maintenant.

Ce serait génial si quelqu'un sait comment faire ça.

kwoxer
la source
Utilisez-vous des fichiers de formes? L'ID doit-il être le même après chaque exportation, ou pourriez-vous remplir le champ ID après chaque session de modification?
DPSSpatial
Comment créez-vous les polygones à partir d'un script, numérisez-vous dans le bureau QGIS ou copiez-vous à partir d'un fichier de formes, etc.?
landocalrissian
Eh bien, je crée une forme dans QGIS, Enregistrer sous Geojson et ça va. Désolé, j'ai peut-être mal répondu à votre question?
kwoxer

Réponses:

26

Utiliser la calculatrice de terrain est la voie à suivre:

Aucune pièce d'identité n'a été donnée dans

  1. Numérisez toutes les fonctionnalités sans saisir d'ID.
  2. Avant l'exportation, mettez à jour les ID uniques avec l'expression «$ Id» à l'aide de la calculatrice de champ.

Aucune pièce d'identité donnée

Certaines pièces d'identité sont déjà fournies

  1. Si vous avez déjà des identifiants, vous pouvez utiliser '- $ Id'. Assurez-vous de sélectionner simplement les nouvelles fonctionnalités, ce qui signifie qu'elles sont «NULL» dans la ligne d'ID. Faites simplement cela en commandant la colonne.
  2. Maintenant, suivez les étapes des images:

entrez la description de l'image ici entrez la description de l'image ici

vinayan
la source
Ouais, génial. Super facile et fonctionne correctement. Merci mec. Btw: peut-être savez-vous comment faire cela sur des identifiants déjà existants? SI je fais cela, j'obtiens -2 -3 et ainsi de suite
kwoxer
J'ai trouvé une solution et l'a ajoutée à votre message. Merci encore.
kwoxer
6

Alléluia! Ou Eureka. Ou peu importe. Ceci peut être fait. Avec un shapefile.

  1. S'il n'y en a pas déjà un, ajoutez un champ pour contenir l'ID de la fonction, par exemple "FID", de type Nombre entier (entier) .
  2. Ouvrez Propriétés du calque (cliquez avec le bouton droit sur le calque et choisissez Propriétés ... ou double-cliquez sur le calque), cliquez sur l' onglet Formulaire d'attributs , puis sous Général décochez Modifiable et sous Paramètres par défaut dans le champ Type de valeur par défautmaximum("FID") + 1 .

En décochant Modifiable , vous ne pouvez pas entrer une autre valeur ou supprimer ce qui s'y trouve. Notez que s'il existe des valeurs sans ID, ces valeurs ne seront pas mises à jour. À un moment donné, j'expérimenterai en vérifiant Appliquer la valeur par défaut à la mise à jour et en révisant ma formule pour vérifier une valeur nulle ou NULL pour mettre à jour uniquement ces enregistrements lorsqu'ils sont modifiés, pas n'importe quel enregistrement avec une valeur supérieure à 1. (Plus tôt dans ce après avoir discuté de la façon de mettre à jour le champ FID avec des valeurs uniques, ce que vous devrez faire si vous avez ajouté le champ alors qu'il y avait déjà des fonctionnalités dans le fichier de formes.)

Notez que cela est enregistré avec le fichier de carte actuel, et non le fichier de formes, donc l'ajout de plusieurs fois ce fichier de formes vous obligera à copier cette partie du style de couche dans la couche nouvellement ajoutée. Pour ce faire, cliquez avec le bouton droit sur le calque, choisissez Styles> Copier le style> Champs , puis cliquez avec le bouton droit sur un autre calque, choisissez Styles> Coller le style> Toutes les catégories de styles (ou passez aux champs ). Vous pouvez également copier cette partie du style vers tout autre calque basé sur un fichier de formes, mais le champ ID doit avoir le même nom que le calque à partir duquel vous copiez.

Propriétés du calque

bkepl
la source
Notez que pour que cela fonctionne, vous devez au moins créer une entité et saisir son FID, puis modifier la forme d'attribut Valeur par défaut. Sinon, vous vous retrouvez avec un NULL FID.
Techie_Gus
5

Je voudrais ajouter au post de vinayan et mentionner brièvement la fonction rownum , car elle est très similaire et dans certains cas, pourrait être un peu plus pratique.

entrez la description de l'image ici

id renvoie l' ID de fonctionnalité , ce qui signifie qu'il commence toujours à zéro .
rownum renvoie le numéro de la ligne , ce qui signifie qu'il commence à un .

entrez la description de l'image ici

Donc, fondamentalement, si vous voulez que l'incrémentation automatique démarre à 0, optez pour $ id , et si vous voulez qu'elle démarre à 1, optez pour $ rownum .

BritishSteel
la source
Essayé et aussi une bonne solution en effet. Mais avec cette solution ici, si vous avez déjà des identifiants et que vous souhaitez les conserver, la fonction rownum n'est pas bonne. Cette fonction commence toujours par 1. Le chemin ci-dessus est beaucoup plus intelligent même s'il est plus difficile à configurer. Donc merci pour l'alternative mais pour l'instant la fonction ID est ma solution préférée =)
kwoxer
4

Cette rubrique a été soulevée ici: Créer un fichier de formes avec clé primaire d'incrémentation automatique dans QGIS

Mes suggestions seraient:

1) Les bases de données SQLITE / SpatialLite prennent en charge l'incrémentation automatique sur un champ défini sur INTEGER PRIMARY KEY:

Sur un INSERT, si la colonne ROWID ou INTEGER PRIMARY KEY ne reçoit pas explicitement de valeur, elle sera automatiquement remplie avec un entier non utilisé, généralement celui de plus que le plus grand ROWID actuellement utilisé. Cela est vrai que le mot clé AUTOINCREMENT soit utilisé ou non.

Chaque fois que vous modifiez / créez des polygones, vous pouvez remplir leurs attributs, et SQLITE lui donnera une valeur unique incrémentielle dans le champ que vous avez défini sur le type INTEGER PRIMARY KEY.

Lorsque vous êtes prêt à exporter vers GEOJSON, vous êtes prêt à utiliser vos ID UNIQUE.

2) Si vous utilisez des fichiers de formes, créez un champ OBJECTID de type INTEGER et utilisez une expression de calculatrice de champ pour remplir ce champ chaque fois que vous modifiez / créez des polygones et devez les exporter. Vous perdrez l'ID d'origine d'un polygone, mais c'est le seul moyen d'y parvenir en utilisant .SHP. (Je devrai trouver l'expression de la calculatrice de champ).

PostGIS est une autre source de données que vous voudrez peut-être explorer, bien que plus lourde que SQLITE, vous pourriez trouver de la valeur dans un tel système au fur et à mesure ...

DPSSpatial
la source
Merci d'avoir expliqué. Mais je ne pense pas que ce sera une bonne solution au lieu d'une option auto_increment directement dans l'outil. J'ai déjà tellement de formats de données et je ne veux pas encore un autre outil. Peut-être que je devrais écrire un addon pour ça quand j'aurai du temps ...
kwoxer
Il pourrait être plus facile d'abandonner le .SHP! Qui sait sur quelles nouvelles entreprises cela vous mènera ...
DPSSpatial
2

Ancien poste, mais pour quiconque cherche une solution rapide, la mienne consiste à créer un champ avec $ ID + 1 et il sera automatiquement généré à partir de 1!

Blipple
la source
2

Mise à jour pour QGIS 3

Je sais que je suis assez tard pour cela, mais toujours bon de donner des mises à jour:

Dans QGIS 3, il existe maintenant un outil natif qui peut être utilisé pour faire exactement ce travail et il est appelé "Ajouter un champ auto-incrémental"

Pas besoin d'utiliser une expression dans la calculatrice de champ ou de faire du codage mais néanmoins ceux-ci sont toujours très utiles et bons à savoir.

entrez la description de l'image ici

AWGIS
la source
1

La façon la plus simple de le faire serait probablement avec un script python ou peut-être que c'est possible avec la calculatrice de terrain. Désolé, je n'en ai pas pour vous, peut-être que quelqu'un d'autre le fera. En attendant, je rechercherais un script python pour cela. J'ai beaucoup vu à ce sujet pour ArcGIS, mais je suis sûr qu'il y a quelque chose pour QGIS.

Tangnar
la source
Le mieux serait s'il n'y a vraiment rien, une demande de fonctionnalité. Je ne veux pas d'un script python supplémentaire à QGIS également s'il s'agit d'une solution en un clic. Mais merci.
kwoxer
1

Si vous n'avez pas besoin de quelque chose de digeste humainement, il existe maintenant une solution simple: Dans les propriétés du champ, sélectionnez "Générateur UUID" et laissez tout vide.

Cela créera automatiquement un UUID sur le terrain. Pas aussi convivial qu'un simple numéro (selon $ id ou $ rownum), mais génère l'UUID dès le début, donc pas d'étapes successives.entrez la description de l'image ici

Horizen
la source
0

Je voudrais ajouter que cela ne semble pas fonctionner lorsque vous utilisez une couche de base de données postgreSQL. $ ID et $ rownum renvoient tous 0. PostgreSQL 9.6 QGIS 2.18.12

Tyler Veinot
la source
0

ces solutions ne fonctionnaient plus pour moi dans QGIS 2.01 Dufour. Taper $idsur un champ nouveau ou existant nommé 'id' dans le champ de saisie d'expression m'a donné une erreur "L'expression n'est pas valide"

Ce qui a fonctionné était de taper la fonction $rownumpuis de cliquer sur "OK"

entrez la description de l'image ici

toms
la source
0

vous pouvez simplement supprimer la première colonne (id) et en créer une nouvelle "En tant que champ virtuel" entrez la description de l'image ici entrez la description de l'image ici

Rtronic
la source