martes, 30 de abril de 2013

API Google Maps y Visual Basic.NET. Parte VI. Buscar código postal.

En esta entrada vamos a explicar de forma breve cómo buscar un código postal a partir de una localización. Realmente no se va a ver nada nuevo, ya que esta información se extrae a través de una petición de codificación geográfica, que ha sido explicada en otra entrada.
Como se puede observar al hacer la petición, hay un campo en el que se incluye el código postal. Este campo está localizado en una etiqueta denominada postal_code que se encuentra dentro de otra etiqueta llamada address_component.
Petición: http://maps.googleapis.com/maps/api/geocode/xml?address=Puerta%20del%20Sol,%20Madrid&region=es&sensor=false&language=es

Código postal en archivo XML


El siguiente paso es crear una función que genere la petición HTTP, lea los contenidos del archivo XML y devuelva el código postal.
 'La función devuelve un arraylist en el que la primera posición es el código postal, y la segunda la dirección encontrada
    Private Function CodigoPostal(ByVal direccion As String, Optional ByVal regionBusqueda As String = "es") As ArrayList

        'Creamos la url con los datos
        Dim url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" & direccion & "&region=" & regionBusqueda & "&sensor=false&language=es"

        'Cadena que contendrá el código postal y la dirección encontrada
        'Y le damos valores iniciales
        Dim DatosRetorno As New ArrayList
        DatosRetorno.Add("No encontrado código postal. Sea más específico (indique calle, plaza, etc.).")
        DatosRetorno.Add("No se ha encontrado localización")

        'Creamos una petición http y asignamos un tiempo máximo de espera de 3000 milisegundos
        Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        req.Timeout = 3000

        Try
            'Preparamos el archivo xml
            Dim res As System.Net.WebResponse = req.GetResponse()
            Dim responseStream As Stream = res.GetResponseStream()
            Dim NodeIter As XPathNodeIterator
            Dim docNav As New XPathDocument(responseStream)
            Dim nav = docNav.CreateNavigator

            'Creamos los paths
            Dim Exadress As String = "/GeocodeResponse/result/address_component"
            Dim ExDireccion As String = "GeocodeResponse/result/formatted_address"

            'Recorremos el xml buscando el código postal
            NodeIter = nav.Select(Exadress)
            While (NodeIter.MoveNext())
                'Busca un campo donde ponga postal_code
                If NodeIter.Current.Value.Contains("postal_code") Then
                    'Se extraen los caracteres correspondientes la código postal
                    DatosRetorno(0) = NodeIter.Current.Value.Substring(0, 5)
                    Exit While
                End If
            End While

            'Recorremos el xml buscando la dirección
            NodeIter = nav.Select(ExDireccion)
            While (NodeIter.MoveNext())
                DatosRetorno(1) = NodeIter.Current.Value
                Exit While
            End While

            'cerramos el response
            responseStream.Close()

        Catch ex As Exception
            'En caso de haber error
            DatosRetorno(0) = "Algo ha ocurrido, inténtelo más tarde"
            DatosRetorno(1) = "Algo ha ocurrido, inténtelo más tarde"

        End Try

        'Se retorna el código postal y la dirección encontrada
        Return DatosRetorno
    End Function
En resumen, la función recibe un primer parámetro que incluye la dirección de donde se quiere buscar el código postal, y otro parámetro opcional que recibe la región. A partir de estos dos parámetros crea la url y busca el código postal (si lo hay) y la dirección encontrada. Tanto código postal como dirección encontrada, son almacenados en un arraylist, siendo el código postal el primer campo y la dirección el segundo.
Ahora crearemos un pequeño formulario como el que vemos a continuación.

Formulario de la aplicación

Ahora, al evento clic del botón, le vamos a asignar el siguiente código.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Comprobamos que hay texto
        If txtdireccion.Text <> "" Then
            'ASignamos a la variable CódigoP el valor devuelto por la función
            Dim CodigoP As New ArrayList(CodigoPostal(txtdireccion.Text))
            txtCodigoPostal.Text = CodigoP(0)
            txtDireccionEncontrada.Text = CodigoP(1)
        End If
    End Sub
Ejecutamos el programa y, si la dirección es lo suficientemente específica, nos devolverá el código postal.

Formulario después de búsqueda

Descarga la aplicación desde aquí:


3 comentarios:

  1. ei man yo soy medio bobo pero se ve interesante tu trabajo y bueno es demasiado para mi yo quiero dar click en el google maps y que me diga que codigo postal es, se puede hacer eso?

    ResponderEliminar
    Respuestas
    1. Eso se podrá hacer con el API de Javascript

      Eliminar
  2. Tengo mi tarjeta de cajero automático ya programado y cubierta de
    retirar el máximo de $ 50,000 al día durante un máximo de 20
    días. Estoy muy feliz por esto porque yo tengo la mía la semana pasada
    y lo he utilizado para obtener $ 100,000.Mr Harry está dando la
    la tarjeta sólo para ayudar a los pobres y necesitan a pesar de que es ilegal pero
    es algo agradable y no es como pretender otra estafa
    tener las tarjetas de cajero automático en blanco. Y nadie se ve atrapado cuando
    el uso de la tarjeta. obtener el suyo de él. Sólo le envíe un correo electrónico
    en harrylugard190@gmail.com

    ResponderEliminar