Esiste un modo di auto_increment per la colonna ID in QGIS


22

Sto creando una mappa fittizia e quindi ho bisogno di creare molti punti, linee e sicuramente poligoni. Successivamente esporto i miei dati come geojson. Ma prima devo sempre andare e dare ad ogni elemento un ID univoco.

Non ho bisogno di un ordinamento speciale, come il poligono più grande ottiene l'ID più piccolo o giù di lì. Ho solo bisogno di tutti i poligoni con un ID alla fine, senza fare essa manualmente come devo fare ora.

Sarebbe bello se qualcuno sapesse come farlo.


Stai usando shapefile? Gli ID devono essere gli stessi dopo ogni esportazione o potresti popolare il campo ID dopo ogni sessione di modifica?
DPSSpatial

Come stai creando i poligoni da uno script, digitalizzando nel desktop QGIS o copiando da uno shapefile ecc.?
landocalrissian

Beh, creo una forma in QGIS, Salva come Geojson e va bene. Scusa forse ho ricevuto la tua domanda in modo sbagliato?
Kwoxer,

Risposte:


26

L'uso del calcolatore di campo è la strada da percorrere:

Nessun documento di identità è stato fornito

  1. Digitalizza tutte le funzionalità senza inserire alcun ID.
  2. Prima dell'esportazione, aggiorna gli ID univoci con l'espressione "$ Id" utilizzando il calcolatore di campo.

Nessun ID fornito

Alcuni ID sono già stati forniti

  1. Se hai già ID puoi usare '- $ Id'. Assicurati di selezionare solo nuove funzionalità che significa che sono "NULL" nella riga ID. Fallo semplicemente ordinando la colonna.
  2. Ora fai i passaggi dalle immagini:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine


Sì, meraviglioso. Super facile e funziona correttamente. Grazie uomo. Btw: forse sai come farlo anche su alcuni ID esistenti? Se lo faccio ottengo -2 -3 e così via
kwoxer il

Ho trovato una soluzione e l'ho aggiunta al tuo post. Grazie ancora.
Kwoxer,

6

Hallelujah! O Eureka. O qualunque cosa. Questo può essere fatto. Con uno shapefile.

  1. Se non ce n'è già uno, aggiungi un campo per contenere l'id della funzione, ad esempio "FID", di tipo Numero intero (intero) .
  2. Apri Proprietà livello (fai clic con il pulsante destro del mouse sul livello e scegli Proprietà ... o fai doppio clic sul livello), fai clic sulla scheda Modulo attributi , quindi in Generale deseleziona Modificabile e in Impostazioni predefinite nel campo Tipo valore predefinitomaximum("FID") + 1 .

Deselezionando Modificabile , non è possibile inserire un altro valore o eliminare ciò che è lì. Nota che se ci sono valori senza ID, questi valori non verranno aggiornati. Ad un certo punto sperimenterò il controllo Applica il valore predefinito all'aggiornamento e rivedendo la mia formula per verificare lo zero o il valore NULL per aggiornare solo quei record quando vengono modificati, non alcun record con un valore maggiore di 1. (In precedenza in questo post è stato discusso su come aggiornare il campo FID con valori univoci, cosa che dovrai fare se hai aggiunto il campo dopo che c'erano già funzionalità nel file di forma.)

Si noti che questo viene salvato con il file di mappa corrente, non con il file di forma, quindi l'aggiunta di tale file di forme più volte richiederà di copiare quella parte dello stile di livello nel livello appena aggiunto. Per fare ciò, fai clic con il pulsante destro del mouse sul livello, scegli Stili> Copia stile> Campi e fai clic con il pulsante destro del mouse su un altro livello, scegli Stili> Incolla stile> Tutte le categorie di stile (o continua su Campi ). Puoi anche copiare quella parte dello stile su qualsiasi altro livello basato su un file di forma, ma il campo ID deve avere lo stesso nome del livello da cui stai copiando.

Proprietà del livello


Si noti che per farlo funzionare, è necessario almeno creare una funzione e digitare il suo FID, quindi modificare l'attributo dal valore predefinito. Altrimenti, si finisce con un NID FID.
Techie_Gus,

5

Vorrei aggiungere al post di Vinayan e menzionare brevemente la funzione rownum , poiché è molto simile e in alcuni casi potrebbe essere un po 'più conveniente.

inserisci qui la descrizione dell'immagine

id restituisce l' ID funzione , il che significa che inizia sempre da zero .
rownum restituisce il numero della riga , il che significa che inizia da una .

inserisci qui la descrizione dell'immagine

Quindi, fondamentalmente, se vuoi che l'incremento automatico inizi da 0, vai a $ id , e se vuoi che inizi da 1, vai a $ rownum .


