Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
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 #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___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Ciao Giulio, sarei curioso di vedere lo script python che hai fatto e di come hai usato una funzione di aggregazione Grazie mille! Matteo ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Il 08/02/2017 15:28, matteo ha scritto: Forse ho una soluzione migliore anche se comunque un po' "manuale".. 1. prima query sql in cui etraggo le prime vette dallo shape 2. faccio una "Selezione per posizione" in modo da avere le vette più alte **selezionate** nel layer con tutte le vette 3. aggiungo una colonna e aggiungo valori = 0 per tutti le vette e valore = 1 per le vette più alte 4. altra query sql in cui escludo le vette che hanno valore = 1 select geom, id, name, max(ele), valore from peaks where valore != 0 group by id 5. ripeto il pricedimento 2 e 3, ma al punto 3 per le "seconde" vette maggiori attribuisco un valore = 2 6. altra query sql in cui escludo sia il valore = 1 che valore = 3 funziona ;) ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user Salve, ho realizzato uno script in pyqgis che farebbe al caso tuo, svolge il compito in una sola passata, dopodichè hai un campo con gli ordinali della tua selezione su cui fare il filtro. Potresti farmi avere il tuo layer cosi che possa testarlo e passartelo oppure se preferisci lo adatti direttamente tu Saluti ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Con Postgis la cosa sarebbe semplice grazie alle funzioni finestra: https://www.postgresql.org/docs/9.3/static/functions-window.html giovanni Il 8 feb 2017 15:28, "matteo"ha scritto: > Forse ho una soluzione migliore anche se comunque un po' "manuale".. > > 1. prima query sql in cui etraggo le prime vette dallo shape > 2. faccio una "Selezione per posizione" in modo da avere le vette più > alte **selezionate** nel layer con tutte le vette > 3. aggiungo una colonna e aggiungo valori = 0 per tutti le vette e > valore = 1 per le vette più alte > 4. altra query sql in cui escludo le vette che hanno valore = 1 > > select geom, id, name, max(ele), valore from peaks > where valore != 0 > group by id > > 5. ripeto il pricedimento 2 e 3, ma al punto 3 per le "seconde" vette > maggiori attribuisco un valore = 2 > > 6. altra query sql in cui escludo sia il valore = 1 che valore = 3 > > > funziona ;) > ___ > QGIS-it-user mailing list > QGIS-it-user@lists.osgeo.org > https://lists.osgeo.org/mailman/listinfo/qgis-it-user > ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Forse ho una soluzione migliore anche se comunque un po' "manuale".. 1. prima query sql in cui etraggo le prime vette dallo shape 2. faccio una "Selezione per posizione" in modo da avere le vette più alte **selezionate** nel layer con tutte le vette 3. aggiungo una colonna e aggiungo valori = 0 per tutti le vette e valore = 1 per le vette più alte 4. altra query sql in cui escludo le vette che hanno valore = 1 select geom, id, name, max(ele), valore from peaks where valore != 0 group by id 5. ripeto il pricedimento 2 e 3, ma al punto 3 per le "seconde" vette maggiori attribuisco un valore = 2 6. altra query sql in cui escludo sia il valore = 1 che valore = 3 funziona ;) ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Caro Giulinao (e tutti), ho risolto artigianalmente (a volte sono le soluzioni migliori però).. 1. lanciare la query sul mio layer in modo che trovi i 3 elementi maggiori (sono picchi montuosi) per ogni gruppo 2. carico come nuovo layer e faccio una bella "seleziona per posizione" dove seleziono in input il layer con tutti i punti che è UGUALE al layer caricato 3. inverto la selezione (cosi ho tutti i picchi meno i 3 maggiori per ogni gruppo) e ricarico solo la selezione in SL 4. rilancio la query sul layer caricato e ottengo i, diciamo, secondi 3 picchi maggiori.. ripeto la procedura dove aggiungo alla selezione entrambi i layer dei picchi.. artigianale e brutto lo so, ma funzionale... Grazie a tutti e ovviamente, se qualcuno ha un'idea migliore e meno artigianale sono tutto orecchi Saluti Matteo ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
On 2/1/17, matteowrote: > Ciao a tutti, ciao Matteo, > ho un problemino che pensavo fosse semplice e invece mi sta facendo > diventare matto. > > Ho un layer in QGIS (caricato anche in un DB SL) dove ho una colonna > numerica e un'altra colonna con un id (diciamo di aggregazione). > > Sto inutilmente cercando di estrarre i primi 3 valori maggiori della > colonna numerica per ogni id, ovvero trasformare questa semplice query: >... > Qualche spunto? per il prelievo dei primi 3 elementi proverei a: - generare una vista ottenuta da un SELECT * FROM ORDER BY ele - aggiungerei un campo 'ord' (durante la creazione o a posteriori) autoincrementale (mi sembra si possa anche se non ne ho esperienza diretta :-) o più semplicemente si può forse utilizzare ROWID - estrarrei dalla vista i primi 3 elementi con SELETC * FROM WHERE ord < 4 (o ROWID < 4); per confinare la ricerca in ogni categoria metterei una clausola WHERE id = categoria_voluta nella prima query e ripeterei il metodo detto sopra per ogni categoria (penso che si possa anche automatizzare il tutto con istruzioni nidificate, ma. prima di smadonnare ricorda che il suggerimento arriva da uno abbastanza profano di SQL da essere perdonato per le eventuali castronerie (ma abbastanza interessato di conoscere la soluzione migliore che spero posterai); > Grazie a tutti > > Matteo ciao, giuliano ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Ciao Carlo, ci ho provato, ma credo che l'inghippo qui sia nella clausola group by. Se ordino e limito gli elementi, quello che ottengo non sono i 3 elementi maggiori per ogni gruppo, ma i 3 elementi maggiori per tutto il layer sbaglio? grazie Matteo ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Scusa… per come la vedo… potresti fare la query ed ordinarla partendo dai valori più alti, limitando la ricerca a tre elementi Ciao.. Carlo > Il giorno 01 feb 2017, alle ore 16:12, qgis-it-user-requ...@lists.osgeo.org > ha scritto: > > Sto inutilmente cercando di estrarre i primi 3 valori maggiori della > colonna numerica per ogni id, ovvero trasformare questa semplice query: > > select geom, max(ele), id from layerA > group by id > > espandendo nl'elemento maggiore per ogni ai primi 3 elementi maggiori ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Ciao Sergio, > il problema non è per nulla banale da fare con l'SQL (magari sapendo un > minimo programmare lo diventa). infatti sto pensado di passare a python e vedere cosa succede non ho postgres installato sul mio pc, cerco di tradurre per SL Grazie! Matteo ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user
[QGIS-it-user] Primi 3 elementi maggior per ogni gruppo in SpatiaLite/QGIS
Ciao a tutti, ho un problemino che pensavo fosse semplice e invece mi sta facendo diventare matto. Ho un layer in QGIS (caricato anche in un DB SL) dove ho una colonna numerica e un'altra colonna con un id (diciamo di aggregazione). Sto inutilmente cercando di estrarre i primi 3 valori maggiori della colonna numerica per ogni id, ovvero trasformare questa semplice query: select geom, max(ele), id from layerA group by id espandendo nl'elemento maggiore per ogni ai primi 3 elementi maggiori Qualche spunto? Grazie a tutti Matteo ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/qgis-it-user