Creare mappe personalizzate con Google Maps

Google Maps è uno strumento ormai indispensabile per comunicare efficacemente posti e percorsi. Una attività (ad esempio un ristorante) che voglia indicare agli utenti la propria posizione può avvalersi di queste mappe includendole nel proprio sito web. Mappe statiche, immagini, o peggio ancora semplici indicazioni testuali non sono proprio più ammesse!
Gli utenti si aspettano di trovare Google Maps e tutto quello che ne deriva ossia la possibilità di condividere il luogo, esplorare i dintorni e calcolare distanze e percorsi.

Inserire una mappa Google Maps sul proprio sito web è abbastanza semplice ma l’effetto non sempre è quello desiderato: la mappa di default è ok, indica certamente la posizione, ma i colori potrebbero non essere nello stile complessivo del sito, magari vorremmo togliere informazioni superflue quali nomi di altri posti non attinenti al contesto, nomi dei parchi, in generale semplificare la mappa e focalizzare l’attenzione su quello che vogliamo indicare.

Utilizzando le Google Maps API v3 è possibile personalizzare la mappa come più si desidera, integrandola con lo stile complessivo del sito. Ad esempio è possibile:

  • cambiare tonalità di colore
  • cambiare immagine degli indicatori
  • disegnare contorni, cerchi, rettangoli solidi e trasparenti
  • mostrare popup o altre informazioni al click di preciso luogo sulla mappa

Ecco alcuni esempi:

biz

maps1

Creazione del layout base

Innanzitutto occorre procurarsi una API Key direttamente dal Google Developer center. La chiave ci permetterà di accedere alle funzionalità extra.

Creiamo una pagina HTML di esempio ed includiamo le Google Map API direttamente nell’head. In più creiamo un div contenente la nostra mappa, larghezza e altezza fluida (100%):

<html>
<head>
<script src="https://maps.googleapis.com/maps/api/js?key=APIKEY&callback=myMap"></script>
</head>
<body>
   <div id="maptest" style="width:100%;height:100%;"></div>
</body>
</html>

La pagina non mostra ancora alcuna mappa, dobbiamo crearla associando al div il codice Javascript opportuno. Definiamo per ora il minimo indispensabile ossia posizione (latitudine e longitudine) e livello di zoom:

<html>
<head>
<script src="https://maps.googleapis.com/maps/api/js?key=APIKEY&callback=myMap"></script>
</head>
<body>
   <div id="maptest" style="width:100%;height:100%;"></div>
   <script>						
      var mapOptions = {
	 scrollwheel: false,
	 zoom: 12,
         center: new google.maps.LatLng(43.769562, 11.255814)
      };
		
      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );
   </script>
</body>
</html>

Risultato:

screen-shot-2016-10-09-at-4-33-46-pm

Che è esattamente quello che al massimo possiamo ottenere con le opzioni standard. Vediamo ora di cambiare tonalità di colore alla mappa, ad esempio portarla sul blu (tonalità #103050 e livello di saturazione 20):

      var styleArray = [{
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#103050" }]
      }];					
			
      var mapOptions = {
	scrollwheel: false,
	zoom: 12,
	center: new google.maps.LatLng(43.769562, 11.255814),
	styles: styleArray
      };

      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );

Risultato:

screen-shot-2016-10-09-at-4-38-35-pm

Aggiungere segnaposto (markers)

Possiamo ora aggiungere uno o più segnaposto sulla mappa, è sufficiente creare quanti oggetti marker desideriamo, specificarne latitudine e longitudine e passarli alla mappa:

      var styleArray = [{
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#103050" }]
      }];					
			
      var mapOptions = {
	scrollwheel: false,
	zoom: 12,
	center: new google.maps.LatLng(43.769562, 11.255814),
	styles: styleArray
      };

      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );

      // markers

      var marker1 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769562, 11.265814)
      });

      var marker2 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769662, 11.356814)
      });
      
      var marker3 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.799362, 11.283814)
      });

Risultato:

screen-shot-2016-10-09-at-4-52-19-pm

Cambiare immagine ai markers

L’icona del marker di default è noiosa. Possiamo utilizzare altre icone o immagini, basta specificare il percorso url alla png o jpeg. Una immagine personalizzata permette ad esempio di creare marker con il logo del nostro sito web, oppure marker che rappresentano posti differenti (ristoranti, stazioni di servizio, aereoporti etc..). Da notare che ogni marker può avere una immagine differente.

      var styleArray = [{
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#103050" }]
      }];					
			
      var mapOptions = {
	scrollwheel: false,
	zoom: 12,
	center: new google.maps.LatLng(43.769562, 11.255814),
	styles: styleArray
      };

      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );

      // markers

      var marker1 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769562, 11.265814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

      var marker2 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769662, 11.356814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });
      
      var marker3 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.799362, 11.283814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

Risultato:

screen-shot-2016-10-15-at-2-14-50-pm

Associare eventi al click di un marker

Possiamo associare un particolare evento quando l’utente clicca su un marker, ad esempio mostrare un popup informativo oppure cambiare pagina o qualsiasi altra cosa. E’ sufficiente aggiungere l’evento al marker tramite la funziona addListener()

      var styleArray = [{
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#103050" }]
      }];					
			
      var mapOptions = {
	scrollwheel: false,
	zoom: 12,
	center: new google.maps.LatLng(43.769562, 11.255814),
	styles: styleArray
      };

      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );

      // markers

      var marker1 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769562, 11.265814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

      var marker2 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769662, 11.356814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });
      
      var marker3 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.799362, 11.283814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

      // evento

      marker3.addListener('click', function() {
    	alert('ok');
      });

Cliccando sul marker 3 comparirà un semplice popup.

Disegnare forme geometriche sulla mappa

Oltre ai marker è possibile aggiungere forme geometriche quali cerchi, rettangoli e poligoni. In particolare i cerchi sono molto utili quando occorre indicare il raggio massimo di azione di qualcosa o qualcuno (consegne a domicilio? antenna trasmettitore GSM?).
Per un cerchio occorre specificare colore, raggio (in metri) e il marker da associare al cerchio (il marker identifica il centro). Nel nostro caso associamo il cerchio al marker numero 1, impostiamo il raggio a 5km e colore #ffff000.

      var styleArray = [{
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#103050" }]
      }];					
			
      var mapOptions = {
	scrollwheel: false,
	zoom: 12,
	center: new google.maps.LatLng(43.769562, 11.255814),
	styles: styleArray
      };

      var map = new google.maps.Map(
          document.getElementById('maptest'),
          mapOptions
      );

      // markers

      var marker1 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769562, 11.265814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

      var marker2 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.769662, 11.356814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });
      
      var marker3 = new google.maps.Marker({
         map: map, 
  	     position: new google.maps.LatLng(43.799362, 11.283814),
             icon: 'http://www.gianlucaghettini.net/wp-content/uploads/2016/10/pin.png'
      });

      // evento

      marker3.addListener('click', function() {
    	 alert('ok');
      });

      // cerchio

      var circle = new google.maps.Circle({
	 map: map,
         radius: 5000,
  	 fillColor: '#ffff00',
  	 strokeWeight: 0,
      });
		
      circle.bindTo('center', marker1, 'position');  

Risultato:

Il marker 1 identifica il centro del cerchio. Incidentalmente il marker 2 è stato incluso nel cerchio perchè si trova a meno di 5km dal marker 1.

screen-shot-2016-10-15-at-2-09-12-pm

Rimuovere elementi superflui

Di default la mappa contiene molti elementi quali nomi di strade, posti, attività commerciali, nomi di parchi, fiumi etc.. E’ possibile rimuovere selettivamente questi elementi specificandoli nell’oggetto di stile e impostando la visiblità ad OFF. Ad esempio questo è il codice, per rimuovere nomi di attività commerciali, punti di interesse, fiumi, laghi e strade:

  var styleArray = [
   {
	featureType: "all",
	stylers: [{ "saturation": 20 },{ "hue": "#123456" }]
   },
   {
         featureType: "administrative",
         elementType: "labels",
         stylers: [
           { visibility: "off" }
         ]
       },{
         featureType: "poi",
         elementType: "labels",
         stylers: [
           { visibility: "off" }
         ]
       },{
         featureType: "water",
         elementType: "labels",
         stylers: [
           { visibility: "off" }
         ]
       },{
         featureType: "road",
         elementType: "labels",
         stylers: [
           { visibility: "off" }
         ]
       }
];

Risultato:

screen-shot-2016-10-15-at-2-08-47-pm

Disegnare percorsi sulla mappa

