Uno Sguardo nel Buio:AventuriaMap
Da Uno Sguardo nel Buio.
|
Uno dei progetti collaterali al wiki è Aventuria Map. Si tratta della gestione della mappa di Aventuria/Atlantide con le API di Google Map, in modo da avere una mappa del continente navigabile ed in cui sia possibile posizionare le città, i luoghi più importanti e i percorsi delle avventure.
Per una più efficiente e comoda fruibilità di Aventuria Map si è deciso di creare un sottodominio ad hoc, quindi per accedere all'attuale versione di Aventuria Map è sufficiente accedere a http://maps.usnb.it .
Si può selezionare una città della lista e centrare la mappa sulla città selezionata con il pulsante "Go!", un click sul marker della città aprirà una finestra informativa con la pagina corrispondente estratta dal wiki.
Passando parametri nella url si può aprire la pagina direttamente su una città:
http://maps.usnb.it/index.html?citta=Vinsalt
o su un punto di coordinate specificate:
http://maps.usnb.it/index.html?lat=30&lng=5
ed ovviamente, è possibile anche richiedere il livello di zoom voluto:
http://maps.usnb.it/index.html?citta=Vinsalt&zoom=7
http://maps.usnb.it/index.html?lat=30&lng=5&zoom=9
La realizzazione
La realizzazione del progetto, allo stato attuale, ha richiesto una serie di operazioni fondamentali, che vedremo nel dettaglio, in particolare:
- scansione ed acquisizione delle mappe originali
- combinazione delle mappe
- la realizzazione delle tiles
- la realizzazione del javascript per implementare il map con le api di Google Map
- la realizzazione delle componenti server
Acquisizione delle mappe
Sono stati acquistati i primi due Kartenset ufficiali, quelli relativi al sud ed alla regione centrale del continente. Il terzo Kartenset non è stato trovato, quindi è stato necessario reperire le singole mappe.
L'acquisizione è stata effettuata a 300 dpi, un buon compromesso tra qualità e dimensione dei file; gli originali file nel formato TIFF sono stati poi convertiti in PNG, poiché quest'ultimo formato consente una buona compressione senza perdita di qualità.
Combinazione delle mappe
Questa è stata una delle fasi più onerose. In molti casi, stante le dimensioni dei file ottenuti, non è stato possibile lavorare con intere immagini, quindi si è provveduto a tagliarle in almeno un paio di immagini componenti.
Questo ultimo aspetto ha comportato un notevole lavoro di modifica delle mappe originali, in modo da portare i bordi a combaciare. Al momento invece non è stato fatto alcun serio intervento per risolvere i problemi cromatici e questa è la causa della presenza di riquadri di tonalità differenti sulla mappa complessiva.
Si è subito notato che:
- le mappe non avevano tutte la stessa resa cromatica, forse perché realizzate in tempi diversi, da autori differenti o stampate con tecniche diverse. Uniformare i colori si è subito dimostrato un compito di una certa complessità quindi si è preferito soprassedere accettando l'idea di avere riquadri con colori differenti. La difformità maggiore è stata senza dubbio l'isola di Maraskan.
- mappe contigue non si sovrapponevano, anche qui probabilmente perché realizzate in tempi diversi e non con l'idea di combinarle (idea forse venuta in un secondo momento, poiché le mappe più recenti si combinavano abbastanza bene). In questo caso si è provveduto a riscalare zone di mappe per portare a coincidere fiumi e strade, in alcuni casi si sono dovute ridisegnare zone di bordo per spostare fiumi o strade.
Alla fine, pensando alla realizzazione delle tiles della fase successiva, tutte le mappe sono state ricombinate in riquadri di 4096 x 4096 pixel.
Le Tiles
Come è noto, le API di Google Map si aspettano di gestire layers ottenuti combinando tasselli (tiles) quadrati di 256 pixel di lato. Fissato il livello di zoom, ogni riquadro è identificato da due numeri progressivi (riga e colonna).
In particolare, a livello 0, l'intero mondo è identificato da un solo tassello, a livello 1 ve ne sono quattro e così via. Sostanzialmente, detto N il numero del livello, il numero dei tasselli necessari è dato da 4N tasselli. Si tenga presente che in ciascun livello, il tassello di coordinate 0,0 è posto "in alto a sinistra" cioè il suo angolo superiore sinistro è posto alle coordinate geografiche Lat. 90° N, Lng. 180° W.
Per il taglio delle mappe quadrate da 4096 pixel di lato si è utilizzato e modificato il software Tile Cutter, realizzato in C# da Anatolie Golovco. Le modifiche hanno riguardato la possibilità di automatizzare il processo (tagliare tutte le mappe presenti in una determinata cartella secondo una specifica numerazione), di realizzare a partire da un layer di riferimento anche quelli di indice più basso, di pilotare la qualità delle immagini dei tasselli in termini di livello di compressione JPEG (che come è noto è con perdita di informazione).
La API di Google Map
Un primo problema da risolvere è stata la scelta del tipo di proiezione. Di base, le API di Google Map si aspettano di dover gestire mappe realizzate con la proiezione di Mercatore, che tendono ad allargare le mappe verso i poli. Si può verificare questo aspetto aprendo una qualunque mappa su Google e controllando sull'indicatore di scala: senza modificare il livello di zoom e spostandosi verso nord, si noterà come l'indicatore mostri scale via via più grandi.
Nel caso delle nostre mappe, si è assunto che i disegnatori abbiano lavorato su mappe "piatte", cioè di tipo Euclideo. Il disegno non tiene conto del fatto che si sta proiettando su una superficie piana quello che è lo sviluppo di una sfera.
Questa considerazione ha implicato i primi due interventi sul codice javascript: la realizzazione di un Controllo di Scala personalizzato, che non tenesse conto della latitudine ma solo del livello di zoom e di una Proiezione personalizzata che implementasse le proiezioni Euclidee.
Un'altra serie di interventi hanno invece riguardato le personalizzazioni dell'interfaccia. Qui si è adottata una libreria (ExtInfoWindow) che consentisse la personalizzazione della Info Window predefinita di Google e poi si sono realizzate le immagini per comporre il marker personalizzato.
Nota: in seguito agli scambi di informazioni con il team DereGlobus e lo stesso Thomas Roemer, si è modificata l'assunzione iniziale, accettando per la mappa originale il fatto che fosse disegnata nel rispetto della proiezione di Mercatore, che pertanto è stata reintrodotta dalla versione 2 di Aventuria Map.
Componenti server
I dati georeferenziali sono memorizzati all'interno di un database MySQL: al momento sono gestiti i soli oggetti puntiformi, cioè quelli rappresentabili con un semplice marker, e i percorsi, rappresentati tramite polilinee. Per questi tipi di oggetti vengono memorizzati i seguenti dati:
- marker: vengono memorizzati il nome, la latitudine e longitudine, il nome della pagina wiki che contiene le informazioni relative all'oggetto inserito.
- polyline: vengono memorizzati il nome, la latitudine e longitudine del punto di partenza, le coordinate dei punti della polilinea in formato codificato (una stringa per le coordinate ed una per il livello di zoom), il nome della pagina wiki che contiene le informazioni relative all'oggetto inserito.
Al momento di disegnare una polilinea, viene inserito anche un marker alle coordinate del punto di partenza in modo da avere un oggetto facilmente cliccabile per aprire la finestra informativa con la pagina del wiki. Ad esempio si veda il percorso di questa avventura: [1]. Nella versione 2 invece si è preferito rendere cliccabile la polilinea stessa, lasciando i marker come elementi identificativi dei soli "punti" geografici.
Come è noto le API di Google Map si basano su AJAX, ed in particolare per le chiamate al server si basano sull'oggetto XMLHttpRequest che non consente chiamate a host differenti da quello da cui si è scaricata la pagina, per evitare il cross-scripting. Per popolare la ExtInfoWindow con la pagina del wiki si è reso necessario realizzare uno script PHP che, ricevuta la richiesta dal client, effettua la richiesta della pagina al wiki. Questo script PHP inoltre consente di effettuare qualche elaborazione elementare sulla pagina da inoltrare al client per eliminare ed eliminare alcuni elementi.
Un altro script PHP fornisce invece il file XML con l'insieme dei dati richiesto dal client. Queste informazioni sono utilizzate, ad esempio, per popolare la combo di ricerca delle città.
Posizionare Aventuria
Pur potendosi, in effetti, posizionare in qualunque modo la mappa, ovvero le relative tiles, rispetto alle coordinate, si è preferito rispettare alcune indicazioni fornite dalle fonti ufficiali:
- un primo dato certo è che il meridiano fondamentale passa per la città di Vinsalt: questo vuol dire che il riferimento per la longitudine è fissato, Vinsalt è a longitudine 0°.
- le dimensioni di Aventuria sono indicate, in "Uno Sguardo nel Buio II", pari a 3000 Km da nord a sud e 1900 Km dal est a ovest. Tuttavia molti, ed anche la Compagnia degli Impossibili, hanno preferito giocare con il continente di dimensioni raddoppiate, con l'idea di renderle più realistiche rispetto al metro terrestre.[1]
- più problematica la definizione della posizione dell'equatore, visto che le informazioni note stabiliscono solo che l'equatore passa a sud del continente, anche se da alcune considerazioni riportate in "Das Land des Schwarzen Auges" e "World of Aventuria" si può dedurre che il continente sarebbe collocato nella fascia tra latitudine 10° Nord e 45° Nord.
Ora, come è facile intuire, per posizionare correttamente la mappa servono le coordinate geografiche di almeno due punti, ovvero le coordinate di un punto e la distanza in kilometri di un secondo punto da questo di riferimento. Con un punto solo infatti si può ottenere il posizionamento della mappa, ma non il suo livello di scala.
Nel proprio sistema di gioco, la "Compagnia degli Impossibili ha optato per le seguenti scelte:
- meridiano fondamentale passante per Vinsalt;
- dimensioni della mappa raddoppiate, assumendo quindi un miglio arrotondato a 2 kilometri;
- l'estremo sud del continente, il punto più meridionale del continente dell'isola di Benbukkula è alla Lat. 11,41° Nord.
- l'estremo nord del continente, il punto più a nord dell'isola degli Yeti è posto a Lat. 61,88° Nord.
- l'estremo ovest del continente, il punto più a ovest dell'isola Sorkten è posto a Lng. 11,27° Ovest.
- l'estremo est del continente, il punto più a est dell'isola Setokan è posto a Lng. 19,97° Est, la parte nota della Spada di Bronzo è a Lng. 20,39° Est.
Nota: in seguito agli scambi di informazioni con il team DereGlobus e lo stesso Thomas Roemer, anche questo posizionamento è stato modificato, in modo da essere coerenti con il posizionamento previsto dal progetto tedesco. Questo ci consente la totale compatibilità georeferenziale per gli oggetti delle mappe. Le coordinate, applicate dalla versione 2, risultano quindi le seguenti:
- l'estremo sud del continente, il punto più meridionale del continente dell'isola di Benbukkula è alla Lat. 13.83211470255367 Nord.
- l'estremo nord del continente, il punto più a nord dell'isola degli Yeti è posto a Lat. 44.68523182173993 Nord.
- l'estremo ovest del continente, il punto più a ovest dell'isola Sorkten è posto a Lng. -8.928795211729799 Ovest.
- l'estremo est del continente, il punto più a est dell'isola Setokan è posto a Lng. 13.82951187257615 Est.
Le cose da fare
- occorre realizzare una interfaccia per consentire agli utenti autorizzati l'inserimento di oggetti sulla mappa (in test);
- va integrato il wiki in maniera tale che sia possibile raggiungere la mappa dalle pagine che lo richiedano, così, ad esempio, in ogni pagina delle città deve essere disponibile un link che apra Aventuria Map centrata sulla città medesima (fatto!);
- creare dei sottodomini per le tiles, in modo da aggirare la limitazione a quattro connessioni per alcuni browser;
- le polilinee devono essere gestite nel formato codificato per poter evitare tempi di ridisegno eccessivi (fatto!).
Gli strumenti
Per l'acquisizione si è utilizzato uno scanner A3 dell'AGFA con relativo software.
Gli interventi grafici di correzione e combinazione sono stati realizzati con i software open source GIMP e Paint.NET. Quest'ultimo si è rivelato molto utile per la sua capacità di gestire in memoria mappe molto grandi. GIMP è stato utilizzato per tutti gli interventi di editing, quali il recupero della leggera deformazione creata dall'acquisizione, la rimozione dei bordi, il riscalamento delle immagini, il ridisegno di fiumi, strade ed altri elementi di contorno da portare a combaciare.
La verifica del codice javascript è stata realizzata sia su Firefox 3.0.14 che su IE7, entrambi dotati dei plugin necessari al debug di javascript e CSS.
Riferimenti
- GIMP è uno dei sofware di grafica opensource utilizzati, specialmente per ripulire le mappe e allineare eventuali distorsioni causate dal processo di scansione;
- Paint.NET è un software opensource di grafica, molto utile per il processo di riunione di mappe, gestisce molto bene immagini di grandi dimensioni, anche su macchine 32 bit;
- Google Map Tutorial è il tutorial di Mike Williams su Google Map: un punto di partenza che espone in modo chiaro tutti gli aspetti relativi a Google Map, ricco di esempi ed indicazioni sulle scelte da intraprendere per raggiungere i propri obbiettivi;
- Documentazione Google map è la documentazione ufficiale sulle API di Google Map, ricca ed esauriente, presenta adesso anche le nuove API versione 3;
- Encoded polyline utility è una pagina di utilità che mostra il funzionamento delle polilinee codificate;
- ExtInfoWindow è l'estensione utilizzata per personalizzare le finestre informative con i nostri CSS;
- PHP è il linguaggio utilizzato per la realizzazione delle componenti server;
- MySQL è il motore del nostro database;
Note
- ↑ Vi è da dire che in "World of Aventuria" le misure sono indicate in 3000 Miglia per 1900 Miglia, quindi il raddoppio delle misure non è poi così peregrino ove si ricordi che 1 Km = 1,6 Mls (terrestre) = 1,8 Mls (nautico).