[QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS

Giulio Fattori giulio.fattori a tin.it
Ven 10 Feb 2017 01:10:22 PST


Il 09/02/2017 15:42, matteo ha scritto:
> Ciao Giulio,
>
> sarei curioso di vedere lo script python che hai fatto e di come hai
> usato una funzione di aggregazione
>
> Grazie mille!
>
> Matteo
>
In allegato il file da caricare nella console python, spero di essere 
stato abbastanza chiaro nei commenti per l'utilizzo

Saluti

-------------- parte successiva --------------
#Giulio Fattori 07.02.2017 - Numeratore progressiva per raggruppamento

#LO SCRIPT FUNZIONA SUL LAYER CORRENTE - LAVORARE SEMPRE SU COPIA

#Il layer deve essere preventivamente riordinato secondo i campi voluti 
#sino a 3 campi si puo utilizzare il plugin SORT AND NUMBER se usato questo automaticamente
#inserisce un campo ''order' che va inserito al posto di Pos
#occorre poi salvare l'ordinamento ottenuto, per questo  usare MMQGIS SORT impostando ''order'
#come campo di ordinamento, lo script proddurrĂ  il layer su cui lavorare "tempn.shp"
#il nome del CAMPO di raggruppamento/conteggio deve essere sostituito a 'C' nel codice 
#Inserire nel layer un campo numerico 'Pos' dove verra memorizzata la numerazione

#assegnare a C il nome campo da considerare per il raggruppamento e la numerazione
C='FOGLIO'
#assegnare a i L il nome campo valore di controllo per la stampa in console
L='order'
#assegnare a Pos il nome del campo in cui memorizzare la numerazione
#che può essere un campo esistente o aggiunto
#ricordando che deve essere numerico altrimenti il filtro non funziona
Pos='SVILUPPO'

#CANCELLIAMO LA CONSOLE
from PyQt4.QtGui import QDockWidget
consoleWidget = iface.mainWindow().findChild( QDockWidget, 'PythonConsole' )
consoleWidget.console.shellOut.clearConsole()
#otteniamo il riferimento al layer corrente
layer = qgis.utils.iface.activeLayer()
#contiamo le feature presenti
count = layer.featureCount()
#recupero il numero del nuovo campo indice nella tabella dati
col=layer.fieldNameIndex(Pos)

print 'Start Elaborazione'
layer.startEditing()
#otteniamo il riferimento al layer
feat = [feature for feature in layer.getFeatures()]
#inizializzo cursore feature
i=0
#inizializzo contatore di sequenza
k=1
#assegno 1 al primo elemento
feat[i][Pos]=k
#salvo posizione
layer.changeAttributeValue(i, col,k)
#ciclo fino alla penultima feature
while i<count-1:
    #confronto il corrente con il seguente
    if feat[i][C]==feat[i+1][C]:
        #se sono uguali incremento contatore
        k=k+1
    else:
        #se son diversi riporto contatore a 1
        k=1
    #scrivo nel campo di sottordinamento il valore del contatore
    feat[i+1][Pos]=k
    #aggiorno la feature
    layer.changeAttributeValue(i+1, col, k)
    #stampo per controllo
    print i,feat[i][C],feat[i][L],feat[i][Pos]
    #passo alla feature successiva
    i=i+1
# stampo ultimo campo    
print i,feat[i][C],feat[i][L],feat[i][Pos]
#salvo modifiche
layer.commitChanges()
print 'End Elaborazione'


Maggiori informazioni sulla lista QGIS-it-user