Disclaimer per i contenuti del Blog


DISCLAIMER:Questo blog non rappresenta una testata giornalistica in quanto viene aggiornato senza alcuna periodicità . Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n° 62 del 7.03.2001.
L'autore non è responsabile per quanto pubblicato dai lettori nei commenti ad ogni post. Verranno cancellati i commenti ritenuti offensivi o lesivi dell’immagine o dell’onorabilità di terzi, di genere spam, razzisti o che contengano dati personali non conformi al rispetto delle norme sulla Privacy. Alcuni testi o immagini inserite in questo blog sono tratte da internet e, pertanto, considerate di pubblico dominio; qualora la loro pubblicazione violasse eventuali diritti d'autore, vogliate comunicarlo via email. Saranno immediatamente rimossi. L'autore del blog non è responsabile dei siti collegati tramite link, del loro contenuto che può essere soggetto a variazioni nel tempo ne degli eventuali danni derivanti dall'utilizzo proprio od improprio delle informazioni presenti nei post.

martedì 10 novembre 2015

PHP: Georeferenziare un'immagine utilizzando un file GPX

Procedendo con lo sviluppo di polpiteam.it, il mio portale per la condivisione di percorsi escursionistici, mi sono imbattuto nel problema, apparentemente complesso, di georeferenziare delle immagini scattate con fotocamere prive di GPS durante una escursione per poterle posizionare su una mappa di Google Maps, lungo la linea del percorso ricavata da un GPS.
Complesso solo apparentemente perché una fortunata googolata mi ha portato a conoscenza di un software per Windows che, utilizzando il file GPX del percorso ed interpolandolo con la data/ora di scatto, permetteva di estrapolare latitudine e longitudine dello scatto. Il programma in se non mi è servito a nulla ma l'idea SI!

Ho implementato in PHP un piccolo esempio (scaricabile qui) con tanto di immagine e file GPX per provarlo subito.

Ecco il codice, si potrebbe ottimizzare utilizzando una ricerca dicotomica sull'array dei punti (l'array ha un indice numerico proprio in previsione di questa modifica) e sicuramente andranno aggiunti ulteriori controlli ma l'idea è funzionante ed utilizzabile:

<?php
//*******************************************************
//* Esempio di una semplice tecnica per georeferenziare *
//* immagini scattate con fotocamera priva di GPS       *
//* elaborando il file GPX ottenuto utilizzando uno dei *
//* tanti software di registrazione percorsi installato *
//* sullo SmartPhone.                                   *
//*                                                     *
//* NOTA:                                               *
//* E' necessario che la versione minima di PHP sia la  *
//* 4.2.0, che siano utilizzabili le librerie standard  *
//* "SimpleXML" ed "Exif"                               *
//*                                                     *
//*                                                     *
//*******************************************************
//* Paolo Bertinetti - info@paolobertinetti.it          *
//*******************************************************

//* Inizializzo il timezone (IMPORTANTE)
date_default_timezone_set("Europe/Rome");

//******************************************************
//* Questa funzione restituisce un array con tutti i   *
//* punti presenti nel file GPX                        *
//******************************************************
function loadGPX($gpx){
    //* Carico in una array tutti i trackpoint del file GPX
    $gpxArray = new SimpleXMLElement(file_get_contents($gpx));
    $tp = array();
    foreach ($gpxArray->trk->trkseg as $seg) {
        foreach ($seg->trkpt as $point) {
            $tp[count($tp)] = array("lat"=>(float)$point->attributes()->{'lat'}, 
                                    "lon"=>(float)$point->attributes()->{'lon'}, 
                                    "ele"=>(int)$point->ele, 
                                    "time"=>(string)$point->time);
        }
    }
    return $tp;
} 

