script per backup periodici di database postgresql/postgis

Una delle cose belle di Linux e’ che ti spinge a curiosare nel suo “mondo”; si scoprono cose davvero fantastiche per quanto semplici.

Per esempio: avevo necessita’ di eseguire un backup di alcuni database potgresql/postgis in maniera continua (su HD removibile HP RDX 320 GB)

Ho creato uno script per fare tutto cio’; in un secondo momento ho modificato il CRONTAB della macchina per fare in modo che questo script venga eseguito ad una certa ora del giorno.

Partiamo dall’inizio:

– con l’editor “nano” creiamo il file “backup.sh” nella directory “/usr/bin/

cd /usr/bin

nano backup.sh

e lo compiliamo nel modo seguente:

#!/bin/bash

export PGPASSWORD=”mia_password_del_db” && pg_dump -h localhost -U user -c -d -R -v nome_database -n nome_schema > /percorso/dove/salvare/il/file.sql

L’istruzione “export PGPASSWORD=”mia_password_del_db” permette di dichiarare la password stessa senza doverla inserire ogni volta che lo script viene lanciato (questo renderebbe inutile un backup notturno in quanto il prompt si aspetterebbe l’immissione della pwd a mano).

Chiudiamo nano e salviamo il file. Rendiamolo eseguibile (da root):
# chmod +x /usr/bin/backup.sh

Modifichiamo il crontab per eseguirlo ad una certa ora del giorno:

@ crontab -e

e inseriamo le seguent righe:

00 04 * * * /usr/bin/backup.sh

In questo modo il backup viene lanciato ogni giorno alle 4 di mattina.

L’unita’ di tutte le scienze e’ trovata nella geografia

Colgo la bellissima proposta di Andrea Borruso (che ringrazio!) di divulgare questo post in maniera coordinata ad altri blogger.

La riforma della scuola in approvazione in questi giorni, ed in particolar modo delle scuole superiori, releghera’ la geografia ad un ruolo marginale e sempre piu’ debole. Per questo ci uniamo all’AIIG (Associazione Italiana Insegnanti di Geografia) che ha lanciato una raccolta di firme.

L’unità di tutte le scienze è trovata nella geografia. Il significato della geografia è che essa presenta la terra come la sede duratura delle occupazioni dell’uomo. (John Dewey)

Alle elementari avevo un maestro che insegnava geografia e che tirava giù una carta geografica del mondo davanti alla lavagna. Avevo un compagno di classe al sesto anno che un giorno ha alzato la mano e ha indicato la costa orientale del Sudamerica; poi ha indicato la costa occidentale dell’Africa e ha chiesto: «Sono state mai unite?». E il maestro ha risposto: «Certo che no, è una cosa ridicola!». Lo studente cominciò a fare uso di droghe e sparì. L’insegnante è diventato consigliere scientifico dell’attuale amministrazione (ndr Bush). (dal film documentario statunitense del 2006 “Una scomoda verità”,  diretto da Davis Guggenheim).

Nella mia geografia ancora sta scritto che tra Catanzaro e il mare si trovano i Giardini delle Esperidi. (George Robert Gissing, da Sulle rive dello Jonio).

L’arma del giornalista è la penna o la macchina da scrivere. L’arma del giornalista sotto vetro smerigliato è la bacchetta o la carta geografica. (Sergio Saviane).

Lungo la costa dell’Africa del Sud-Ovest, delimitato da montagne di origine vulcanica da una parte e dall’Atlantico dall’altra, si stende uno dei più antichi e selvaggi deserti della terra. I geografi chiamano questa zona la Costa degli Scheletri, perché le sue spiagge sono disseminate dei relitti delle navi che vi hanno fatto naugùfragi. (Ronald Schiller da “Nel mondo dei diamanti”).

Insieme a:


QGIS – spostamento di piu’ oggetti vettoriali

Ho digitalizzato una serie di poligoni (SHP) avendo come base una carta raster georeferenziata in GB Fuso Ovest.

Una volta terminata la digitalizzazione e “acceso” un raster relativo all’ortofoto della zona mi sono accorto che gli oggetti erano tutti traslati rigidamente verso Nord di qualche metro (7.81 per la precisione). Mi era stato chiesto di produrre uno snapshot del layer di  interesse sovrapposto all’ortofoto. Non dovendo fare un lavoro di estrema precisione ho pensato di “traslare” tutti gli oggetti del layer poligonale creato della distanza necessaria.

Abilitata la modalita’ “modifca” per lo SHP in questione viene attivato lo strumento di spostamento.

Lo strumento "muovi elemento" nei tool didigitalizzazione agisce su un solo oggetto

Ho selezionato tutti gli oggetti e provato a spostarli. Non sapevo che lo strumento per spostare oggetti funziona sono su un oggetto alla volta. Come fare? Cercando tra i vari plugin ho trovato “qgsAffine”. E fa proprio al caso mio.

Consente di effettuare operazioni di scalatura, rotazione e traslazione su tutti gli oggetti di un layer o soltanto su quelli precedentemente selezionati (e’ necessario avere abilitato la modalita’ “modifica”). Nel mio caso ho impostato soltanto una traslazione verso sud (negativa, quindi ho anteposto il segno “-“) di 7.81 m.

La finestra di impostazione dei parametri del plugin "Vector Affine transformation"

Cliccando su “Run” vengono traslati (o ruotati/scalati) gli oggetti e per il layer viene automaticamente disattivata la modalita’ “modifica”.

OSM e Haiti earthquake

OSM e’ entrata in azione anche per contribuire alla realizzazione della cartografia della zone colpite dal terremoto ad Haiti.

“La mancanza di mappe aggiornate alla reale situazione post terremoto rischiava di compromettere le attività di salvataggio. Appena sono state rese disponibili foto aeree delle zone colpite, i nostri volontari si sono, indipendentemente, messi all’opera e hanno iniziato a inserire dati nel nostro database, questo ha portato, nel giro di
poche ore, alla generazione di mappe aggiornate dell’isola, con indicate tutte le strade ancora percorribili, le posizioni dei campi profughi, ponti inagibili, eccetera.

Le mappe vengono continuamente aggiornate e sono rese immediatamente disponibili per qualsiasi uso, commerciale, o umanitario. Esse sono scaricabili sui navigatori portatili e usate sui cellulari dotati di GPS.

E’ uno straordinario esempio di come un approccio partecipato puo’ funzionare anche in questi drammatici casi”

fonte: http://wiki.openstreetmap.org/wiki/WikiProject_Haiti/Press_info

QGIS hackfest a Pisa – 18-22 marzo 2010

E’ ufficiale: si terra’ a Pisa, dal 18 al 22 marzo 2010, presso il Parco di San Rossore-Migliarino-Massaciuccoli (sala Gronchi) il 3° QGIS hackfest:Gli sviluppatori di QGIS si troveranno per dare forte impulso allo sviluppo del progetto, risoluzione di bug, traduzioni,….Molto probabilmente ci sara’ la possibilita’ di seguiri anche alcuni flashcourses (tipo “Scrivere un plugin in python per QGIS”); a pagamento, in modo da avere le risorse per pagare la trasferta agli sviluppatori che vengono a donare il loro tempo.

Si puo’ partecipare a molti livelli diversi, dal supporto logistico, all’hard coding, passando per la documentazione, traduzione, bug checking, e molte altre cose.
Per ulteriori informazioni contattare Paolo Cavallini (cavallini at faunalia dot it).

Screenshot con Nokia N810

Screenshot maemo mapper - 1

Avevo bisogno di recuperare alcuni screeshot del Nokia N810. Non esiste un programma pre-installato che consenta di farlo. Dopo avere cercato in rete ho trovato un how-to interessate che spiega vari metodi. Ne ho provato uno (anche perche’ per l’N810 non sono installabili alcuni pacchetti); ecco di cosa si tratta.

Installare prima il pacchetto “osso-screenshot-tool“. E’ un programmino da riga di comando che funzioona con la seguente sintassi.

$ osso-screenshot-tool nome_file.png

Questo crea una immagine della videata al momento del lancio del programma. Ma questo significa che crea una “fotografia” della shell :-). Ci vorrebbe una opzione di “delay” (ritardo) che viene contemplata in un altro pacchetto chiamato “screenshot-tool” disponibile per maemo 5 (sul mio N810 e’ installato maemo 4).

Per ovviare a questo inconveniente ho installato (/in base alle indicazioni riportate nell’howto indicato sopra) il pacchetto “maemo-screen-grabber“. Una volta fatto troviamo una nuova voce in “Extra” chiamata “Maemo screengrabber”. Cliccando su di essa viene eseguito uno screenshot ritardato di 5 secondi; sono piu’ che sufficienti (il tempo di attesa puo’ essere modificato: devo ancora indagare sul come) per andare ad attivare la videata di interesse (magari preparata in precedenza).

Per avviare screenshot grabber: Extra -> Maemo Screengrabber

Otteniamo cosi’ un’ immagine (PNG) che viene salvata automaticamente all’interno della directory “Immagini”. Il nome e’ il TIMESTAMP dello screenshot. 🙂

Un altro esempio con maemo mapper attivo:

Screenshot maemo mapper - 2

OCR con strumenti open source

Esistono strumenti open source per effettuare una ricognizione OCR di documenti. Ho provato il programma “tesseract“. E’ un programmino da riga di comando. Si installa via apt-get o synaptic. E’ necessario installare anche sane, sane-utils, imagemagick, unpaper, tesseract-ocr, e tesseract-ocr-eng oltre a tesseract-ocr-ita (per la lingua italiana).

Una volta installato effettuare la scansione della/e pagina/e volute (impostare una risoluzione di almeno 300 dpi per avere una buona qualità) quindi lanciare il programma, per es:

$ tesseract nome_file.tif nome_file_output -l ita

In questo modo viene processato il file nome_file.tif e viene prodotto in output nome_file_output.txt (l’estesnione .txt viene aggiunta dal software); il processamento avviene in lingua italiana. Possibilmente usare immagini in formato TIF.

Ottima questa guida in proposito.

geopy | geocoding con gmaps

Ho provato geopy. Un fenomeno. Cito dal sito geopy makes it easy for developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders and other data sources, such as wikis.”

Per installarlo ho seguito le istruzioni riportate in questa pagina.

svn co http://geopy.googlecode.com/svn/trunk/ geopy-trunk
cd geopy-trunk/
sudo python setup.py install

(al primo tentativo mi avvisava della mancanza di un pacchetto richiamto dal setup; si trattava di “python-setuptools” che ho poi installato via apt-get).

Fatto questo ho seguito le istruzioni della pagina “gettingstarted“.

In particolare questo metodo (dopo aver reperito una APIKEY da qui):

Lanciato python con:

$ python

mi si presenta il prompt >>>. Inserire la seguente chiamata:

>>> from geopy import geocoders

quindi ho provato con il codice di prova indicato nella pagina:

>>> g = geocoders.Google('YOUR_API_KEY_HERE')  [INVIO]
>>> place, (lat, lng) = g.geocode("10900 Euclid Ave in Cleveland")  [INVIO]
>>> print "%s: %.5f, %.5f" % (place, lat, lng)  [INVIO]
10900 Euclid Ave, Cleveland, OH 44106, USA: 41.50489, -81.61027

E tutto e’ andato a buon fine.

Ora sto provando con alcuni civici del comune in cui lavoro: devo dire che i risultati sono molto confortanti. Devo creare uno scriptino per automatizzare l’inserimento degli indirizzi ed avere in output un file popolato con le coppi di coordinate (lat/long)…tosto davvero!


pgrouting | calcolo percorso minimo tra due punti

Prima di tutto e’ necessario creare un database Postgresql ed aggiungerci l’estensione spaziale Postgis.

come utente postgres si entra in un database esistente o in un template:

# psql template1;

– Creiamo il database e impostiamo la proprietà all’utente (nel nostro caso “sit”):

template1=# CREATE DATABASE routing OWNER sit template template_gis;

il template_gis e’ stato creato a priori (database con estensioni spaziali postgis incorporate; questo per evitare ogni volta di dover aggiungere le tabelle “geometry_column” e “spatial_ref_sys”);

– Ci colleghiamo al database appena creato:

template1=# /connect routing;

e diamo i permessi necessari all’utente “sit” sulla tabella spaziali:

routing=# GRANT ALL ON geometry_columns to sit;
routing=# GRANT SELECT ON spatial_ref_sys to sit;

– Aggiungiamo le funzioni di routing (dopo essere usciti dal database ed esserci autenticati come utente “postgres”):

# psql -d routing -f /usr/share/postlbs/routing_core.sql

# psql -d routing -f /usr/share/postlbs/routing_wrappers.sql

# psql -d routing -f /usr/share/postlbs/routing_topology.sql

– Reperiamo i dati: nel mio caso ho reperito il planet italiano dal sito http://download.geofabrik.de/osm/europe/. Ho scaricato gli SHP. Dopo aver fatto un clip dei dati sul confine regionale di interesse (Veneto) medianti i preziosissimi ftools di qgis ho ottenuto il grafo stradale del territorio veneto.

– Importiamo i dati del database mediante il modulo shp2pgsql. Ecco la sintassi del comando (con SRID settato a 4326, i dati sono in lat-long WGS84).

$ shp2pgsql -S -s 4326 /home/sit/geodatabase/shp/stradario_regione/stradario_regione_seg.shp stradario_regione routing > /home/sit/sql/stradario_regione.sql

$ psql -h localhost -U postgres -d routing -f /home/sit/sql/stradario_regione.sql

Per i passi successivi ho seguito questo ottimo tutorial ):

– Aggiungiamo 3 colonne alla tabella: una per memorizzare gli ID dei nodi iniziali, una per gli ID dei nodi finali e la’ltra per la lunghezza:

routing=> ALTER TABLE stradario_regione ADD COLUMN source integer;

routing=> ALTER TABLE stradario_regione ADD COLUMN target integer;

routing=> ALTER TABLE stradario_regione ADD COLUMN length double precision;

– Creiamo la topologia e aggiungiamo il valore della lunghezza al campo appena creato:

routing=> SELECT assign_vertex_id(‘stradario_regione’, 0.0001, ‘the_geom’, ‘gid’);

routing=> UPDATE stradario_regione SET length = length(the_geom);

– Creiamo gli indici per le colonne “source”, “target” e “the_geom”;

routing=> CREATE INDEX source_idx ON stradario_regione(source);

routing=> CREATE INDEX target_idx ON stradario_regione(target);

routing=> CREATE INDEX geom_idx ON stradario_regione USING GIST(the_geom GIST_GEOMETRY_OPS);

– Impostiamo la query di routing e salviamo il tutto in una nuova tabella chiamata “dijkstra_resust” (prima di tutto cancelliamo una eventuale tabella omonima precedentemente creata):

routing=> DROP TABLE IF EXISTS dijsktra_result;

routing=> CREATE TABLE dijsktra_result(gid int4) with oids;

routing=> SELECT AddGeometryColumn(‘dijsktra_result’, ‘the_geom’, ‘4326’, ‘MULTILINESTRING’, 2);

routing=> INSERT INTO dijsktra_result(the_geom) SELECT the_geom FROM dijkstra_sp(‘stradario_regione’, 73441, 13547);

Questa query trova il percorso minimo tra due vertici (con ID pari a 73441 e 133547).

In prima battuta, nel mio caso, ho ottenuto un messaggio d’errore per violazione di un CONSTRAINT:

ERROR: new row for relation “dijkstra_result” violates check constraint “enforce_geotype_the_geom”

Ho cancellato questo constraint (via pgadmin3) e re-impartito la query ottenendo la nuova tabella dijkstra popolata. Il risultato si può visualzzare in qgis.