2010-06-30 30 views
18

He notado una gran cantidad de información acerca de cómo obtener su ubicación usando la geolocalización de Google, en función de la dirección IP. Pero me pregunto si y cómo podría usar este servicio para ingresar una ubicación (longitud y latitud) y recuperar la dirección actual, o al menos una ciudad, estado.API de geolocalización de Google: ¿utiliza la longitud y la latitud para obtener la dirección en el cuadro de texto?

Me gustaría hacer esto en C#, pero trabajaré con cualquier idioma.

¿Algún consejo?

Respuesta

21

Lo que describes se llama Reverse Geocoding. Google proporciona un Geocoding Web Service API al que puede llamar desde su aplicación del lado del servidor (usando cualquier idioma) to do reverse geocoding.

Por ejemplo, la siguiente petición:

http://maps.google.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=false

... devolverá una respuesta que se parece a la siguiente (truncada):

<GeocodeResponse> 
<status>OK</status> 
<result> 
    <type>street_address</type> 
    <formatted_address>277 Bedford Ave, Brooklyn, NY 11211, USA</formatted_address> 
    <address_component> 
    <long_name>277</long_name> 
    <short_name>277</short_name> 
    <type>street_number</type> 
    </address_component> 
    <address_component> 
    <long_name>Bedford Ave</long_name> 
    <short_name>Bedford Ave</short_name> 
    <type>route</type> 
    </address_component> 
    <address_component> 
    <long_name>Brooklyn</long_name> 
    <short_name>Brooklyn</short_name> 
    <type>sublocality</type> 
    <type>political</type> 
    </address_component> 
    <address_component> 
    <long_name>New York</long_name> 
    <short_name>New York</short_name> 
    <type>locality</type> 
    <type>political</type> 
    </address_component> 
    <address_component> 
    <long_name>Kings</long_name> 
    <short_name>Kings</short_name> 
    <type>administrative_area_level_2</type> 
    <type>political</type> 
    </address_component> 
    <address_component> 
    <long_name>New York</long_name> 
    <short_name>NY</short_name> 
    <type>administrative_area_level_1</type> 
    <type>political</type> 
    </address_component> 
    <address_component> 
    <long_name>United States</long_name> 
    <short_name>US</short_name> 
    <type>country</type> 
    <type>political</type> 
    </address_component> 
    <address_component> 
    <long_name>11211</long_name> 
    <short_name>11211</short_name> 
    <type>postal_code</type> 
    </address_component> 
    <geometry> 
    <location> 
    <lat>40.7142330</lat> 
    <lng>-73.9612910</lng> 
    </location> 
    <location_type>ROOFTOP</location_type> 
    <viewport> 
    <southwest> 
    <lat>40.7110854</lat> 
    <lng>-73.9644386</lng> 
    </southwest> 
    <northeast> 
    <lat>40.7173806</lat> 
    <lng>-73.9581434</lng> 
    </northeast> 
    </viewport> 
    </geometry> 
</result> 
</GeocodeResponse> 

Sin embargo, tenga en cuenta que el Google Maps API Terms of Use parece prohibit the storage of the results, a menos que la tienda actúe como un caché para los datos que se utilizarán en Google Maps. Es posible que desee ponerse en contacto con Google y consultar en el Google Maps API Premier para tener términos de uso más flexibles para sus requisitos de geocodificación.

+0

Funciona como un encanto gracias. No almacenaré los datos, así que eso no debería ser un problema. ¡Gracias! – Brett

+1

@Daniel, ¿esta aplicación google maps api es gratis? ¿acceso limitado? Por favor especifica. Quiero utilizarlo no violando los términos y condiciones de la API de Google Maps. – Mahe

1

Google Maps API revisa http, por lo que enviar la solicitud con get y luego analizar la solicitud ... Debería ser posible hacerlo en cualquier idioma.

Por ejemplo, en PHP:

$ret = file_get_contents("http://maps.google.com/maps/api/geocode/xml?address=" . 
      urlencode($address) . 
      "&sensor=false" . 
      "&key=" . $this->key 
    ); 

$xml = new SimpleXMLElement($ret); 
$error = $xml->status; 

mismas obras para todas las API.

+0

Esto no es una implementación de geocodificación inversa. – igorw

+0

Quise decir como ejemplo, cómo funcionó todo ... Tal vez debería haber sido más exacto. Pensé que simplemente mostrar cómo funciona en realidad sería suficiente. – Smar

3

Lo que estás tratando de hacer es revertir la geocodificación (Ver la respuesta de Daniel).

Un ejemplo de implementación en PHP:

/** 
* reverse geocoding via google maps api 
* convert lat/lon into a name 
*/ 
function reverse_geocode($lat, $lon) { 
    $url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false"; 
    $data = json_decode(file_get_contents($url)); 
    if (!isset($data->results[0]->formatted_address)){ 
     return "unknown Place"; 
    } 
    return $data->results[0]->formatted_address; 
} 
11

Aquí es una aplicación C#. Tenga en cuenta que no soy programador de C#, por lo que el código podría ser feo. Pero funciona. Te da más que solo la dirección. Esta es una aplicación de consola, debe ser capaz de adaptarla para formularios web o formularios de win fácilmente.

using System; 
using System.Threading; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Xml; 
using System.Xml.XPath; 

namespace ReverseGeoLookup 
{ 
// http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding 
    public static string ReverseGeoLoc(string longitude, string latitude, 
     out string Address_ShortName, 
     out string Address_country, 
     out string Address_administrative_area_level_1, 
     out string Address_administrative_area_level_2, 
     out string Address_administrative_area_level_3, 
     out string Address_colloquial_area, 
     out string Address_locality, 
     out string Address_sublocality, 
     out string Address_neighborhood) 
    { 

     Address_ShortName = ""; 
     Address_country = ""; 
     Address_administrative_area_level_1 = ""; 
     Address_administrative_area_level_2 = ""; 
     Address_administrative_area_level_3 = ""; 
     Address_colloquial_area = ""; 
     Address_locality = ""; 
     Address_sublocality = ""; 
     Address_neighborhood = ""; 

     XmlDocument doc = new XmlDocument(); 

     try 
     { 
      doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + latitude + "," + longitude + "&sensor=false"); 
      XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status"); 
      if (element.InnerText == "ZERO_RESULTS") 
      { 
       return ("No data available for the specified location"); 
      } 
      else 
      { 

       element = doc.SelectSingleNode("//GeocodeResponse/result/formatted_address"); 

       string longname=""; 
       string shortname=""; 
       string typename =""; 
       bool fHit=false; 


       XmlNodeList xnList = doc.SelectNodes("//GeocodeResponse/result/address_component"); 
       foreach (XmlNode xn in xnList) 
       { 
        try 
        { 
         longname = xn["long_name"].InnerText; 
         shortname = xn["short_name"].InnerText; 
         typename = xn["type"].InnerText; 


         fHit = true; 
         switch (typename) 
         { 
          //Add whatever you are looking for below 
          case "country": 
           { 
            Address_country = longname; 
            Address_ShortName = shortname; 
            break; 
           } 

          case "locality": 
           { 
            Address_locality = longname; 
            //Address_locality = shortname; //Om Longname visar sig innehålla konstigheter kan man använda shortname istället 
            break; 
           } 

          case "sublocality": 
           { 
            Address_sublocality = longname; 
            break; 
           } 

          case "neighborhood": 
           { 
            Address_neighborhood = longname; 
            break; 
           } 

          case "colloquial_area": 
           { 
            Address_colloquial_area = longname; 
            break; 
           } 

          case "administrative_area_level_1": 
           { 
            Address_administrative_area_level_1 = longname; 
            break; 
           } 

          case "administrative_area_level_2": 
           { 
            Address_administrative_area_level_2 = longname; 
            break; 
           } 

          case "administrative_area_level_3": 
           { 
            Address_administrative_area_level_3 = longname; 
            break; 
           } 

          default: 
           fHit = false; 
           break; 
         } 


         if (fHit) 
         { 
          Console.Write(typename); 
          Console.ForegroundColor = ConsoleColor.Green; 
          Console.Write("\tL: " + longname + "\tS:" + shortname + "\r\n"); 
          Console.ForegroundColor = ConsoleColor.Gray; 
         } 
        } 

        catch (Exception e) 
        { 
         //Node missing either, longname, shortname or typename 
         fHit = false; 
         Console.Write(" Invalid data: "); 
         Console.ForegroundColor = ConsoleColor.Red; 
         Console.Write("\tX: " + xn.InnerXml + "\r\n"); 
         Console.ForegroundColor = ConsoleColor.Gray; 
        } 


       } 

       //Console.ReadKey(); 
       return (element.InnerText); 
      } 

     } 
     catch (Exception ex) 
     { 
      return ("(Address lookup failed:) " + ex.Message); 
     } 
     } 
} 
0
protected void Button1_Click(object sender, EventArgs e) 
    { 
     this.calcularRota(txtOrigem.Text.Trim(), txtDestino.Text.Trim()); 
    } 


    public void calcularRota(string latitude, string longitude) 
    { 
     //URL do distancematrix - adicionando endereco de origem e destino 
     string url = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false", latitude, longitude); 
     XElement xml = XElement.Load(url); 

     // verifica se o status é ok 
     if (xml.Element("status").Value == "OK") 
     { 
      //Formatar a resposta 
      Label3.Text = string.Format("<strong>Origem</strong>: {0}", 
       //Pegar endereço de origem 
       xml.Element("result").Element("formatted_address").Value); 
      //Pegar endereço de destino      
     } 
     else 
     { 
      Label3.Text = String.Concat("Ocorreu o seguinte erro: ", xml.Element("status").Value); 
     } 
    } 
} 
1

