Maps.Subgurim.Net

Usuario anónimo  |  Ingresar  |  Regístrate

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 se ha visto cómo obtener información de un lugar a partir su nombre... pero, ¿y si se quiere obtener información de un lugar sólo a partir de sus coordenadas geográficas?

Para ello está 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 se quiere información.
  • radius: radio en kilómetros sobre el que buscar lugares cercanos.
  • N: cantidad máximo de lugares cercanos que se quiere como respuesta.
  • language: idioma en que se quiere la respuesta.

Y tras hacerlo se llama a inverseGeoCodeRequest, que devolverá un listado genérico de instancias de la clase inverseGeocoding, ordenadas de más a menos cercano al punto 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 indicado.
  • nearestPlacePoint: coordenadas del lugar habitado más cercano al punto 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 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, se recoge la información que da el geoCoding inverso y se muestra en un infoWindow. Adicionalmente, se habilita la función "goTo" añadiendo un CustomJavascript que permite viajar al lugar más cercano, y además se hace el "truco" de lanzar una Infowindow mientras se viaja y se vuelve del servidor, haciendo parecer que se está esperando la respuesta.

Code.aspx
<cc1:GMap ID="GMap1" runat="server" enableServerEvents="True" OnClick="GMap1_Click" />
Code.aspx.cs
private void BuildMap()
{
    GMap1.Add(new GControl(GControl.preBuilt.LargeMapControl));
    GMap1.enableHookMouseWheelToZoom = true;

    GLatLng latlng = new GLatLng("point");
    GInfoWindow window = new GInfoWindow(latlng, "<div style=\"height:140px;\"><blink>Loading...</blink></div>");

    StringBuilder sb = new StringBuilder();
    sb.Append("function(marker, point) {");
    sb.Append(window.ToString(GMap1.GMap_Id));
    sb.Append("}");

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

    GLatLng point = new GLatLng("point");
    GMove move = new GMove(1, point);
    GMarker marker = new GMarker(point);

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

    GMap1.Add(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>");
        sb.Append("<b>Nearest Place </b><br/>");
        //sb.AppendFormat("<a href=\"javascript:{0}\">goTo</a>", new GMove(10,geo.nearestPlacePoint).ToString(e.map));
        sb.AppendFormat("Place name: <i>{0}</i><br/>", geo.name);
        sb.AppendFormat("Point: <i>{0}</i><br/>", geo.nearestPlacePoint);
        sb.AppendFormat("Elevation: <i>{0}</i><br/>", geo.nearestPlaceElevation > -9000 ? geo.nearestPlaceElevation.ToString() : "No info");
        sb.AppendFormat("Country Name (Code): <i>{0} ({1})</i><br/>", geo.countryName, geo.countryCode);
        sb.AppendFormat("Click point - Nearest Place distance (Km): <i>{0}</i>", Math.Round(geo.distance, 3));
        sb.Append("</div>");
        sb.Append("<div>");
        sb.Append("<b>Click point</b><br/>");
        sb.AppendFormat("Point: <i>{0}</i><br/>", geo.initialPoint);
        sb.AppendFormat("Elevation: <i>{0}</i><br/>", geo.initialPointElevation > -9000 ? geo.initialPointElevation.ToString() : "No info");
        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