¡Ayúdanos a traducir esta Web y consigue licencias gratis!
Usuario anónimo  |  Ingresar  |  Regístrate

Cómo...

Geocoding inverso

NOTA: En el geocoding inverso se utilizan las servicios Web de geonames.org, bajo licencia Creative Commons. Recomendamos altamente esta página, pues dispone de varios servicios Web relacionados con la geolocalización.

Hasta ahora hemos visto cómo obtener información de un lugar a partir su nombre... pero, ¿y si queremos obtener información de un lugar sólo a partir de sus coordenadas geográficas?

Para ello tenemos el GeoCoding inverso, y usarlo es muy sencillo. No hay más que instanciar la clase inverseGeocodingManager, que consta de 4 parámetros:
  • point: el punto sobre el que queremos información.
  • radius: radio en kilómetros sobre el que buscar lugares cercanos.
  • N: cantidad máximo de lugares cercanos que queremos como respuesta.
  • language: idioma en que queremos la respuesta.
Y tras hacerlo llamaremos a inverseGeoCodeRequest, que nos devolverá un listado genérico de instancias de la clase inverseGeocoding, ordenadas de más a menos cercano al punto que hemos señalado. La clase inverseGeocoding consta de las siguientes propiedades de interés:
  • name: nombre del lugar más cercano al punto indicado.
  • countryCode: código ISO del país del punto indicado.
  • countryName: nombre del país del punto indicado.
  • initialPoint: el punto que hemos indicado.
  • nearestPlacePoint: coordenadas del lugar habitado más cercano al punto que hemos indicado.
  • initialPointElevation: altura sobre el nivel del mar (en metros) del punto indicado.
  • nearestPlaceElevation: altura sobre el nivel del mar (en metros) del lugar habitado más cercano al punto que hemos indicado.
  • distance: distancia en Kilómetros entre el punto indicado y el lugar habitado más cercano.
El ejemplo mostrado a continuación es un ejemplo típico del uso del geoCoding inverso. Al hacer click sobre un punto del mapa, se ejecuta un evento de servidor. Manejando éste, recogemos la información que nos da el geoCoding inverso y la mostramos en un infoWindow. Adicionalmente, habilitamos la función "goTo" añadiendo un CustomJavascript que nos hará viajar al lugar más cercano, y además hacemos el "truco" de lanzar una infowindow mientras se viaja y se vuelve del servidor, haciendo parecer que estamos esperando la respuesta.



Code.aspx
<cc1:GMap ID="GMap1" runat="server" enableServerEvents="true" OnClick="GMap1_Click" />
Code.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
   if (!Page.IsPostBack)
   {
       this.arreglarMapa();
   }
}

private void arreglarMapa()
{
   GMap1.addControl(new GControl(GControl.preBuilt.LargeMapControl));
   GMap1.enableHookMouseWheelToZoom = true;

   StringBuilder sb = new StringBuilder();
   sb.Append("function(marker, point) {");
   GLatLng latlng = new GLatLng("point");
   GInfoWindow window = new GInfoWindow(latlng, "<div style=\"height:140px;\"><blink>Loading...</blink></div>");
   sb.Append(window.ToString(GMap1.GMap_Id));
   sb.Append("}");

   GMap1.addListener(new GListener(GMap1.GMap_Id, GListener.Event.click, sb.ToString()));

   StringBuilder sb2 = new StringBuilder();
   sb2.Append("function goTo(point){");
   GLatLng point = new GLatLng("point");
   sb2.AppendFormat("{0}.setZoom(11);", GMap1.GMap_Id);
   GMove move = new GMove(1, point);
   sb2.Append(move.ToString(GMap1.GMap_Id));
   GMarker marker = new GMarker(point);
   sb2.Append(marker.ToString(GMap1.GMap_Id));
   sb2.Append("}");
   GMap1.addCustomJavascript(sb2.ToString());
}

protected string GMap1_Click(object s, GAjaxServerEventArgs e)
{
   inverseGeocodingManager igeoManager = new inverseGeocodingManager(e.point, "es");
   inverseGeocoding iGeos = igeoManager.inverseGeoCodeRequest();
   geoName geo;
   if (iGeos.geonames.Count > 0)
   {
       geo = iGeos.geonames[0];

       StringBuilder sb = new StringBuilder();
       sb.Append("<div align=\"left\">");
       sb.Append(""<b>Nearest Place "</b>");
       sb.Append("<br />");
       sb.AppendFormat("Place name: "<i>{0}"</i> ", geo.name);
       sb.Append("<br />");
       sb.AppendFormat("Point: "<i>{0}"</i>", geo.nearestPlacePoint.ToString());
       sb.Append("<br />");
       sb.AppendFormat("Elevation: "<i>{0}"</i>", geo.nearestPlaceElevation > -9000 ? geo.nearestPlaceElevation.ToString() : "No info");
       sb.Append("<br />");
       sb.AppendFormat("Country Name (Code): "<i>{0} ({1})"</i>", geo.countryName, geo.countryCode);
       sb.Append("<br />");
       sb.AppendFormat("Click point - Nearest Place distance (Km): "<i>{0}"</i>", Math.Round(geo.distance, 3));
       sb.Append("</div>");

       sb.Append("<br />");
       sb.Append("<div align=\"left\">");
       sb.Append(""<b>Click point"</b>");
       sb.Append("<br />");
       sb.AppendFormat("Point: "<i>{0}"</i>", geo.initialPoint.ToString());
       sb.Append("<br />");
       sb.AppendFormat("Elevation: "<i>{0}"</i>", geo.initialPointElevation > -9000 ? geo.initialPointElevation.ToString() : "No info");
       sb.Append("<br />");
       sb.Append("</div>");

       GInfoWindow window = new GInfoWindow(e.point, sb.ToString(), true);
       return window.ToString(e.map);
   }
   else return string.Empty;
}
Powered by Subgurim.NET