E’ possibile passare alla mappa un serie di punti geografici (latitudine, longitudine) e realizzare cosi’ un tracciato arbitrario. Va specificato anche il colore, lo spessore della traccia e opacità:

        var pathCoords = [
          {lat: 43.769562, lng: 11.265814},
          {lat: 43.769362, lng: 11.303814},
          {lat: 43.729362, lng: 11.253814},
          {lat: 43.739362, lng: 11.223814},
          {lat: 43.749362, lng: 11.203814},
          {lat: 43.759362, lng: 11.273814},
          {lat: 43.769362, lng: 11.243814},
          {lat: 43.799362, lng: 11.283814},
        ];
        var path = new google.maps.Polyline({
          path: pathCoords,
          geodesic: true,
          strokeColor: '#FF0000',
          strokeOpacity: 1.0,
          strokeWeight: 2
        });

        path.setMap(map);

Risultato:

screen-shot-2016-10-15-at-2-41-35-pm

Oltre a cerchi e linee è possibile disegnare qualsiasi altra forma geometrica, aggiungere immagini e marcare bordi. Il sito ufficiale include tutorial ed esempi per trasformare e adattare le mappe in qualsiasi modo possibile!

Vedi la DEMO

Vuoi personalizzare una o più mappe Google Maps per integrarla al meglio nel tuo sito internet? Fammi sapere nei commenti oppure contattami!

Completamento automatico localita’ tramite Google maps API

Google mette a disposizione una API gratuita per l’autocompletamento in tempo reale della località inserita dall’utente

Prendiamo un form input HTML

<input id="input" type="text" style="width:500px;" />

Includiamo le Google Maps API nell’head della pagina html:

<script type="text/javascript" src='http://maps.google.it/maps/api/js?sensor=false&libraries=places'></script>

L’API da utilizzare è google.maps.places.Autocomplete() e richiede in ingresso il form html sul quale applicare l’autocompletamento:

<script>
function init()
{
   var input = document.getElementById('input');
   var autocomplete = new google.maps.places.Autocomplete(input);
}
google.maps.event.addDomListener(window, 'load', init);
</script>

A questo punto digitando qualcosa nel form comparirà il popup con le possibili scelte. Da notare che il popup ha stessa larghezza del form al quale è agganciato.

Screen shot 2016-08-14 at 5.03.46 PM

Console retrogaming con Raspberry Pi e RetroPie

Raspberry Pi 2 è il computer ideale da trasformare in un emulatore universale per le vecchie console anni 80-90.  Vi basterà la distro RetroPie, una micro SD card da almeno 8GB, un alimentatore da 2000mA ovviamente il Raspberry Pi 2 modello B.

yoshi_island

Prendete un Raspberry Pi 2 modello B, consiglio gli ottimi starter kit che trovate ai link più avanti.

Le caratteristiche del Pi2B, un piccolo mostro!

  • CPU ARM7 quad core a 900 MHz
  • 1GB di RAM
  • 40pin GPIO
  • 4 porte USB
  • HDMI
  • jack 3.5mm per audio/video analog
  • micro USB e porta micro SD
  • Lettore USB per schede micro SD

E’ possibile overcloccare il processore via software e portarlo fino a 1GHz ma occorrerà installare il dissipatore e magari una ventola. In ogni caso gli emulatori girano benissimo anche con la frequenza stock di 900MHz.

Lista dei componenti

Ecco un riassunto di tutto quello che serve:

  • Raspberry Pi 2 modello B
  • micro SD card da almeno 8GB
  • alimentatore (almeno 2000mA) con attacco micro USB (quello dei cellulari tanto per intendersi)
  • cavo HDMI
  • un joypad USB qualsiasi
  • tastiera USB (per la configurazione iniziale, poi non servirà più)
  • case più coperchio per Raspberry Pi 2 (non strettamente necessario ma sicuramente utile)

Esistono svariati kit che includono tutto quanto sopra, uno interessante è questo qui venduto su Amazon

Screen Shot 2017-10-31 at 22.22.00

Oppure quello venduto direttamente da ThePiHut, un vero e proprio kit retrogaming che include pure due joypad SNES (non originali SNES ovviamente, due joypad look&feel SNES usb)

Screen Shot 2017-10-31 at 21.59.14

Io ho preso il kit da ThePiHut. NOTA: ad oggi (Ottobre 2017) conviene prendere il Raspberry Pi3, più veloce e potente rispetto alla versione 2. Ho aggiornato i link sopra che ora mandano al modello aggiornato versione 3. Tutte le indicazioni fornite su questo articolo vanno bene pure per il modello Pi3