//******************************************************
//* Questa funzione cerca nell'array il primo elemento *
//* del GPX con data/ora maggiore od uguale a quella   *
//* della fotografia                                   *
//******************************************************
function searchImage($img, $tp) {
//* Carico in un array le informazioni EXIF, 
//* se presenti, per ricavare data ed ora dello scatto
    $exif = exif_read_data($img, "ANY_TAG", true);
//* Verifico la presenza dei dati EXIF
    if (!($exif === false)) {
//* Verifico la presenza della sezione dedicata 
//* alla data/ora dello scatto
        if (isset($exif["EXIF"]["DateTimeOriginal"])) {
//* Compongo data ed ora nel formato "AAAA-MM-GG HH:MM:SS"
            $d = explode(" ", $exif["EXIF"]["DateTimeOriginal"]);
            $dateTime = str_replace(":", "-", $d[0])." ".$d[1];
//* Ora $dateTime contiene la data della foto, converto in formato UTC
            $dtUTC = gmdate('Y-m-d H:i:s', strtotime($dateTime));
//* Separo data ed ora...
            list($d, $t) = split(" ", $dtUTC);
//* ...e li ricompongo ottenendo il formato utile per la 
//* comparazione con il campo <time></time> del file GPX
            $dt = $d."T".$t."Z";
//* Verifico che la data da cercare sia inclusa nell'array di coordinate
            if ($dt >= $tp[0]["time"] and $dt <= $tp[count($tp)-1]["time"]) {
                foreach  ($tp as $point) {
//* Cerco il primo elemento del GPX con data posteriore a quella dell'immagine
                    if ($point["time"] >= $dt) {
//* Trovato!
                        $answer = array(0, $point["lat"] ,$point["lon"], $point["ele"]);
                        break;
                    }
                }
            }
            else {
// La data dell'immagine non è compresa bel file GPX
                $answer = array(1, null, null, null); 
            }
        }
        else {
// Campo DateTimeOriginal non trovato nella sezione EXIF
            $answer = array(2, null, null, null); 
        }
    }
    else {
// Dati EXIF non trovati nell'immagine
        $answer = array(3, null, null, null); 
    }
    return $answer;
}

/*** MAIN *****************************************************************/

//* Inizializzo le variabili con il nome del file GPX e quello del file JPG
$gpxName = "testgpx.gpx";
$imgName = "testimg.jpg";
//* Chiamo la routine di caricamento GPX
$trackPoints = loadGPX($gpxName);
//* Chiamo la routine di ricerca della data/ora di scatto nel file GPX
list($rc, $la, $lo, $al) = searchImage($imgName, $trackPoints);
//* Visualizzo i risultati
echo $rc===0  ? "Lat:$la Lon:$lo Alt:$al" : "Data scatto non trovata nel file GPX";
?>


giovedì 14 maggio 2015

PolpiTeam.it - il portale per la condivisione di percorsi/escursioni


PolpiTeam Logo
Molti mesi sono ormai passati dal mio ultimo post su questo Blog e la causa di questa assenza non è dovuta ad una attacco di pigrizia ma ad una lunga sessione di studio (jQuery, Bootstrap, Google Maps API v3) che mi ha aiutato a realizzare un portale che mi permette di conciliare la mia attività lavorativa con il mio passatempo preferito: il trekking, o meglio, l'hiking.

L'idea del portale è scaturita dopo che mi sono reso conto di quanto fosse difficile riuscire ad ottenere informazioni valide relative alle escursioni che si possono trovare sparse per la rete.

Alcuni siti propongono mappe del paleolitico inutilizzabili, spesso di dimensioni "francobollo",  altri propongono descrizioni estremamente imprecise e fuorvianti, altri ancora, pur fornendo informazioni valide, le rendono poco fruibili a causa di interfacce di ricerca pesanti e farraginose.

I punti sui quali ho focalizzato la mia attenzione sono:
  • creare qualcosa che sia liberamente accessibile in lettura, utilizzabile in scrittura previa registrazione e comunque gratuito
  • realizzare una interfaccia utente semplice, chiara e leggera
  • fornire informazioni valide relative al punto di parcheggio, utilizzabili con un normale software di navigazione (io uso Waze e Sygic), così da arrivare alla partenza senza perdere tempo
  • fornire una traccia in formato GPX utilizzabile su GPS (o Smartphone con adeguati software) da utilizzare come base per l'orientamento a piedi
  • fornire informazioni base sulla tipologia di percorso, ad es. il profilo altimetrico che permette di avere una prima idea del grado di difficoltà del percorso, la sua lunghezza, le altitudini minime e massime toccate, il guadagno di elevazione, ecc.
  • dare spazio per la descrizione "a parole"...
  • dare la possibilità agli utenti registrati di commentare i percorsi pubblicati
  • fornire strumenti che possano aiutare gli escursionisti, es. l'analizzatore GPX che permette di analizzare una traccia restituendo tutte le informazioni che potrebbero essere utili, disponibile anche per gli utenti non registrati (altri strumenti sono in cantiere...)
  • dare la possibilità di caricare fotografie che illustrino il percorso e sfruttare l'eventuale e presenza di informazioni di georeferenziazione per il loro posizionamento su mappa
  • far si che il sito fosse sia utilizzabile su computer desktop come su periferiche mobile (SmartPhone, Tablet), inclusa la gestione delle interazioni touch
  • realizzare una bacheca utilizzabile da tutti gli utenti per consigli, segnalazioni, ecc.
  • integrazione con Facebook, Twitter e Google+ per la condivisione (opzionale) dei percorsi pubblicati (questa parte verrà affrontata in seguito in quanto comporterà lo studio delle tecniche di autenticazione utilizzate nei tre Social Network)
