[Gfoss] ST_Union e PostGIS

Massimiliano Moraca massimilianomoraca a gmail.com
Mer 13 Dic 2017 13:56:20 CET


Innanzitutto grazie a tutti per le risposte.
Mo vi rispondo uno ad uno. Sembra una minaccia ma non lo è :D

Ciao Massimiliano,
> come puoi aspettarti di avere il campo ogc_fid dopo aver fatto il
> dissolve?
> PostgreSQL ti chiede di usare un GROUP BY anche su quel campo OPPURE devi
> passarlo ad una funzione di aggregazione. Es.
> SELECT ST_Union(geom) AS geometry, min(ogc_fid) FROM dipartimenti GROUP
> BY cd_diparti;
> In questo esempio prendo l'ogc_fid più piccolo (scelta arbitraria ma
> ammissibile) tra tutti i cd_diparti aggregati (dissolved).
> Giovanni


Ciao Giovanni infatti non l'avrei usato quel campo ma mi serve per
SpatiaLite in cui quel campo è poi pescato random tra gli altri presenti
nella tabella.


> > *SELECT ST_Union(geom) AS geometry, ogc_fid, cd_diparti, dipartimenFROM
>
> > > dipartimentiGROUP BY cd_diparti;*
> > Se assecondo il messaggio mi chiede successivamente di inserire anche
> > *dipartimen
> > *ed il risultato non è il *DISSOLVE *ma la replica di ogni tupla della
> > tabella selezionata.
>
> Certo, se gruppi per "ogc_fid" e' normale, sono tutti diversi.
>
> > Eliminando *ogc_fid *e *dipartimen *e rieseguendo la query in PostGis
> > ottengo il risultato atteso.
>
> E' quello che mi attenderei anche io.
>
> > Il tutto confluirà in una *VIEW*. Ho la necessità che nella view siano
> > presenti anche le due colonne in questione per motivi di etichettatura
>
> Se dissolvi finisci con avere una unica geometria, derivante da
> diverse geometrie, ognuna col suo "ogc_fid" e "cd_diparti", come
> vuoi etichettare la nuova geometria risultante dall'unione ?
> Potresti voler vedere la lista di tutti i "ogc_fid", nel qual caso
> potresti aggregare anche quel campo, con array_agg(ogc_fid).
> --strk;
>
> Ciao Sandro, mi aspetto anche io ciò che accade se gruppo per *ogc_fid*,
il perchè mi serve è la risposta che ho dato a Giovanni in questa mail. Al
codice presente in *cd_diparti *è associato sempre lo stesso nome di
dipartimento in *dipartimen*, quindi da quella aggregazione avrei 5
geometrie ognuna con valori aggregati di quei campi.


> Ciao.
> Chiedo alcune informazioni sui dati
> Tu vuoi dissolvere una serie di geometrie in base ad un campo con valore
> comune (cd_diparti), ma i valori degli altri campi sono diversi?
> intendo dire: hai una situazione del genere?
> cd_diparti      ogc_fid
>         dipartimen
> Pippo
>         1
>         Qui
> Pippo   2
>         Qui
> Pippo   3
>         Qui
> Pluto
>         4
>         Quo
> Pluto   5
>         Quo
> Paperino
>         6
>         Qua
> il campo ogc_fid contiene la chiave primaria della tabella con la
> geometria?


Ciao Marco, come ho risposto a Sandro per ogni singolo valore di *cd_diparti
*c'è uno ed uno solo in *dipartimen*, quindi non sono diversi. Puoi vederlo
tu stesso se scarichi il file allegato alla prima mail. Il campo *ogc_fid *è
chiave primaria.

