Usuario anónimo  |  Ingresar  |  Regístrate

GeoCoding Avanzado

Para recoger información detallada del sitio que estamos buscando, se necesitará el Geocoding avanzado.

Usarlo es muy sencillo. Básicamente consiste en pasarle un lugar como parámetro y recoger toda la información que la API de Google nos provee. Hay dos modos de ejecutar esta acción:

  • Si hay un GMap instanciado en la página, no hay más que llamar a GMap1.getGeoCodeRequest(...) [geoCodeRequest está obsoleto desde la versión 3].
  • Pero también se puede acceder a un método estático, que no requiere que el GMap esté en la página. Lo único que hay que tener en cuenta es que hay que pasarle como parámetro la clave de la API de Google. Se llamaría así: GMap.geoCodeRequest(...).

El método estático devuelve dos tipos de datos. Por una parte está el Geocode (clase estructurada de manera idéntica al XML que Google provee) y por otra un string del que se puede elegir su formato (xml, kml, json y csv).

Estos son los parámetros que pueden pasarse a las funciones:

  • Query: la ubicación que buscanda.
  • Coordinates: en lugar de una query, se puede buscar un punto GLatLng
  • GoogleKey: sólo necesario en caso de usar los métodos estáticos.
  • Premium: si se dispone de una cuenta Business de la API oficial de GoogleMaps se puede usar en lugar de la GoogleKey (sólo es necesario para los métodos estáticos).
  • GeoCode.outputEnum output: donde se indica el tipo de datos a devolver (xml, kml, json y csv). Si no se define nos devolverá el tipo Geocode.
  • baseCountryCode: indicando el código del país se obtendrá el resultado en base a su cercanía con éste.
  • viewport: usando GLatLngBounds marca la zona de referencia sobre la que se quiere obtener el resultado.

Accediendo al campo status.code se accederá al mensaje de estado de la búsqueda, por ejemplo para saber qué error ha ocurrido. La definición de los mensajes de estado está aquí: https://developers.google.com/maps/documentation/javascript/reference#GeocoderStatus

La clase Geocode se ha estructurado de manera idéntica al XML que provisto por Google. Un ejemplo de un XML de Google: si se buscase "1600 amphitheatre mtn view ca". Se puede comparar con el ejemplo de código que mostrado y se ve que las clases y sus propiedades son análogas al XML:

<kml>
    <Response>
        <name>1600 amphitheatre mtn view ca</name>
        <Status>
            <code>200</code>
            <request>geocode</request>
        </Status>
        <Placemark>
            <address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</address>
            <AddressDetails Accuracy="8">
                <Country>
                    <CountryNameCode>US</CountryNameCode>
                    <AdministrativeArea>
                        <AdministrativeAreaName>CA</AdministrativeAreaName>
                        <SubAdministrativeArea>
                            <SubAdministrativeAreaName>Santa Clara</SubAdministrativeAreaName>
                            <Locality>
                                <LocalityName>Mountain View</LocalityName>
                                <Thoroughfare>
                                    <ThoroughfareName>1600 Amphitheatre Pkwy</ThoroughfareName>
                                </Thoroughfare>
                                <PostalCode>
                                    <PostalCodeNumber>94043</PostalCodeNumber>
                                </PostalCode>
                            </Locality>
                        </SubAdministrativeArea>
                    </AdministrativeArea>
                </Country>
            </AddressDetails>
            <Point>
                <coordinates>-122.083739,37.423021,0</coordinates>
            </Point>
        </Placemark>
    </Response>
</kml>

Buscar una dirección

Code.aspx
<strong><asp:Literal ID="lt_Texto" runat="server" meta:resourcekey="lt_TextoResource1"></asp:Literal></strong>
<asp:TextBox ID="tb_Buscar" runat="server"></asp:TextBox>
<asp:Button ID="bt_Buscar" runat="server" Text="Buscar" OnClick="bt_Buscar_Click" meta:resourcekey="bt_BuscarResource1" />
        </p>
        <p>
<asp:Label ID="lb_Buscar" runat="server"></asp:Label>
        </p>
Code.aspx.cs
protected void bt_Buscar_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(tb_Buscar.Text))
    {
        string key = ConfigurationManager.AppSettings.Get("googlemaps.subgurim.net");

        //Response.Write(GMap.geoCodeRequest(tb_Buscar.Text, Key, GeoCode.outputEnum.json));
        //return;

        GeoCode geocode = GMap.geoCodeRequest(tb_Buscar.Text, key, new GLatLngBounds(new GLatLng(40, 10), new GLatLng(50, 20)));

        GMap gMap1 = new GMap();
        gMap1.getGeoCodeRequest(tb_Buscar.Text, new GLatLngBounds(new GLatLng(40, 10), new GLatLng(50, 20)));

        StringBuilder sb = new StringBuilder();

        if ((null != geocode) && geocode.valid)
        {
            sb.Append("<ul>");
            sb.AppendFormat("<li><i>geocode.name</i>:{0}</li>", geocode.name);
            sb.AppendFormat("<li><i>geocode.Status.code</i>:{0}</li>", geocode.Status.code);
            sb.AppendFormat("<li><i>geocode.Status.request</i>:{0}</li>", geocode.Status.request);
            sb.AppendFormat("<li><i>geocode.Placemark.address</i>:{0}</li>", geocode.Placemark.address);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.accuracy</i>:{0}</li>", geocode.Placemark.AddressDetails.accuracy);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.CountryNameCode</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.CountryNameCode);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber);
            sb.AppendFormat("<li><i>geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName</i>:{0}</li>",
                geocode.Placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName);
            sb.AppendFormat("<li><i>geocode.Placemark.coordinates</i>:{0}</li>", geocode.Placemark.coordinates);
            sb.Append("</ul>");
        }
        else
        {
            sb.Append("Locations not found");
        }

        lb_Buscar.Text = sb.ToString();
    }
}
Powered by Subgurim.NET