Cosa è RetroPie

Si tratta di una distribuzione Linux modificata contenente una vasta gamma di emulatori e il frontend EmulationStation che vi permetterà di gestire tutto il sistema tramite joypad senza mai ricorrere alla tastiera o al mouse.

Le macchine emulate da RetroPie sono le seguenti:

  • Amiga (UAE4ALL)
  • Apple II (LinApple)
  • Atari 800 (Atari800)
  • Atari 2600 (RetroArch/Stella)
  • Atari ST/STE/TT/Falcon (Hatari)
  • Apple Macintosh (Basilisk II)
  • C64 (VICE)
  • Amstrad CPC (#CPC4Rpi)
  • Final Burn Alpha (RetroArch/PiFBA, RetroArch/FBA)
  • Game Boy (RetroArch/Gambatte)
  • Game Boy Advance (GpSP)
  • Game Boy Color (RetroArch/Gambatte)
  • Sega Game Gear (Osmose)
  • Intellivision (jzIntv)
  • MAME (RetroArch/mame4all-pi, RetroArch/mame4all)
  • MSX (openMSX)
  • PC – x86 (rpix86)
  • NeoGeo (PiFBA, GnGeo)
  • Nintendo Entertainment System (RetroArch/FCEUmm)
  • Nintendo 64 (Mupen64Plus-RPi)
  • TurboGrafx 16 – PC Engine (RetroArch/Mednafen/pce_fast)
  • ScummVM
  • Sega Master System / Mark III (RetroArch/Picodrive, Osmose, DGen)
  • Sega Mega Drive / Genesis (RetroArch/Picodrive, DGen)
  • Sega Mega-CD / CD (RetroArch/Picodrive, DGen)
  • Sega 32X (RetroArch/Picodrive, DGen)
  • Playstation 1 (RetroArch/PCSX ReARMed)
  • Super Nintendo Entertainment System (RetroArch/Pocket SNES, snes9x-rpi)
  • Sinclair ZX Spectrum (Fuse, FBZX)

Più alcuni port di giochi per PC quali

  • Duke Nukem 3D
  • Doom
  • Quake 3 Arena

 

Installare RetroPie

Scaricate l’immagine ISO dal sito; il secondo link scarica la ISO per il raspberry Pi 2.

A questo punto occorre caricare la ISO nella scheda SD. Sotto Windows possiamo utilizzare l’ottimo Win32 Disk Imager. Inserite la micro SD nel vostro PC (o usate un adattatore USB) e tramite Win32DiskImager copiateci sopra il file immagine. L’operazione richiederà alcuni minuti.

Screen shot 2016-02-06 at 10.40.07 PM

Una volta terminata la copia estraete la card SD e inseritela nel RaspberryPi.

Accendete il RaspberryPi e dovreste vedere il classico log di boot Linux…

raspi2boot

 

Successivamente dovrebbe comparire lo splash screen standard di RetroPie…

splashscreen-300x169

e per finire il menù principale…

theming_system

Collegate la tastiera ad una delle prese USB e dovreste essere in grado di muovervi tra le voci del menu.

Configurazione RetroPie

E’ giunto il momento di configurare RetroPie.

Ho stilato un breve elenco delle cose da fare per configurare al meglio RetroPie:

  • configurazione dell’audio HDMI
  • configurazione joypad
  • espansione del file system sulla sd card
  • update dello script di RetroPie (opzionale)
  • cambio dell’emulatore SuperNintendo (Snes9x a PocketSnes)
  • caricare le ROM dei videogiochi

Configurazione audio HDMI

Di default l’audio non è configurato correttamente e l’uscita HDMI risulta muta (solo su alcune TV). Se siete fortunati l’audio funzionerà alla grande fin da subito, se non lo siete occorrerà forzare l’audio sull’uscita HDMI :-).

Entrate in console premendo F4 da qualsiasi punto del menu. Una volta premuto F4 dovrete premere invio o un alto tasto altrimenti il sistema ritornerà automaticamente al menu grafico.

Una volta in console abilitate l’utente root dando il comando:

sudo passwd

Scegliete una password per l’utente root, ad esempio “root” 🙂

Ora entrate in modalità  root digitando

su root

e date la password. A questo punto siete in grado di modificare le impostazioni dell’audio.

Aprite il file /boot/config.txt con il comando

 nano /boot/config.txt

e scommentate la riga hdmi_drive=2

In sostanza dovrete modifica la riga da cosi’:

#hdmi_drive=2

a cosi’:

hdmi_drive=2

Salvate il file, e riavviate digitando reboot (sempre come root).

A questo punto l’audio dovrebbe essere a posto. Tuttavia, finchè non avrete una ROM da provare non potrete testare l’audio.

Espansione del filesystem

Il file immagine di RetroPie che avete installato sulla sd card crea due partizioni, una di boot da qualche  MB e una più grande da 2GB. Per sfruttare tutta la capacità della sd card occorrerà espandere questa partizione fino alla dimensione massima possibile.

Entrate nel menu principale e andate alla voce “RetroPie”.

menu_retropie

Selezionate “Raspberry Pi configuration tool RASPI-CONFIG”

raspberry_pi_configurations

Selezionate “Expand Filesystem”

expand_filesystem

Riavviate tutto. Al boot dovrebbe partire l’operazione di espansione. A questo punto avete a disposizione tutti i GB della scheda SD per le ROM dei giochi.

Configurazione del JoyPad

L’operazione è semplicissima. Mentre siete nel menu principale collegate un joypad USB al Raspberry Pi, dovrebbe partire in automatico la fase di configurazione: premete i bottoni sul joypad secondo le indicazioni a schermo (alto, basso, sinistra, destra, pulsante “A”, pulsante “B” etc..etc…). La lista dei pulsanti è molto lunga (credo sia quella di un joypad playstation) se non avete “abbastanza bottoni” potete saltarne alcuni tenendo premuto per 2 secondi un tasto qualsiasi (anche un bottone già selezionato in precedenza)

Update dello script RetroPie

Un aggiornamento allo script principale vi risolverà grandi mal di testa in futuro. Dal menu principale selezionate “RetroPie” e quindi “RetroPie Setup”. Selezionate ora “Update RetroPie-Setup script”. Ovviamente è richiesta una connessione internet quindi il Raspberry Pi dovrà essere collegato al router tramite cavetto ethernet.

Cambio dell’emulatore di default del Super Nintendo

L’emulatore di default del Super Nintendo (snes9x) non sembra essere all’altezza di alcuni giochi (sopratutto quelli che sfruttavano il coprocessore grafico superFx, tipo Yoshi Island). Per fortuna una valida alternativa è data dall’emulatore PocketSnes, già presente in RetroPie e ottimizzato per processori ARM.

Andate nel menu “RetroPie”, quindi in “Edit retropie/retroarch configurations”

selezione_edit_retropie

Selezionate “Manually edit all configurations”

manually_edit_all_configurations

Selezionate “snes/emulator.cfg”

selezione_snes_emulators

e all’utima riga scrivete:

default=”lr-pocketsnes”

selezione_pocketsnes

Salvate e riavviate. A questo punto il nuovo emulatore è pronto ad essere utilizzato. Nessun rallentamento o glitch video e audio perfetto.

Caricare le ROM dei videogiochi sul Raspberry Pi

Anche questa operazione è semplicissima.

Potete trovare le ROM su internet, consiglio il famoso emuparadise. Mi raccomando però, in teoria potete scaricare solo le ROM dei giochi che già possedete, almeno questo è quello che dicono i disclaimer sui vari siti di download.

Collegate il Raspberry Pi alla LAN: RetroPie è configurato per condividere automaticamente la directory dove immagazzina tutte le ROM.  Da un PC qualsiasi collegato alla stessa rete dovreste vedere RetroPie sotto questo nome:

\\retropie

doppio click e trovate la cartella “rom”, all’interno altre sottocartelle, ognuna delle quali relativa ad un emulatore. Copiate le ROM nelle cartelle opportune.

Riavviate. Dal menu principale di RetroPie dovreste vedere ora tutti gli emulatori per i quali avete caricato le ROM!

emulatori

Selezionate un emulatore e troverete la lista completa delle ROM che avete caricato (per quell’emulatore).

lista giochi

 

Tutto a posto!

A questo punto staccate cavo ethernet e tastiera, non serviranno più. Tutto il sistema è gestibile via joypad, anche l’uscita da un emulatore (premete contemporaneamente i tasti start e pausa) e lo spegnimento del Raspberry Pi (dal menu, premete start e selezionate “shutdown”).

EDIT (19 Feb 2017)

In un recente articolo mostro come collegare un joypad originale del Super Nintendo al RaspberryPi tramite porta USB. La modifica è abbastanza semplice e non occorrono driver particolari