Provato e anche una buona soluzione davvero. Ma con questa soluzione qui se hai già alcuni ID e vuoi mantenerli la funzione rownum non è buona. Questa funzione inizia sempre con 1. Il modo sopra è considerato molto più intelligente anche se è più difficile da configurare. Quindi grazie per l'alternativa ma per ora la funzione ID è la mia soluzione preferita =)
kwoxer,

4

Questo argomento è arrivato qui: Crea Shapefile con chiave primaria di incremento automatico in QGIS

I miei suggerimenti sarebbero:

1) I database SQLITE / SpatialLite supportano l'auto-incremento su un campo impostato su INTEGER PRIMARY KEY:

In un INSERT, se alla colonna ROWID o INTEGER PRIMARY KEY non viene assegnato esplicitamente un valore, verrà riempito automaticamente con un numero intero non utilizzato, di solito quello in più rispetto al ROWID più grande attualmente in uso. Ciò è vero indipendentemente dal fatto che venga utilizzata o meno la parola chiave AUTOINCREMENT.

Ogni volta che modifichi / crei poligoni, puoi compilare i loro attributi e SQLITE gli darà un valore univoco incrementale nel campo che hai impostato su INTEGER PRIMARY KEY.

Quando sei pronto per esportare in GEOJSON, sei pronto con i tuoi ID UNICI.

2) Se si utilizzano Shapefile, creare un campo OBJECTID di tipo INTEGER e utilizzare un'espressione calcolatrice di campo per popolare quel campo ogni volta che si modificano / creano poligoni e è necessario esportarli. Perderai l'ID originale di una volta un poligono, ma questo è l'unico modo per raggiungere questo obiettivo usando .SHP. (Dovrò trovare l'espressione del calcolatore di campo).

PostGIS è un'altra fonte di dati che potresti voler esplorare, anche se più di un grosso sforzo rispetto a SQLITE, potresti trovare valore in un sistema mentre avanzi ...


Grazie per aver spiegato. Ma non penso che sarà una buona soluzione invece di un'opzione auto_increment direttamente nello strumento. Ho già così tanti formati di dati e non voglio ancora un altro strumento. Forse dovrei scrivere un addon per quello quando avrò del tempo ...
Kwoxer,

Potrebbe essere più facile abbandonare il .SHP! Chissà quali nuove iniziative ti porteranno su ...
DPSSpatial

2

Vecchio post, ma per chiunque cercasse una soluzione rapida, la mia era quella di creare un campo con $ ID + 1 e verrà generato automaticamente a partire da 1!


2

Aggiornamento per QGIS 3

So di essere abbastanza in ritardo per questo, ma sempre buono per dare eventuali aggiornamenti:

In QGIS 3 ora esiste uno strumento nativo che può essere usato per fare esattamente questo lavoro e si chiama "Aggiungi campo autoincrementale"

Non è necessario utilizzare un'espressione nella calcolatrice sul campo o eseguire alcuna codifica, ma sono comunque tutti molto utili e utili da sapere.

inserisci qui la descrizione dell'immagine


1

Il modo più semplice per farlo sarebbe probabilmente con uno script Python o forse è possibile con il calcolatore di campo. Scusa se non ne ho uno per te, forse qualcun altro lo farà. Nel frattempo, avrei cercato uno script Python per questo. Ho visto molto su questo per ArcGIS, ma sono sicuro che ci sia qualcosa là fuori per QGIS.


Bene, sarebbe meglio se non ci fosse davvero nulla, una richiesta di funzionalità. Non voglio uno script Python aggiuntivo a QGIS anche se potrebbe essere una soluzione con un clic. Ma grazie.
Kwoxer,

1

Se non hai bisogno di qualcosa di umanamente digeribile, ora c'è una soluzione semplice: nelle proprietà del campo, seleziona "Generatore UUID" e lascia tutto vuoto.

Ciò creerà automaticamente un UUID nel campo. Non amichevole come un numero semplice (come da $ id o $ rownum), ma genera l'UUID fin dall'inizio, quindi nessun passaggio successivo.inserisci qui la descrizione dell'immagine


0

Vorrei aggiungere che questo non sembra funzionare quando si utilizzano livelli di database postgreSQL. $ ID e $ rownum restituiscono tutti 0. PostgreSQL 9.6 QGIS 2.18.12


0

queste soluzioni non funzionavano più per me in QGIS 2.01 Dufour. Digitare $idsu un campo nuovo o esistente chiamato 'id' nel campo di input dell'espressione mi ha dato un errore "L'espressione non è valida"

Quello che ha funzionato è stato digitare la funzione $rownume quindi fare clic su "OK"

inserisci qui la descrizione dell'immagine


0

puoi semplicemente eliminare la prima colonna (id) e crearne una nuova "Come campo virtuale" inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.