Alguma vez, você já deve ter utilizado o serviço do Google Map como usuário, serviço tão útil que o Google disponibiliza algumas bibliotecas para integrar o Google Map em suas aplicações .NET, até aqui nada de novidade, e até na web existem vários artigos e exemplos de como consumir estas bibliotecas ou serviço do Google:

Veja alguns exemplos:

Os exemplos acima mostram uma aplicação web utilizando o Google map da seguinte forma: você passa o endereço para o serviço e ele redireciona você a imagem de referência no mapa, em que momento isso é útil, quando você quer visualizar o mapa de um endereço especifico. Bom mas como tem necessidades de deixar as coisas mais complexas, imagine a seguinte situação.

Você precisa disponibilizar um mapa no site, o usuário escolhe (clica) em um ponto do mapa, e você captura o endereço (latitude e longitude) do ponto no gráfico selecionado. Como fazer isso ?

Simples, o Google também possui um serviço chamado reverse-geocoder, e este serviço simplesmente resolve o problema acima, ou seja você gera o mapa e consegue pegar latitude e longitude do ponto selecionado.

A url do service é: "http://maps.google.com/maps/geo?q="; e para implementar no seu código é simples, veja um exemplo de uma classe consumindo este serviço:


            using System;

            using System.Collections.Generic;
            
            using System.Text;
            
            using System.Web;
            
            using System.Net;
            
            using System.Web.UI;
            
                        
            namespace GoogleGeocoder
            
            {
            
               public interface ISpatialCoordinate
            
               {
            
                  decimal Latitude {get; set; }
            
                  decimal Longitude {get; set; }
            
               }
                        
            
               ///
            
               /// Estrutura da Coordenada
            
               ///
            
               public struct Coordinate : ISpatialCoordinate
            
               {
            
                  private decimal _latitude;
            
                  private decimal _longitude;
            
                       
                  public Coordinate(decimal latitude, decimal longitude)
            
                  {
            
                     _latitude = latitude;
            
                     _longitude = longitude;
            
                  }
            
                        
                  #region ISpatialCoordinate Members
            
                   
                  public decimal Latitude
            
                  {
            
                    get
            
                    {
            
                        return _latitude;
            
                    }
            
                    set
            
                    {
            
                        this._latitude = value;
            
                    }
            
                  }
            
                         
                  public decimal Longitude
            
                  {
            
                    get
            
                    {
            
                        return _longitude;
            
                    }
            
                    set
            
                    {
            
                        this._longitude = value;
            
                    }
            
                  }
            
        
               #endregion
            
               }     
             
            
               public class Geocode
            
               {
            
                  private const string _googleUri = "http://maps.google.com/maps/geo?q=";
            
                  private const string _googleKey = "yourkey";
            
                  private const string _outputType = "csv"; // Opções de exportação: csv, xml, kml, json
            
                        
                  private static Uri GetGeocodeUri(string address)
            
                  {
            
                     address = HttpUtility.UrlEncode(address);
            
                     return new Uri(String.Format("{0}{1}&output={2}&key={3}", _googleUri, address, _outputType, _googleKey));
            
                  }
            
                       
                  ///
            
                  /// Metodo para Pegar a Coordenada de um endereço
            
                  ///
            
                  /// Endereço
            
                  ///
            
                  /// Rua Libero Badaró , SP
            
                  ///
            
                  ///
            
                  /// Latitude e longitude do endereço.
            
                  public static Coordinate GetCoordinates(string address)
            
                  {
            
                     WebClient client = new WebClient();
            
                     Uri uri = GetGeocodeUri(address);
            
                   
                     string[] geocodeInfo = client.DownloadString(uri).Split(',');
            
                      
                     return new Coordinate(Convert.ToDecimal(geocodeInfo[2]), Convert.ToDecimal(geocodeInfo[3]));
            
                  }
            
          
               }
            
            }           
        
Mais exemplos sobre: