Archive for category mapping

18-19 (20) novembre 2010, GFOSS DAY a Foligno

L’associazione Italiana per l’Informazione Geografica Libera GFOSS.IT (Geospatial Free and Open Source Software) organizza, per i giorni 18 e 19 novembre 2010, a Foligno, la 3a conferenza italiana sul software geografico libero, per fare il punto sullo stato dell’arte del software geografico libero ed Open Source in Italia, ponendo particolare attenzione alle applicazioni nel campo delle pubbliche amministrazioni e delle aziende.

L’associazione GFOSS.IT (http://www.gfoss.it), costituita nel febbraio 2007 da docenti universitari, ricercatori e professionisti provenienti da diverse regioni italiane, ha, tra gli altri, gli obiettivi di:
- favorire lo sviluppo, la diffusione e la tutela del software esclusivamente libero ed open source per l’informazione geografica;
- promuovere gli standard aperti per l’informazione geografica e il libero accesso ai dati geografici.
Il Gfoss Day, tenutosi in precedenza nelle città di Pontedera e Bolzano (http://www.gfoss.it/drupal/convegno e http://www.gfoss.it/drupal/gfossday ), rappresenta uno dei momenti in cui l’associazione GFOSS.IT riunisce soci, aziende, professionisti e pubbliche amministrazioni attive nell’applicazione, sviluppo, promozione e diffusione di software libero geografico.

L’evento sarà aperto e gratuito per tutti i partecipanti. La prima giornata sarà dedicata a momenti formativi durante i quali esperti di fama nazionale ed internazionale terranno corsi mirati su Software GIS (Geographic Information System) e/o WebGIS.

La seconda giornata della conferenza sarà orientata a discutere aspetti tecnologici e legali relativi alla circolazione dei dati geografici. Sono previsti interventi orientati a fare il punto sul processo di adeguamento delle PA italiane alla direttiva Europea INSPIRE (http://inspire.jrc.ec.europa.eu/ – anche alla luce del decreto legislativo 27 gennaio 2010 , n. 32) e sulla promozione di servizi di distribuzione di dati in rete secondo standard condivisi ed internazionali – OGC e ISO (Web Services).

Per questo saranno ospitati interventi di pubbliche amministrazioni che illustreranno i loro progetti ed il loro stato di avanzamento.

Il terzo giorno sara’ dedicato ad una attivita’ di mappatura della citta’ di Foligno (mapping party) coinvolgendo i ragazzi di alcune scuole. I dati raccolti mediante ricevitori GPS saranno poi riversati nel database libero mondiale di OpenStreetMap.

Maggiori informazioni: http://www.gfoss.it/drupal/gfossday2010

Lascia un commento

il primo “Hello world” in C

Non sono un programmatore; non conosco nessun linguaggio di programmazione. Per questo, approfittando di una piccola necessita’ lavorativa, mi sono avvicinato al C.

Bazzicando in rete ho trovato alcuni “punti di partenza” molto ben fatti:

- introduzione alla programmazione in C;

- piccolo corso di programmazione in C;

E da qui ne e’ uscito un piccolo programmino per convertire le coordinate geografiche (lat/long) da DMS (Gradi Primi Secondi) a DD (Gradi decimali).

L’ho scritto usato l’editor “nano” (semplice quanto efficace editor che offre colorazione del testo ben fatta).

Una volta scritto il testo sottostante salvarlo con il nome di “primo_test.c” (i codici sorgente in C vengono contraddistinti dal suffisso .c).

#include <stdio.h>
float a,b,c,d;
main()
{
printf(“inserisci i gradi:  \n”);
scanf(“%f”, &a);
printf(“inserisci i primi: \n”);
scanf(“%f”, &b);
printf(“inserisci i secondi: \n”);
scanf(“%f”, &c);
d=a+(((c/60)+b)/60);
printf(“l’angolo in formato decimale e’ %f \n”, d);
}

Una volta salvato il codice deve essere compilato. Per fare questo ho usato il compilatore “gcc” mediante la seguente sintassi:

$ gcc primo_test.c -o primo_test.out

Viene creato un file eseguibile chiamato primo_test.out (nel caso non avessimo indicato il nome del file di outptu, gcc avrebbe nominato il file “a.out”).

Il programma si lancia con il comando

$ ./primo_test.out

Vediamo il codice. All’inizio del testo viene indicata la libreria da caricare per eseguire le operazioni (#include <stdio.h>).

Poi si passa al processo. Stampa a console la richiesta di inserire i valore dei gradi dell’angolo da convertire; fatto questo cattura il valore inserito e lo memorizza nella prima variabile dichiarata (di tipo float). Poi chiede di inserire il valore del primi e memorizza il valore nella seconda variabile. Infine richiede i secondi e li memorizza nella terza variabile.

Fatto questo esegue l’operazione di conversione e propone in output il valore dell’angolo calcolato.

,

1 commento

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:


1 commento

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”.

Lascia un commento

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

Lascia un commento

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).

Lascia un commento

QGIS hackfest a Pisa

Maggiori notizie a questo link.

Lascia un commento

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!


Lascia un commento

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.

, , ,

Lascia un commento

pgrouting | compilazione in debian Lenny

Ho provato ad installare l’estensione di postgresql-postgis per il routing chiamata pgRouting. Si tratta di una estensione che consente di effettuare analisi di reti.

Ho tentato la compilazione (in Debian Lenny)  in quanto non esiste come pacchetto precompilato per debian. Questo perche’ la compilazione “canonica” dei sorgenti mi ritornava un errore in sede di “make”. Ho notato (alla fine di tutta la storia) che la creazione dei .deb e la loro installazione può risultare propedeutica alla compilazione canonica (se il lettore ha notizie certe che possono confermare o demolire questa ipotesi posti un commento al post; sarei molto felice di approfondire la questione). La creazione dei .deb che vediamo tra poco consente di installare solo la parte “core” delle librerie. Questo a causa della della mancanza delle librerie GAUL nei repos ufficiali (necessarie per il problema del TSP – Travel Sale Person) e delle CGAL (necessarie per le driving distance) rilasciate sotto licenza QPL, quindi non libere.

Per avere TSP e driving distance e’ pertanto necessario installare dai sorgenti, la cui compilazione va a buon fine (o almeno per me e’ stato cosi’) solo dopo l’installazione del “core” pacchettizzato debian.

Creazione dei pacchetti .deb delle core library (senza funzioni TSP e DD)

Prima di tutto ho scaricato i sorgenti da qui.

Seguendo le istruzioni riportati nel sito ho seguito i seguenti passi:

- diamo un controllo ai requirements: cmake ed i compilatori C e C++ li dovremmo trovare già installati nella nostra distro; mancano invece le librerie Boost Graph Library (BGL), le Genetic Algorithm Utility Library (GAUL, per il problema del “commesso viaggiatore”), e le librerie computazionali Geometry Algorithms Library (CGAL, per il driving);

- per installare le BGL ho usato apt-get (sono già nei repo di Lenny): # apt-get install libboost-graph-dev

- anche le CGAL si trovano: installate via synaptic;

- le GAUL invece le ho scaricate dal sito: una volta fatto, scompattare il sorgente e impartire i comandi riportati nella pagina di istruzioni indicata sopra. I comandi sono:

$ ./configure –disable-slang

$ make

# make install

Seguendo le istruzioni riportate su questa pagina (nascosta, in quanto non c’e’ link del sito che la punti) ho compilato le librerie a partire dall’SVN:

- creare una directory in cui scaricare i sorgenti (nel mio caso $ mkdir compila_pgrouting);

- spostarsi nella directory appena creata e lanciare: $ svn checkout http://pgrouting.postlbs.org/svn/pgrouting/trunk pgrouting

- spostarsi nella directory pgrouting: $ cd pgrouting e diventare root

- creare i paccheti con: # dpkg-buildpackage -b -rfakeroot -uc -us

- risalire di una posizione : # cd ..

- installare i pacchetti con: # dpkg -i *.deb

A questo punto bisogna aggiungere le funzioni di routing al database (che deve essere gia’ un database spaziale). NB: il database ci chiama routing nel nostro caso.

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

L’installazione copia due file con le istruzioni SQL. (routing_core.sql e routing_core_wrappers.sql). Seguendo i tutorial si notera’ che ad un certo punto, dopo avere importato i dati del database, e’ necessario creare la topologia dei dati. Per fare questo viene indicata una funzione “add_vertex_id” secondo questa sintassi:

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

dove:

- stradario_regione= nome tabella che contiene i dati;

- 0.0001= tolleranza di snap per la ricerca di nodi non collegati agli archi (espressa in unita’ di misua dei dati; nel mio caso avendo EPSG=4326 sono decimillesimi di grado);

- the_geom=colonna geometrica della tabella interessata;

- gid= colonna con gli id degli oggetti (solitamente la colonna “gid”).

In prima battuta, lanciando la query ho ottenuto questo messaggio:

ERROR:  function assign_vertex_id(unknown, numeric, unknown, unknown) does not exist

Infatti, navigando all’interno del database, nella sezione “Function” dello schema “public” non si trova una funzione chaimata “add_vertex_id”. Scrivendo il lista pgrouting mi e’ stato indicato da Anton Patrushev (che ringrazio infinitamente) che le regole per la pulizia topologica sono state spostate in un file di struzioni SQL chiamato “routing_topology.sql”. Ma purtroppo questo file non viene copiato in “usr/share/postlibs/” come gli altri due files indicati sopra (forse un bug?). Tuttavia questo file si trova nei sorgenti scaricati da SVN. Quindi ho copiato il file in “/usr”share/postlibs/” e lanciato l’istruzione (come utente postgres):

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

e magicamente la funzione “add_vertex_id” si trova tra le “Function” del database.

A questo punto ho re-impartito la query (dopo essere entrato nel db come utente “sit”) per la creazione della topologia:

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

e questo e’ l’output del comando:

NOTICE:  CREATE TABLE will create implicit sequence “vertices_tmp_id_seq” for serial column “vertices_tmp.id”
CONTEXT:  SQL statement “CREATE TABLE vertices_tmp (id serial)”
PL/pgSQL function “assign_vertex_id” line 14 at EXECUTE statement
assign_vertex_id
——————
OK

(1 row)

Aprendo i dati in qgis e interrogando un qualsiasi arco del grafo si nota che i campi “sorce” e “target” sono popolati con gli ID dei nodi iniziale e finale dell’arco stesso.

Compilazione integrale dei sorgenti

La compilazione integrale dei sorgenti (per avere le funzioni di TSP e driving distance) avviene come da manuale: ho seguito anche questa ottima guida.

- spostarsi nella directory ottenuta dalla scompattazione dei sorgenti di pgrouting, quindi:

- $ cmake -DWITH_TSP=ON -DWITH_DD=ON .

- $ make

- # make install

[ 16%] Built target routing_tsp
[ 50%] Built target routing_dd
[100%] Built target routing
Install the project…
– Install configuration: “”
– Installing: /usr/lib/postgresql/8.3/lib/librouting.so
– Installing: /usr/share/postlbs/routing_core.sql
– Installing: /usr/share/postlbs/routing_core_wrappers.sql
– Installing: /usr/share/postlbs/routing_topology.sql
– Installing: /usr/lib/postgresql/8.3/lib/librouting_tsp.so
– Installing: /usr/share/postlbs/routing_tsp.sql
– Installing: /usr/share/postlbs/routing_tsp_wrappers.sql
– Installing: /usr/lib/postgresql/8.3/lib/librouting_dd.so
– Installing: /usr/share/postlbs/routing_dd.sql
– Installing: /usr/share/postlbs/routing_dd_wrappers.sql

- Quindi ho aggiunto le funzioni TSP e DD al database “routing” creato in precedenza:

- (come utente postgres):

# psql -d routing -f /usr/share/postlbs/routing_tsp.sql (crea 1 funzione)

# psql -d routing -f /usr/share/postlbs/routing_tsp_wrappers.sql (crea 5 funzioni)

# psql -d routing -f /usr/share/postlbs/routing_dd.sql (crea 2 funzioni)

# psql -d routing -f /usr/share/postlbs/routing_dd_wrappers.sql (crea 1 funzione)

# ./configure --disable-slang

, , ,

1 commento

Iscriviti

Get every new post delivered to your Inbox.