Altezza del terreno su Google Map

Il bello della rete è che si trova proprio di tutto…
Non intendo programmi/file coperti da copyright o addirittura la dichiarazione dei redditi di tutti gli italiani che sono reperibili più o meno facilmente, ma intendo servizi e accesso ad informazioni che fino a qualche anno fa erano disponibili solo a prezzi esagerati.

Basti pensare alla foto aeree che, non uno ma più servizi, mettono a disposizione gratuitamente ad altri con tanto di API per utilizzarle. Oggi posso tranquillamente costruirmi un sito in cui il mio visitatore può
eseguire un calcolo di percorso in auto da un posto ad un altro senza che io spenda migliaia di euro in licenze TeleAtlas o NavTeq e altrettanti per un server Web che mi faccia il routing (senza contare che una volta spesi i soldi bisogna ancora sviluppare il tutto!).

Ecco per esempio earthtools.Dispone di diversi webservices che date le coordinate XY mi restituiscono diverse informazioni come l’altezza del terreno, l’ora di alba e tramonto, etc.

Ecco un esempio di utilizzo con google map, si clicca sulla mappa e viene visualizzata l’altezza del terreno link.
Ok: sulla Cina non è disponibile!

Vediamo come è possibile utilizzare il web service dalla nostra pagina contenente la mappa google…

Per la chiamata al web service utilizziamo l’oggetto GDownloadUrl che si preoccupa di fare una chiamata asincrona al web service messo a disposizione da earthtools.

Esempio di risposta del web service per le coordinate 45,9:
http://www.earthtools.org/height/45/9

Visto che la chiamata avviene in un dominio diverso da quello da cui si effettua la chiamata al servizio esistono dei problemi di sicurezza legati alla sicurezza dei browser.
Per risolverlo una tecnica è quella di creare una pagina php che fa da proxy alle chiamate verso il sito esterno. Una soluzione dettagliata la si trova su yahoo: Use a Web Proxy for Cross-Domain .

Ecco il nostro proxy:

<?php
define ('HOSTNAME', 'http://www.earthtools.org/');
$path = ($_POST['yws_path']) ? $_POST['yws_path'] : $_GET['yws_path'];
$url = HOSTNAME.$path;
$session = curl_init($url);
if ($_POST['yws_path']) {
	$postvars = '';
	while ($element = current($_POST)) {
		$postvars .= key($_POST).'='.$element.'&';
		next($_POST);
	}
	curl_setopt ($session, CURLOPT_POST, true);
	curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
}
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($session);
header("Content-Type: text/xml");
echo $xml;
curl_close($session);
?>

Codice

Una volta creato il nostro proxy tutte le chiamate javascript asincrone verranno redirette ad esso.

Codice javascript per la creazione della mappa e relativa gestione dell’evento click su di essa:

function MyApplication() 
 {  
 
 
    this.map = new GMap2(document.getElementById("map"));  
    this.map.setCenter(new GLatLng(41.86956082699455, 12.32666015625), 6);
    var mapControl = new GMapTypeControl();
    this.map.addControl(mapControl);
    this.map.addControl(new GLargeMapControl());
 
 
    this.Out = document.getElementById("out")
    GEvent.bind(this.map, "click", this, this.onMapClick);
 
 
 
  }
 
MyApplication.prototype.onMapClick = function(marker,point)
  {
 
 
 
	    if (point != null) { 
 
 
	        var path = 'height/' + point.y.toString() + "/" + point.x.toString();
				  var url = 'http://sito/earthtoolproxy.php?yws_path=' + encodeURIComponent(path);
 
 
 
          GDownloadUrl(url, function(data, responseCode)
            {
                //alert(data);
 
                var xml = GXml.parse(data);  
                var meters = xml.documentElement.getElementsByTagName("meters");
                //alert(meters[0].firstChild.nodeValue);
                var mtr = meters[0].firstChild.nodeValue;
                var htm  =  '<H1> Altezza: ' + mtr.toString() + ' metri</H1>';
                application.map.openInfoWindowHtml(point,htm);
            });
 
	    }
 
 
}

Codice per la creazione della mappa

Bye

Tags: , , , , , ,

Leave a Reply