Una manera fácil de obtener una dirección es a través de la API de Google.

Por ejemplo.

using System.Xml; 

//Console.WriteLine("enter coordinate:"); 
string coordinate = "32.797821,-96.781720"; //Console.ReadLine(); 

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load("https://maps.googleapis.com/maps/api/geocode/xml?latlng=" + coordinate); 

XmlNodeList xNodelst = xDoc.GetElementsByTagName("result"); 
XmlNode xNode = xNodelst.Item(0); 
string FullAddress = xNode.SelectSingleNode("formatted_address").InnerText; 
string Number = xNode.SelectSingleNode("address_component[1]/long_name").InnerText; 
string Street = xNode.SelectSingleNode("address_component[2]/long_name").InnerText; 
string Village = xNode.SelectSingleNode("address_component[3]/long_name").InnerText; 
string Area = xNode.SelectSingleNode("address_component[4]/long_name").InnerText; 
string County = xNode.SelectSingleNode("address_component[5]/long_name").InnerText; 
string State = xNode.SelectSingleNode("address_component[6]/long_name").InnerText; 
string Zip = xNode.SelectSingleNode("address_component[8]/long_name").InnerText; 
string Country = xNode.SelectSingleNode("address_component[7]/long_name").InnerText; 
Console.WriteLine("Full Address: " + FullAddress); 
Console.WriteLine("Number: " + Number); 
Console.WriteLine("Street: " + Street); 
Console.WriteLine("Village: " + Village); 
Console.WriteLine("Area: " + Area); 
Console.WriteLine("County: " + County); 
Console.WriteLine("State: " + State); 
Console.WriteLine("Zip: " + Zip); 
Console.WriteLine("Country: " + Country); 

Console.ReadLine(); 

P.S. tenga cuidado con diferentes direcciones con diferentes componentes.

Cuestiones relacionadas