Buona parte di questi punti è già stata affrontata, alcuni sono solo su carta, altri solo in testa e, sebbene ancora in testing, il portale permette attualmente di accedere al database percorsi e di registrarsi per caricarne di nuovi; il nome PolpiTeam è in onore del nostro cane, Polpetta (per gli amici Polpi), sempre pronta ad accompagnarci nelle nostre uscite e che impazzisce quando vede i zaini e le bacchette...


L'adozione di Bootstrap come framework, sebbene non lo avessi mai utilizzato, è stata una scelta a mio parere vincente:
  • semplicità nella creazione di siti 'responsive'
  • utilizzo su browser mobile senza particolari attenzioni
  • semplice da imparare a da utilizzare
  • un grande quantità di plug-in disponibili in rete
Per quanto riguarda jQuery, la scelta è stata obbligata dal fatto che è un prerequisito per Bootstrap ma  qualora non lo fosse stato, lo avrei adottato comunque dal momento che lo utilizzo ormai da diverso tempo.

Sono graditi commenti e suggerimenti...

martedì 27 gennaio 2015

CTB-Locker, l'ennesimo ransomware che crittografa i files personali, si scatena in Italia!!

Se ricevete una mai insolita, tipo quella che ho riportato in basso, che vi spinge ad aprire un allegato, diffidate!!!

Sta girando in italia una variante di CTB-Locker, un trojan della famiglia dei Ransomware, che 'prende in ostaggio' i vostri files personali crittografandoli e richiedendovi un riscatto di circa 1500€ per il ripristino dei stessi. Solo oggi già due miei clienti sono stati colpiti.

L'unica vera protezione, oltre ad una buona dose di diffidenza nei confronti delle mail in arrivo non provenienti da contatti noti, è un frequente backup dei dati con distacco dell'unità di backup dal computer al termine dell'operazione (c'è la possibilità che vengano crittografati anche i files presenti sul disco di backup se questo dovesse essere connesso al momento dell'attacco).

Al momento i soli computer Windows dovrebbero essere a rischio... Per ora...

AGGIORNAMENTO IMPORTANTE
Sembra che il trojan dopo aver crittografato i files utente, cancelli gli originali senza utilizzare tecniche che impediscono il recupero dei dati. Questo significa che con un qualsiasi programma di UNDELETE potrebbe essere possibile recuperare i documenti persi!!!!

L'informazione proviene da questa fonte: http://www.digitalic.it/wp/mercato-2/business/ctb-locker-la-soluzione-per-recuperare-file/88156

Farò delle verifiche e posterò i risultati, nel frattempo converrà tenere spenti i computer colpiti per evitare che la normale attività possa andare a sovrascrivere le aree del disco contenenti i documenti cancellati.

Consiglio l'esecuzione del programma di undelete solo dopo aver effettuato un boot da CD/DVD con una delle tante distribuzioni WinPE disponibili sulla rete, questo per evitare scritture sull'HD.


DELUSIONE
Ho eseguito un paio di test, uno su una virtual machine ed uno su una macchina reale, installata ad hoc, eseguendo il file .cab (contenente un file .scr) ed ottenendo il 'rapimento' dei files ma in nessuno dei due casi ho trovato traccia dei file cancellati ai quali si fa riferimento nell'articolo precedentemente indicato (ma ho trovato file giustamente cancellati, il sw di undelete ha operato correttamente) quindi, almeno nei casi presi in esame da me, questo metodo non ha funzionato.

Sarebbe cosa gradita ricevere dei feedback relativi alla vostra esperienza.