Aggiungiamo ora una funzionalità piuttosto interessante, ovvero la possibilità di passare alla nostra classe un indirizzo in forma testuale che può essere del tipo:
- Piazza Duomo Milano
- Trieste
- Innsbruck
- Colosseo
e di vederci restituita la mappa posizionata esattamente nel punto specificato.
Questa “Magia” è possibile grazie al servizio Geocoding di Google Maps, che consente di ottenere le coordinate geografiche (latitudine e longitudine) di un punto descritto in modo testuale.
Inizieremo quindi a dichiarare una variabile membro della classe chiamata $address, in modo da poter memorizzare l’indirizzo. Nel costruttore lo inizializzeremo a stringa vuota.
class PhpGoogleMap {
// variabili membro della classe
private $apikey;
private $dimX;
private $dimY;
private $latitude;
private $longitude;
private $address;
function __construct($_apikey){
$this->apikey = $_apikey;
$this->dimX = 500;
$this->dimY = 300;
$this->latitude = 0;
$this->longitude = 0;
$this->address = "";
}
Scriviamo la funzione setAddress, in modo da poter impostare l’indirizzo da codice PHP:
function setAddress($address){
$this->address = $address;
}
Siccome vogliamo comunque mantenere l’impostazione manuale di latitudine e longitudine, dobbiamo pero’ decidere se centrare la mappa in base alle coordinate inserite manualmente oppure in base all’indirizzo.
L’idea è quella di centrare la mappa in base all’indirizzo solo quando questo è impostato ad un valore diverso dalla stringa vuota. Se l’indirizzo invece è vuoto, la mappa verrà centrata in base alle coordinate.
Per mettere in pratica questa idea è pero’ necessario effettuare un controllo al fine di non avere un indirizzo impostato quando non lo desideriamo: tradotto, se impostiamo le coordinate manuali vogliamo che l’indirizzo sia effettivamente vuoto. Aggiungiamo perciò una riga a setCoordinates:
function setCoordinates($lat, $long){
$this->latitude = $lat;
$this->longitude = $long;
$this->address = "";
}
Ora viene il bello. Dobbiamo complicare un po’ la funzione renderJS, poichè si dovrà comportare in modo diverso a seconda che la centratura della mappa avvenga attraverso l’indirizzo oppure attraverso le coordinate.
Introduciamo perciò la variabile $JScenterMap che, come dive il nome, conterrà il codice JS necessario a centrare la mappa o in base all’indirizzo o in base alle coordinate.
Il pezzo di codice che si occupa di inizializzare la mappa diventerà:
// inizializza la mappa
echo "
<script type=\"text/javascript\">
window.onload = initialize;
window.onunload = GUnload;
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById(\"map_canvas\"));
$JScenterMap
map.setUIToDefault();
}
}
</script>
";
Dove al comando map.setCenter è stata sostituita la variabile $JScenterMap, che dovrà essere già stata “riempita”. Il seguente codice va perciò inserito prima del precedente:
// assegna alla variabile $JScenterMap il codice necessario a centrare la mappa
if($this->address!=""){
$JScenterMap = "
var geocoder = new GClientGeocoder();
geocoder.getLatLng(
'".$this->address."',
function(point) {
if (!point) {
alert('".$this->address."' + \" not found\");
} else {
map.setCenter(point, 13);
}
});
";
} else {
$JScenterMap = "map.setCenter(new GLatLng(".$this->latitude.", ".$this->longitude."), 13);";
}
La spiegazione del funzionamento è semplice.
Viene effettuato un controllo sulla stringa address; se l’indirizzo è vuoto, allora il codice da inserire sarà uguale a quello che avevamo in precedenza: ovvero, conterrà un map.setCenter con le coordinate prese dalle variabili membro della classe.
Se l’indirizzo invece è “diverso dalla stringa vuota”, allora occorre creare (tramite codice JavaScript) un nuovo oggetto GClientGeocoder, che grazie al metodo getLatLng può ricavare le coordinate del luogo desiderato.
Se l’indirizzo non riesce ad essere convertito in coordinate, verrà visualizzato un alert.
La sintassi è un po’ criptica, poichè alla funzione getLatLng passiamo sia la stringa dell’indirizzo sia una funzione, che scriviamo inline “al volo”, a cui viene passato un punto “point” che è il risultato della localizzazione.
Provate ora, nella pagina base.php a richiamare la setAddress con l’indirizzo di casa vostra…
<?php
include("PhpGoogleMap.php");
$map = new PhpGoogleMap("ABQIAAAAaCXVeDXfpm7YlAwseZnnIRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRftdtfVBwCVswj14F5-5imlhaaQg");
$map->setDimensions(800, 600);
$map->setAddress("Piazza Duomo Milano");
Bello vero?