Massimiliano,
> occhio ai dettagli, a volte sono assolutamente critici.
> i due dialetti SQL supportati rispettivamente da PostgreSQL e da SQLite
> si assomigliano, ma non sono affatto identici.
> l'implementazione delle clausole GROUP BY e' uno dei punti in cui si nota
> maggiormente la diversitra' tra i due: su SQLite e' decisamente flessibile
> e molto pratica da usarsi, mentre su PostgreSQL e' molto piu' rigida e
> pedante.
> scendendo nei dettagli, SQLite non ti impone mai il vincolo per cui tutte
> le colonne presenti nel dataset devono essere obbligatoriamente definite
> nella GROUP BY oppure devono essere il risultato di una funzione di
> aggregazione. Viceversa per PostgreSQL il vincolo e' stringente.
> nota: inserire "ogc_fid" (che si suppone sia una PK) tra i risultati
> senza citarlo nella GROUP BY non ha senso logico; SQLite accetta
> tranquillamente questa condizione, ma poi scoprirai che nel
> resultset di ritorno ci troverai semplicemente un valore pescato
> a casaccio tra tutti quelli che presentano il medesimo valore
> per "cd_diparti".
> ciao Sandro


Ciao Sandro, ho notato che i due hanno linguaggi diversi per certi aspetti.
Vorrei fare in modo però di poter distribuire il geodatabase in SpatiaLite
a fine lavoro e non come un insieme di shp suddivisi in cartelle, per
questo cerco di fare attenzione alla "compatibilità" tra i due. Non so però
se è una strada perseguibile. Potrei esportare tutto come file backup di
PostGIS ma il fatto è che il ricevente non ha nè competenze GIS nè
dimestichezza con i database. Gli sto creando delle stampe e per
completezza oltre ai file immagine alla fine volevo dargli anche il
geodatabase da cui ho creato quelle stampe.
Come ho detto a Marco *ogc_fid *è chiave primaria. Avevo notato un po' di
tempo fa che nel creare le VIEW SpatiaLite ti chiede comunque un id dalla
tabella sorgente, id assegnato poi random.

Il giorno 13 dicembre 2017 12:54, <a.furieri a lqt.it> ha scritto:

> On Wed, 13 Dec 2017 12:13:37 +0100, Massimiliano Moraca wrote:
>
>> Buongiorno,
>> in QGIS con un virtual layer scrivendo questa query:
>>
>> *SELECT ST_Union(geom) AS geometry, ogc_fid, cd_diparti, dipartimenFROM
>>> dipartimentiGROUP BY cd_diparti;*
>>>
>>
>> Ottengo l'effetto dissolve che mi interessa(anche in SpatiaLite.
>>
>> La stessa query in PostGIS mi genera invece questo errore:
>>
>> *ERROR: ERRORE: la colonna "dipartimenti.ogc_fid" deve comparire nella
>>> clausola GROUP BY o essere usata in una funzione di aggregazioneLINE 3:
>>> ogc_fid, ^SQL state: 42803Character: 39*
>>>
>>
>>
> Massimiliano,
>
> occhio ai dettagli, a volte sono assolutamente critici.
> i due dialetti SQL supportati rispettivamente da PostgreSQL e da SQLite
> si assomigliano, ma non sono affatto identici.
>
> l'implementazione delle clausole GROUP BY e' uno dei punti in cui si nota
> maggiormente la diversitra' tra i due: su SQLite e' decisamente flessibile
> e molto pratica da usarsi, mentre su PostgreSQL e' molto piu' rigida e
> pedante.
>
> scendendo nei dettagli, SQLite non ti impone mai il vincolo per cui tutte
> le colonne presenti nel dataset devono essere obbligatoriamente definite
> nella GROUP BY oppure devono essere il risultato di una funzione di
> aggregazione. Viceversa per PostgreSQL il vincolo e' stringente.
>
> nota: inserire "ogc_fid" (che si suppone sia una PK) tra i risultati
> senza citarlo nella GROUP BY non ha senso logico; SQLite accetta
> tranquillamente questa condizione, ma poi scoprirai che nel
> resultset di ritorno ci troverai semplicemente un valore pescato
> a casaccio tra tutti quelli che presentano il medesimo valore
> per "cd_diparti".
>
> ciao Sandro
>
> _______________________________________________
> Gfoss a lists.gfoss.it
> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> Questa e' una lista di discussione pubblica aperta a tutti.
> I messaggi di questa lista non hanno relazione diretta con le posizioni
> dell'Associazione GFOSS.it.
> 801 iscritti al 19/07/2017
>


Maggiori informazioni sulla lista Gfoss