martedì 26 maggio 2009

Conversione csv2kml in php

In questo post illustro brevemente come effettuare la conversione dal formato csv in kml usando php. Il csv in ingresso rispetta il seguente formato

nomeposto;mese;anno;longitudine;latitudine;altitudine

Ad esempio un file di input valido è:

Salisbury - Cattedrale;8;2003;-1.799225000000000;51.064673000000000;0
Stonehenge;8;2003;-1.827691000000000;51.179363000000000;0
Francoforte;4;2005;8.661885000000000;50.104502000000000;0
Nice;8;2005;7.151939000000000;43.650530000000000;0
Nimes;8;2005;4.360864000000000;43.834590000000000;0
Monaco - Marienplatz;8;2006;11.575700000000000;48.137240000000000;0



Il carattere separatore degli elementi è ";". Nel kml finale, i campi mese ed anno verranno fusi in un elemento description del file kml generato. Lo script in php non deve fare altro che processare il csv riga per riga e generare gli elementi relativi del file kml. La struttura kml che andremo a generare è molto semplice. Ogni punto (Placemark) è formato da un nome, una descrizione e le coordinate. Il kml conterrà un placemark per ogni riga del file csv.

Ecco il codice:

?PHP
// prende in input un file csv e restituisce un kml

//Crea il documento
$dom = new DOMDocument('1.0', 'UTF-8');

//Crea la radice KML e la inserisce nel documento
$node = $dom->createElementNS('http://earth.google.com/kml/2.1', 'kml');
$parNode = $dom->appendChild($node);

//Crea il documento KML e lo inserisce
$dnode = $dom->createElement('Document');
$docNode = $parNode->appendChild($dnode);

//Scorre il file csv riga per riga e per ognuna crea un Placemark
//con nome, anno+mese, lati,long
$file_handle = fopen("input.csv", "r");
while (!feof($file_handle) ) {
//processa riga per riga
$line_of_text = fgetcsv($file_handle, 1024,";");
$nome = $line_of_text[0];
$anno = $line_of_text[1];
$mese = $line_of_text[2];
$long = $line_of_text[3];
$lati = $line_of_text[4];
//Crea un Placemark e lo inserisce nel documento
$node = $dom->createElement('Placemark');
$placeNode = $docNode->appendChild($node);
//Crea nome, descrizione e ci mette i valori presi dal csv
$nameNode = $dom->createElement('name',$nome);
$placeNode->appendChild($nameNode);
$descNode = $dom->createElement('description', $mese."/".$anno);
$placeNode->appendChild($descNode);
//Crea un elemento Punto
$pointNode = $dom->createElement('Point');
$placeNode->appendChild($pointNode);
//Crea un elemento coordinate e ci mette dentro i valori
$coorStr = $long . ',' . $lati;
$coorNode = $dom->createElement('coordinates', $coorStr);
$pointNode->appendChild($coorNode);
}

$kmlOutput = $dom->saveXML();
header('Content-type: application/vnd.google-earth.kml+xml');
echo $kmlOutput;
fclose($file_handle);
?>


Salviamo il codice php dentro il file genera_kml.php, e chiamiamo il file csv input.csv. Salviamo entrambi dentro la stessa directory (miadirectory ad esempio) su un webserver che abbia abilitato il supporto per il php5. Ora puntando alla pagina http://www.miowebserver.com/miadirectory/genera_kml.php, il browser ci invierà un file contente il kml generato. Sarà sufficiente dargli come estensione .kml (invece di .php) e salvarlo su disco.
Adesso aprendolo con Google Earth vedremo comparire i punti del file csv sulla mappa.

martedì 19 maggio 2009

Tagliare file avi con mencoder

La sintassi da usare è la seguente:

mencoder input.avi -ovc copy -oac copy -ss hh:mm:ss -endpos hh:mm:ss -o output.avi

con:
input.avi, nome del file da tagliare
-ovc copy, tipo di codec da usare in output. L'opzione copy evita che si faccia il re-encoding
-oac copy, come sopra ma per l'audio
-ss, specifica il punto iniziale del taglio in ore, minuti, secondi
-endpos, specifica il punto finale del taglio, inteso come ore, minuti e secondi in valore assoluto a partire dal punto iniziale
-o output.avi, il nome del file di output

Esempio:

mencoder input.avi -ovc copy -oac copy -ss 00:10:55 -endpos 00:01:15 -o output.avi

Totò e la camicia

Un tema molto attuale di questi giorni...