Postgresql | sommare i valori di diversi campi

4 Marzo 2009

Avendo necessità di dover calcolare il valore di un campo di una tabella (chiamiamolo “somma”) come somma dei valori di “n” campi ho eseguito la seguente query:

#= UPDATE nome_tabella SET somma=(campo1 + campo2 + campo3 + ……. + campon);


postgresql | archiviazione di immagini

13 Febbraio 2009

Per archiviare le immagini in un db postgreSQL ci sono 2 metodi: salvare l’immagine direttamente nel database (con formato dati BLOB) oppure memorizzare solamente il percorso al file immagine. Questo secondo metodo risulta più pulito: in fase di dump del database le immagini vengono mantenute all’esterno del db.
Si crea una tabella “foto”:
nome_database=# CREATE TABLE foto (id integer NOT NULL, nome varchar(50), image_path varchar(100); // inserimento del percorso al file
Si popola la tabella creata:
nome_database=# INSERT INTO foto VALUES (‘1′,’foto01′,’/percorso/al/file/immagine/image001.png’);
Si concedono i GRANT di selezione agli utenti desiderati.
Le immagini possono essere visualizzate via PHP su browser web. Il codice PHP per la navigazione vine mandato al altro post.


postgis | conteggio punti ricadenti all’interno di poligoni

12 Febbraio 2009

Questo metodo consente di contare il numero di punti ricadenti all’interno di poligoni mediante instruzione SQL in postGIS.

Partiamo da un esempio: siamo in possesso di uno strato poligonale (i.e. una griglia a maglia quadrata di lato 100m) e di uno strato puntuale (i.e. i punti che individuano antenne dislocate sul territorio). Lo scopo è quello di contare quante antenne ricadono all’interno di ogni quadrato di 100m.

La procedura illustrata crea una nuova tabella con il conteggio dei punti cercati.

nome_datbase=# CREATE TABLE nome_tabella AS SELECT tabella_polygon.cat, COUNT(id) AS count FROM tabella_point,tabella_polygon WHERE tabella_point.the_geom && tabella_polygon.the_geom AND CONTAINS (tabella_polygon.the_geom, tabella_point.the_geom) GROUP BY tabella_polygon.cat;

dove:

- tabella_polygon è la tabella che contiene le griglie;

- tabella_point è la tabella che contiene le antenne;

- tabella_polygon.cat rappresenta un campo id univoco (il cat proviene da una esportazione di dati da GRASS);


postgresql | elencare tutti i valori (non ripetuti) di un campo

12 Febbraio 2009

La parola chiave DISTINCT esclude dai risultati le righe duplicate.

Es: vogliamo elencare tutti i valori che sono contenuti nel campo “nome_via” di una tabella contenente i nomi di tutte le strade. Può succedere che esistano strade “spezzate” in più tratti ed in un database geometrico (PostGIS) siano memorizzati più archi di strada con lo stesso nome. DISTINCT consente di elencare i valori non ripetuti:

nome_database=# SELECT DISTINCT nome_via FROM nome_tabella_strade;


postgresql | memorizzare data e ora di inserimento record

12 Febbraio 2009

In PostgreSQL è possibile creare un campo (in una tabella) di tipo TIMESTAMP che viene aggiornato con data e ora corrente al momento dell’inserimento di un record.
Per fare ciò creare una colonna di tipo TIMESTAMP e impostare il valore di predefinito (DEFAULT) a “now()” che corrisponde a CURRENT_TIMESTAMP.


PostGIS | creare una colonna che contenga i centroidi del poligoni (di un layer poligonale)

11 Febbraio 2009

Per prima cosa creare la colonna geometrica che conterrà le coordinate dei centroidi:

nome_database=# SELECT ADDGEOMETRYCOLUMN (‘public’,'nome_tabella’, ‘centroid’, ‘3003′, ‘POINT’,2);

dove:
- public indica lo schema da usare nel database;
- centroid è il nome del campo da creare;
- 3003 è il codice EPSG del sistema di reiferimento da usare;
- 2 indica le dimensioni spaziali.

Poi calcolare i centroidi e popolare il nuovo campo (colonna) creato:

nome_database=# UPDATE nome_tabella SET centroid=centroid(the_geom);

Per creare una VIEW con i centroidi:

nome_database=# CREATE VIEW centroidi AS SELECT nome_campo1.tabella_poligoni, nome_campo2.tabella_poligoni,nome_campo_i.tabella_poligoni, centroid(the_geom) FROM tabella_poligoni;


postgreSQL | campo come unione di 2 o più campi

11 Febbraio 2009

Campo come somma di 2 o più campi
Per popolare il campo di una tabella con i valori ottenuti dall’unione di altri 2 (o più) campi:
nome_database=# UPDATE nome_tabella SET nome_campo=(nome_campo1 || ‘/’ || nome_campo2);
Il simbolo “||” indica l’UNIONE; in questo caso si è interposto anche il simbolo “/” fra i valori dei due campi.

Aggiornamento di un campo in base al valore dello stesso campo in un altra tabella
nome_database=# UPDATE nome_tabella1 SET nome_campo=nome_tabella2.nome_campo FROM nome_tabella2 WHERE nome_tabella1.nome_campo=nome_tabella2.nome_campo;


unione di più geometrie con PostGIS

11 Febbraio 2009

Metodo utilizzato nel caso si vogliano unire più oggetti di uno stesso strato PostGIS (stessa tabella PotgreSQL) che hanno valori uguali di un certo campo. Es. unire tutte le aste fluviali denominate “Adige”.

nome_db=# INSERT INTO nome_tabella_unione (the_geom, nome_campo1) SELECT astext (multi(geomunion(the_geom))) AS the_geom, nome_campo1 FROM nome_tabella_originale GROUP BY nome_campo1;

La tabella unione deve essere create a priori. Attenzione ad un errore di “enforce_srid_the_geom”. Ho ovviato eliminando questo CONSTRAINT nella tabella di origine. Caricando il layer in Qgis non viene visualizzato niente; se si esporta la tabella in SHP con pgsql2shp si ottiene uno SHP funzionante.


MS Access come client di PostgreSQL

11 Febbraio 2009

Seguire i passaggi indicati qui sotto:
- Scaricare i driver ODBC di PostgreSQL da qui.
- Prendere la versione più recente (Es. psqlodbc_08_03_0300.zip)
- Decomprimere il file
- Lanciare psqlodbc.msi
- Aprire MS Access e creare un nuovo DB vuoto
- Andare su File -> Carica dati esterni -> Collega tabelle….
- Sulla finestra che compare selezionare “ODBC Database()” nel menù in basso relativo a “Files of type”
- Clickare su “Nuovo…” e selezionare il driver “PostgreSQL Unicode”
- Dare un nome alla connessione
- Clickare su “Next” e su “Connection”: compare una finestra con 2 pagine (2 pulsanti).
In pagina 1 tenere spuntate soltanto le voci:
– “Disable Genetic Optimizer”;
– “KSQO(….)”
– Recognize Unique Indexes”
e mantenere il resto come impostato di default.
In pagina 2 spuntare “LF …” e “True is -1″; togliere la spunta da “updatable Cursors”
- Dare “OK”