Buon pomeriggio, ho due domande sulla possibilità di fare delle operazioni
in SQL con PostGIS:
1 - Ho dovuto eliminare dei comuni da un vettore poligonale. Su questo
vettore in precedenza avevo usato ST_Union per effettuare una dissolvenza in
macro aree (diciamo province anche se non lo sono ma è per rendere l'idea).
Posto che avrei potuto fare una view tempo fa e risolvere ma mi fu detto che
i dati erano corretti e definitivi. Siccome sono venuti fuori errori di
nuovo(la terza volta in 2 settimane) e non mi va di rifare le
dissolvenze(sono più di una) e riaggiornare i filtri nelle viste in QGIS
avevo pensato di usare questo script:
/UPDATE tabella_dissolvenza
SET gemetry = (SELECT ST_Union(geometry) as gemetry, tipo FROM
tabella_dissolvenza GROUP BY tipo);/
Giustamente mi compare questo messaggio /ERRORE: la sottoquery deve
restituire solo una colonna/ Il messaggio è chiarissimo e ci sarei dovuto
arrivare prima.
La mia domanda è(finalmente!): c'è un modo per aggiornare in automatico le
geometrie del vettore in cui ho applicato la dissolvenza o mi tocca rifare
le tabella(che tramuterei in view a questo punto)?
2 - Ho un atlante in cui dovrei mascherare i comuni confinanti con quello di
mio interesse senza farli sparire ma attenuando i loro tematismi. Ho creato
un vettore di copertura con un buco su un villaggio di prova ed a questo
vettore ho dato un riempimento bianco al 50%. In questo modo ho ottenuto il
mio risultato ma vale solo per il comune test e dover fare una copertura ad
hoc per ogni comune renderebbe inutile l'atlante. C'è un modo secondo voi
per automatizzare la generazione del buco in funzione dello zoom effettuato
dall'atlante? Il tutto sempre in QGIS e questa domanda non per forza deve
avere SQL come soluzione.
On Thu, Feb 22, 2018 at 08:57:37AM -0700, Massimiliano Moraca wrote:
/UPDATE tabella_dissolvenza
SET gemetry = (SELECT ST_Union(geometry) as gemetry, tipo FROM
tabella_dissolvenza GROUP BY tipo);/
Giustamente mi compare questo messaggio /ERRORE: la sottoquery deve
restituire solo una colonna/ Il messaggio è chiarissimo e ci sarei dovuto
arrivare prima.
La mia domanda è(finalmente!): c'è un modo per aggiornare in automatico le
geometrie del vettore in cui ho applicato la dissolvenza o mi tocca rifare
le tabella(che tramuterei in view a questo punto)?
Se il numero dei tipi e' lo stesso di prima puoi aggiornare
la tabella cosi':
WITH nuova_tabella_dissolvenza AS (
SELECT ST_Union(geometry) as gemetry, tipo FROM
tabella_dissolvenza GROUP BY tipo
)
UPDATE tabella_dissolvenza o
SET o.geometry = n.geometry
FROM nuova_tabella_dissolvenza n
WHERE o.tipo = n.tipo.
PostgreSQL supporta le "materialized view" se vuoi tramutare la
tabella in qualcosa di piu' stabile di una view ma piu' facilmente
aggiornabile di una tabella. Occhio che usare ST_Union in una view
puo' precluderti la possibilita' di aggiornare PostGIS nel caso
in cui l'aggregato ST_Union cambi il nome di un attributo o qualcosa
di simile.
Ho provato con la tua indicazione creando un vettore e riproducendo il caso
mio. Lo script è questo:
* WITH nuova_tabella_dissolvenza AS (*
* SELECT ST_Union(geom) as geom, tipo FROM*
* update_dissolve GROUP BY tipo*
* )*
* UPDATE update_dissolve o*
* SET o.geom = n.geom*
* FROM nuova_tabella_dissolvenza n*
* WHERE o.tipo = n.tipo;*
Mi compare questo errore però:
*ERROR: ERRORE: la colonna "o" della relazione "update_dissolve" non
esiste*
*LINE 6: SET o.geom = n.geom*
* ^*
*SQL state: 42703*
*Character: 157*
Il giorno 22 febbraio 2018 17:56, Sandro Santilli <strk@kbt.io> ha scritto:
On Thu, Feb 22, 2018 at 08:57:37AM -0700, Massimiliano Moraca wrote:
> /UPDATE tabella_dissolvenza
> SET gemetry = (SELECT ST_Union(geometry) as gemetry, tipo FROM
> tabella_dissolvenza GROUP BY tipo);/
>
> Giustamente mi compare questo messaggio /ERRORE: la sottoquery deve
> restituire solo una colonna/ Il messaggio è chiarissimo e ci sarei dovuto
> arrivare prima.
>
> La mia domanda è(finalmente!): c'è un modo per aggiornare in automatico
le
> geometrie del vettore in cui ho applicato la dissolvenza o mi tocca
rifare
> le tabella(che tramuterei in view a questo punto)?
Se il numero dei tipi e' lo stesso di prima puoi aggiornare
la tabella cosi':
WITH nuova_tabella_dissolvenza AS (
SELECT ST_Union(geometry) as gemetry, tipo FROM
tabella_dissolvenza GROUP BY tipo
)
UPDATE tabella_dissolvenza o
SET o.geometry = n.geometry
FROM nuova_tabella_dissolvenza n
WHERE o.tipo = n.tipo.
PostgreSQL supporta le "materialized view" se vuoi tramutare la
tabella in qualcosa di piu' stabile di una view ma piu' facilmente
aggiornabile di una tabella. Occhio che usare ST_Union in una view
puo' precluderti la possibilita' di aggiornare PostGIS nel caso
in cui l'aggregato ST_Union cambi il nome di un attributo o qualcosa
di simile.
Il giorno 22 febbraio 2018 18:46, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:
Si i tipi sono gli stessi
Ho provato con la tua indicazione creando un vettore e riproducendo il
caso mio. Lo script è questo:
* WITH nuova_tabella_dissolvenza AS (*
* SELECT ST_Union(geom) as geom, tipo FROM*
* update_dissolve GROUP BY tipo*
* )*
* UPDATE update_dissolve o*
* SET o.geom = n.geom*
* FROM nuova_tabella_dissolvenza n*
* WHERE o.tipo = n.tipo;*
Mi compare questo errore però:
*ERROR: ERRORE: la colonna "o" della relazione "update_dissolve" non
esiste*
*LINE 6: SET o.geom = n.geom*
* ^*
*SQL state: 42703*
*Character: 157*
Il giorno 22 febbraio 2018 17:56, Sandro Santilli <strk@kbt.io> ha
scritto:
On Thu, Feb 22, 2018 at 08:57:37AM -0700, Massimiliano Moraca wrote:
> /UPDATE tabella_dissolvenza
> SET gemetry = (SELECT ST_Union(geometry) as gemetry, tipo FROM
> tabella_dissolvenza GROUP BY tipo);/
>
> Giustamente mi compare questo messaggio /ERRORE: la sottoquery deve
> restituire solo una colonna/ Il messaggio è chiarissimo e ci sarei
dovuto
> arrivare prima.
>
> La mia domanda è(finalmente!): c'è un modo per aggiornare in automatico
le
> geometrie del vettore in cui ho applicato la dissolvenza o mi tocca
rifare
> le tabella(che tramuterei in view a questo punto)?
Se il numero dei tipi e' lo stesso di prima puoi aggiornare
la tabella cosi':
WITH nuova_tabella_dissolvenza AS (
SELECT ST_Union(geometry) as gemetry, tipo FROM
tabella_dissolvenza GROUP BY tipo
)
UPDATE tabella_dissolvenza o
SET o.geometry = n.geometry
FROM nuova_tabella_dissolvenza n
WHERE o.tipo = n.tipo.
PostgreSQL supporta le "materialized view" se vuoi tramutare la
tabella in qualcosa di piu' stabile di una view ma piu' facilmente
aggiornabile di una tabella. Occhio che usare ST_Union in una view
puo' precluderti la possibilita' di aggiornare PostGIS nel caso
in cui l'aggregato ST_Union cambi il nome di un attributo o qualcosa
di simile.
On Thu, Feb 22, 2018 at 06:46:33PM +0100, Massimiliano Moraca wrote:
Si i tipi sono gli stessi
Ho provato con la tua indicazione creando un vettore e riproducendo il caso
mio. Lo script è questo:
* WITH nuova_tabella_dissolvenza AS (*
* SELECT ST_Union(geom) as geom, tipo FROM*
* update_dissolve GROUP BY tipo*
* )*
* UPDATE update_dissolve o*
* SET o.geom = n.geom*
* FROM nuova_tabella_dissolvenza n*
* WHERE o.tipo = n.tipo;*
Mi compare questo errore però:
*ERROR: ERRORE: la colonna "o" della relazione "update_dissolve" non
esiste*
*LINE 6: SET o.geom = n.geom*
* ^*
Mi da questo messaggio ma la geometria del vettore resta la stessa
Il giorno 22 febbraio 2018 20:44, Sandro Santilli <strk@kbt.io> ha scritto:
On Thu, Feb 22, 2018 at 06:46:33PM +0100, Massimiliano Moraca wrote:
> Si i tipi sono gli stessi
>
> Ho provato con la tua indicazione creando un vettore e riproducendo il
caso
> mio. Lo script č questo:
>
> * WITH nuova_tabella_dissolvenza AS (*
> * SELECT ST_Union(geom) as geom, tipo FROM*
> * update_dissolve GROUP BY tipo*
> * )*
> * UPDATE update_dissolve o*
> * SET o.geom = n.geom*
> * FROM nuova_tabella_dissolvenza n*
> * WHERE o.tipo = n.tipo;*
>
> Mi compare questo errore perň:
>
> *ERROR: ERRORE: la colonna "o" della relazione "update_dissolve" non
> esiste*
> *LINE 6: SET o.geom = n.geom*
> * ^*
On Thu, Feb 22, 2018 at 09:22:34PM +0100, Massimiliano Moraca wrote:
Fatto ma non va.
*UPDATE 4*
*Query returned successfully in 179 msec.*
Mi da questo messaggio ma la geometria del vettore resta la stessa
Rileggendo la query mi sono accorto che sta usando la stessa tabella
target come sorgente per il dissolve, e' ovviamente sbagliato. Devi
adattarlo alla tua situazione. Non e' "update_dissolve" a contenere
le geometrie non-dissolte, giusto ? Quindi in
"nuova_tabella_dissolvenza" devi selezionare FROM la tabella giusta...
WITH nuova_tabella_dissolvenza AS (
SELECT ST_Union(geom) as geom, tipo FROM
:tabella_sorgente_giusta: GROUP BY tipo
)
UPDATE update_dissolve o
SET o.geom = n.geom
FROM nuova_tabella_dissolvenza n
WHERE o.tipo = n.tipo;
Giusto! Non me ne ero accorto ed infatti funziona
Lo applicherò alle tabelle del progetto.
Grazie
Il giorno 22 febbraio 2018 23:06, Sandro Santilli <strk@kbt.io> ha scritto:
On Thu, Feb 22, 2018 at 09:22:34PM +0100, Massimiliano Moraca wrote:
> Fatto ma non va.
>
> *UPDATE 4*
>
> *Query returned successfully in 179 msec.*
>
> Mi da questo messaggio ma la geometria del vettore resta la stessa
Rileggendo la query mi sono accorto che sta usando la stessa tabella
target come sorgente per il dissolve, e' ovviamente sbagliato. Devi
adattarlo alla tua situazione. Non e' "update_dissolve" a contenere
le geometrie non-dissolte, giusto ? Quindi in
"nuova_tabella_dissolvenza" devi selezionare FROM la tabella giusta...
WITH nuova_tabella_dissolvenza AS (
SELECT ST_Union(geom) as geom, tipo FROM
:tabella_sorgente_giusta: GROUP BY tipo
)
UPDATE update_dissolve o
SET o.geom = n.geom
FROM nuova_tabella_dissolvenza n
WHERE o.tipo = n.tipo;
per la domanda 2 puoi stilizzare il vettore di copertura in base alla
variabile @atlas feature...
totò ha un tutorial credo...
Il 23/feb/2018 10:25 AM, "Massimiliano Moraca" <massimilianomoraca@gmail.com>
ha scritto:
Giusto! Non me ne ero accorto ed infatti funziona
Lo applicherò alle tabelle del progetto.
Grazie
Il giorno 22 febbraio 2018 23:06, Sandro Santilli <strk@kbt.io> ha
scritto:
> On Thu, Feb 22, 2018 at 09:22:34PM +0100, Massimiliano Moraca wrote:
> > Fatto ma non va.
> >
> > *UPDATE 4*
> >
> > *Query returned successfully in 179 msec.*
> >
> > Mi da questo messaggio ma la geometria del vettore resta la stessa
>
> Rileggendo la query mi sono accorto che sta usando la stessa tabella
> target come sorgente per il dissolve, e' ovviamente sbagliato. Devi
> adattarlo alla tua situazione. Non e' "update_dissolve" a contenere
> le geometrie non-dissolte, giusto ? Quindi in
> "nuova_tabella_dissolvenza" devi selezionare FROM la tabella giusta...
>
> WITH nuova_tabella_dissolvenza AS (
> SELECT ST_Union(geom) as geom, tipo FROM
> :tabella_sorgente_giusta: GROUP BY tipo
> )
> UPDATE update_dissolve o
> SET o.geom = n.geom
> FROM nuova_tabella_dissolvenza n
> WHERE o.tipo = n.tipo;
>
> --strk;
>
_______________________________________________
Gfoss@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.
796 iscritti al 28/12/2017
Ciao Amedeo, per la domanda 2 ho risolto con un plugin apposito che non
conoscevo, si chiama Mask e fa quello che mi serve. Non ho verificato ma a
memoria mi pare che Salvatore con i filtri mascherava parte dei dati.
Il giorno 23 febbraio 2018 15:46, Amedeo Fadini <amefad@gmail.com> ha
scritto:
per la domanda 2 puoi stilizzare il vettore di copertura in base alla
variabile @atlas feature...
totò ha un tutorial credo...
Il 23/feb/2018 10:25 AM, "Massimiliano Moraca" <
massimilianomoraca@gmail.com> ha scritto:
Giusto! Non me ne ero accorto ed infatti funziona
Lo applicherò alle tabelle del progetto.
Grazie
Il giorno 22 febbraio 2018 23:06, Sandro Santilli <strk@kbt.io> ha
scritto:
> On Thu, Feb 22, 2018 at 09:22:34PM +0100, Massimiliano Moraca wrote:
> > Fatto ma non va.
> >
> > *UPDATE 4*
> >
> > *Query returned successfully in 179 msec.*
> >
> > Mi da questo messaggio ma la geometria del vettore resta la stessa
>
> Rileggendo la query mi sono accorto che sta usando la stessa tabella
> target come sorgente per il dissolve, e' ovviamente sbagliato. Devi
> adattarlo alla tua situazione. Non e' "update_dissolve" a contenere
> le geometrie non-dissolte, giusto ? Quindi in
> "nuova_tabella_dissolvenza" devi selezionare FROM la tabella giusta...
>
> WITH nuova_tabella_dissolvenza AS (
> SELECT ST_Union(geom) as geom, tipo FROM
> :tabella_sorgente_giusta: GROUP BY tipo
> )
> UPDATE update_dissolve o
> SET o.geom = n.geom
> FROM nuova_tabella_dissolvenza n
> WHERE o.tipo = n.tipo;
>
> --strk;
>
_______________________________________________
Gfoss@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.
796 iscritti al 28/12/2017