User:Ilrobi
From OpenStreetMap
Contents |
Moretti Roberto
Zona: Principalemente a Milano (zona nord). Ma ogni posto del pianeta Terra va bene.
Attrezzatura
Hardware GPS: Garmin Geko 201 / Packard Bell Compasseo 500 / iblue 747 / Garmin GPSMAP 60 B/N
Sistemi operativi: ubuntu / windows XP
Atlanti Geografici: World Wind / Google Earth
Software gestione GPS: GPS TrackMaker (Windows) ; GPSBabel (Windows / Linux);
Georeferenziare foto: Gpicsync (Windows / Linux)
Software GIS: Quantum GIS (Windows / Linux)
Software creazione mappe: JOSM (Java)
script gpvoice
Crea un file in formato di gpx con i link ai file audio presi in abbinamento ad una traccia gps.
#!/usr/bin/perl
################################################################
# gpvoice #
################################################################
# #
# Programma per georeferenziare file wav attraverso il track. #
# #
# Crea un file in formato gpx con waypoint abbinati a file #
# vocali presi durante una sessione di tracciatura. #
# #
# La posizione del file wav è data dalla controllando l'ora #
# in cui è stato registrato il file wav con il timestamp del #
# tracklog. #
# #
# COSA SERVE: #
# Un gps che salva i tracciati del percorso. #
# Un registratore digitale che salva le tracce audio in file #
# con la data e l'ora in cui è stata fatta la registrazione. #
# Un computer con gpsbabel e JOSM. :))) #
# #
# Uso: #
# SUL CAMPO: #
# - Registra con un GPS il tracklog. #
# - Con un registratore digitale registrare le notizie di #
# interesse. #
# SUL COMPUTER: #
# - Crea una nuova cartella. #
# - Scarica nella cartella creata il tracciato del #
# percorso con gpsbabel. #
# - Scarica nella cartella creata i file audio wav. #
# - Copia nella cartella creata lo script perl #
# "gpvoiceXX.plx". #
# - Dare i permessi di esecuzione al file gpvoiceXX.plx #
# (chmod +x gpvoiceXX.plx). #
# - Eseguire: ./gpvoiceXX.plx #
# - Digita il nome del file gpx. #
# - Alla fine dell'esecuzione ci sarà un nuovo file nella #
# cartella con il nome gpv.nomedeltuofile.gpx con i #
# waypoint e il relativo file vocale associato. #
# - In JOSM aprite il file gpx appena creato ed il file #
# con il tracciato. I file wav devono essere nella #
# stessa nella del file gpv creato. #
# #
# I file wav devono rimanere nella stessa cartella del file #
# gpv.nomedeltuofile.gpx #
# #
################################################################
# Creato da Moretti Roberto. ilrobi@gmail.com #
# Versione alfa 01/04/08 - gpvoice01.plx #
# Agevola la creazione di mappe per www.openstreetmap.org #
# Licenza OPEN SOURCE (nello spirito di openstreetmap) #
# Ogni commento è benvenuto... non siate troppo severi :) #
################################################################
#use strict;
use Time::Local;
use POSIX;
# Conteggio per vedere quanti wav prende.
$conteggio = 0 ;
# Chiede il nome del file gpx da aprire.
print "Nome del file da aprire : ";
$file = <STDIN>;
open (IN, "< $file") || die "impossibile aprire $file.\n\n";
# Crea il file in cui metterà i link dei file wav.
open (OUT, "> gpv.$file") || die "Impossibile creare gpv.$file\n\n";
print OUT "<gpx>\n";
# Legge il file gpx.
while ( my @linea = <IN> )
{
# Apre la directory e legge i file wav.
$dirtoget="./";
opendir(IMD, $dirtoget) || die("Cannot open directory");
@thefiles= readdir(IMD);
closedir(IMD);
# Legge i file .wav.
foreach $f (@thefiles)
{
# Se è un file wav.
if ($f =~ m/.wav/im)
{
print"\n\n++++++++++++++++++++++++\n";
print $f."\n";
# Prendo la data del file wav.
$data_mod = (stat($f))[9];
print "Ora del file wav: ".$data_mod."\n";
$readable_time = localtime($data_mod);
print "Ora del file wav leggibile: ".$readable_time."\n";
print"++++++++++++++++++++++++\n";
# Leva tutti gli a capo del file gpx.
chomp @linea;
foreach $line (@linea)
{
#print "INIZIO: ".$line."\n";
# Se il tag è trkpt faccio il confronto.
if ($line =~ m/^<trkpt/m)
{
# Trimmo la riga.
$line =~ s/^\s+//;
$line =~ s/\s+$//;
# Memorizzo latitudine e longitudine.
$pos_lat=index($line, "lat=");
$pos_lon=index($line, "lon=");
$str_lat=substr($line, $pos_lat+5, 12);
$str_lon=substr($line, $pos_lon+5, 12);
# Levo i doppi apici.
$str_lat=~ s/\"//;
$str_lon=~ s/\"//;
#print "linea: ".$line."\n";
#print "lat: ".$str_lat."\n";
#print "lon: ".$str_lon."\n";
}
# Se è time.
elsif ($line =~ m/^<time>/m)
{
# Posizione di T per splittare la data.
$str_post=index($line, "T");
#print "posizione di T: ".$str_post."\n";
# Prendo la data.
$data_data=substr($line, 0, $str_post);
$data_data =~ s/<time>//;
#print "data_data: ".$data_data."\n";
$data_giorno=substr($data_data, 8, 2);
$data_mese=substr($data_data, 5, 2);
$data_anno=substr($data_data, 0, 4);
#print "data_giorno: ".$data_giorno."\n";
#print "data_mese: ".$data_mese."\n";
#print "data_anno: ".$data_anno."\n";
# Modifico per trovare il timestamp.
$data_anno = $data_anno - 1900;
$data_mese = $data_mese - 1 ;
# Prendo l'ora.
$data_ora=substr($line, $str_post);
# Trimmo.
$data_ora =~ s/<\/time>//;
#print "data_ora: ".$data_ora."\n";
# Splitto l'ora in ore minuti e secondi.
$ora_1=substr($data_ora, 1, 2);
$min_1=substr($data_ora, 4, 2);
$sec_1=substr($data_ora, 7, 2);
# Metto a posto l'ora.
$ora_1=$ora_1+1;
#print "ora_1: ".$ora_1."\n";
#print "min_1: ".$min_1."\n";
#print "sec_1: ".$sec_1."\n";
# Trasformo la data e l'ora del gpx in timestamp.
$timestamp_gpx = mktime( $sec_1, $min_1, $ora_1, $data_giorno, $data_mese, $data_anno );
# Controlli per eventuali debug.
#print "Data gpx: ".$timestamp_gpx."\n";
#print "Data wav: ".$data_mod."\n";
#$readable_time1 = localtime($timestamp_gpx);
#print "readable gpx:".$readable_time1."\n";
#print "readable wav:".$readable_time."\n";
# Creo un timestamp minimo e massimo con la data del file wav.
###########################################################################################
## Cerco la corrispondenza delle date con una differenza massima di più o meno 4 secondi ##
###########################################################################################
# + O - 1 secondo.
$controllo_min = $data_mod - 1;
$controllo_max = $data_mod + 1;
# + O - 2 secondi.
$controllo_min_2 = $data_mod - 2;
$controllo_max_2 = $data_mod + 2;
# + O - 3 secondi.
$controllo_min_3 = $data_mod - 3;
$controllo_max_3 = $data_mod + 3;
# + O - 4 secondi.
$controllo_min_4 = $data_mod - 4;
$controllo_max_4 = $data_mod + 4;
# Cerco la corrispondenza tra il timestamp del file wav e un
# timestamp di un punto del file gpx.
# Stesso tempo.
if($timestamp_gpx == $data_mod)
{
$conteggio++;
print "====================================================\n";
print "CORRISPONDENZA TROVATA PER: ".$f." - n. ".$conteggio."\n";
print "min: ".$controllo_min."\n";
print "max: ".$controllo_max."\n";
print "valore GPX: ".$timestamp_gpx."\n";
#print "valore wav: ".$data_mod."\n";
print "con lat: ".$str_lat." e lon: ".$str_lon."\n";
$ins_1="<wpt lat=\"".$str_lat."\" lon=\"".$str_lon."\">\n";
$ins_2="<name>voice".$conteggio."</name>\n";
$ins_3="<link>".$f."</link>\n";
$ins_4="</wpt>\n";
$ins=$ins_1.$ins_2.$ins_3.$ins_4;
# Scrivo nel file che ho creato.
print OUT $ins;
# Visualizzo quello che ho creato.
#print $ins_1;
#print $ins_2;
#print $ins_3;
#print $ins_4;
print "====================================================\n";
# Esce dal ciclo dopo la prima occorrenza trovata.
last;
}
# Differenza a + o - 1 secondo.
elsif ($timestamp_gpx >= $controllo_min && $timestamp_gpx <= $controllo_max)
{
$conteggio++;
print "====================================================\n";
print "CORRISPONDENZA TROVATA A 1 SECONDO PER: ".$f." - n. ".$conteggio."\n";
print "min: ".$controllo_min."\n";
print "max: ".$controllo_max."\n";
print "valore GPX: ".$timestamp_gpx."\n";
#print "valore wav: ".$data_mod."\n";
print "con lat: ".$str_lat." e lon: ".$str_lon."\n";
$ins_1="<wpt lat=\"".$str_lat."\" lon=\"".$str_lon."\">\n";
$ins_2="<name>voice".$conteggio."</name>\n";
$ins_3="<link>".$f."</link>\n";
$ins_4="</wpt>\n";
$ins=$ins_1.$ins_2.$ins_3.$ins_4;
# Scrivo nel file che ho creato.
print OUT $ins;
# Visualizzo quello che ho creato.
#print $ins_1;
#print $ins_2;
#print $ins_3;
#print $ins_4;
print "====================================================\n";
# Esce dal ciclo dopo la prima occorrenza trovata.
last;
}
# Differenza a + o - 2 secondi.
elsif ($timestamp_gpx >= $controllo_min_2 && $timestamp_gpx <= $controllo_max_2)
{
$conteggio++;
print "====================================================\n";
print "CORRISPONDENZA TROVATA A 2 SECONDI PER: ".$f." - n. ".$conteggio."\n";
print "min: ".$controllo_min_2."\n";
print "max: ".$controllo_max_2."\n";
print "valore GPX: ".$timestamp_gpx."\n";
#print "valore wav: ".$data_mod."\n";
print "con lat: ".$str_lat." e lon: ".$str_lon."\n";
$ins_1="<wpt lat=\"".$str_lat."\" lon=\"".$str_lon."\">\n";
$ins_2="<name>voice".$conteggio."</name>\n";
$ins_3="<link>".$f."</link>\n";
$ins_4="</wpt>\n";
$ins=$ins_1.$ins_2.$ins_3.$ins_4;
# Scrivo nel file che ho creato.
print OUT $ins;
# Visualizzo quello che ho creato.
#print $ins_1;
#print $ins_2;
#print $ins_3;
#print $ins_4;
print "====================================================\n";
# Esce dal ciclo dopo la prima occorrenza trovata.
last;
}
# Differenza a + o - 3 secondi.
elsif ($timestamp_gpx >= $controllo_min_3 && $timestamp_gpx <= $controllo_max_3)
{
$conteggio++;
print "====================================================\n";
print "CORRISPONDENZA TROVATA A 3 SECONDI PER: ".$f." - n. ".$conteggio."\n";
print "min: ".$controllo_min_3."\n";
print "max: ".$controllo_max_3."\n";
print "valore GPX: ".$timestamp_gpx."\n";
#print "valore wav: ".$data_mod."\n";
print "con lat: ".$str_lat." e lon: ".$str_lon."\n";
$ins_1="<wpt lat=\"".$str_lat."\" lon=\"".$str_lon."\">\n";
$ins_2="<name>voice".$conteggio."</name>\n";
$ins_3="<link>".$f."</link>\n";
$ins_4="</wpt>\n";
$ins=$ins_1.$ins_2.$ins_3.$ins_4;
# Scrivo nel file che ho creato.
print OUT $ins;
# Visualizzo quello che ho creato.
#print $ins_1;
#print $ins_2;
#print $ins_3;
#print $ins_4;
print "====================================================\n";
# Esce dal ciclo dopo la prima occorrenza trovata.
last;
}
# Differenza a + o - 4 secondi.
elsif ($timestamp_gpx >= $controllo_min_4 && $timestamp_gpx <= $controllo_max_4)
{
$conteggio++;
print "====================================================\n";
print "CORRISPONDENZA TROVATA A 4 SECONDI PER: ".$f." - n. ".$conteggio."\n";
print "min: ".$controllo_min_4."\n";
print "max: ".$controllo_max_4."\n";
print "valore GPX: ".$timestamp_gpx."\n";
#print "valore wav: ".$data_mod."\n";
print "con lat: ".$str_lat." e lon: ".$str_lon."\n";
$ins_1="<wpt lat=\"".$str_lat."\" lon=\"".$str_lon."\">\n";
$ins_2="<name>voice".$conteggio."</name>\n";
$ins_3="<link>".$f."</link>\n";
$ins_4="</wpt>\n";
$ins=$ins_1.$ins_2.$ins_3.$ins_4;
# Scrivo nel file che ho creato.
print OUT $ins;
# Visualizzo quello che ho creato.
#print $ins_1;
#print $ins_2;
#print $ins_3;
#print $ins_4;
print "====================================================\n";
# Esce dal ciclo dopo la prima occorrenza trovata.
last;
}
}
}
}
}
}
# Stampo nel file la chiusura del formato gpx.
print OUT "\n</gpx>";
# Chiudo i due file.
close(IN);
close(OUT);
Eventi a cui ho partecipato
Jan 6 Pavia warm-up informal mapping party
Feb 21-22 Perugia Mapping Party
Mar 2 Milano Micro Mapping Party
Apr 6 Mapping Party a Milano
Apr 19-20 Ferrara Mapping Party.
Mag 11 Milano Micro Mapping Party
May 27 Milano micro-mapping party di sera. -
June 3 Milano incontro per il disegno della mappa.
June 15 Verona Mapping Party

