2010-06-30 29 views
18

Tôi đã nhận thấy rất nhiều thông tin về cách nhận vị trí của bạn bằng cách sử dụng giao diện vị trí địa lý của Google, dựa trên địa chỉ IP. Nhưng tôi tự hỏi nếu và làm thế nào tôi có thể sử dụng dịch vụ này để nhập vào một vị trí (kinh độ và vĩ độ) và lấy lại địa chỉ hiện tại, hoặc ít nhất là một thành phố, tiểu bang.API vị trí địa lý của Google - Sử dụng kinh độ và vĩ độ để nhận địa chỉ trong hộp văn bản?

Tôi muốn làm điều này trong C#, nhưng tôi sẽ làm việc với bất kỳ ngôn ngữ.

Bạn có lời khuyên nào không?

Trả lời

21

gì bạn mô tả được gọi là Reverse Geocoding. Google cung cấp số Geocoding Web Service API mà bạn có thể gọi từ ứng dụng phía máy chủ của mình (sử dụng bất kỳ ngôn ngữ nào) to do reverse geocoding.

Ví dụ, yêu cầu sau đây:

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

... sẽ trả về một phản ứng trông giống như sau (cắt ngắn):

<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> 

Tuy nhiên phải nhận thức rằng Google Maps API Terms of Use dường như prohibit the storage of the results, trừ khi cửa hàng hoạt động như bộ nhớ cache cho dữ liệu sẽ được sử dụng trong Google Maps. Bạn có thể muốn liên lạc với Google và hỏi về số Google Maps API Premier để có các điều khoản sử dụng linh hoạt hơn cho các yêu cầu mã hóa địa lý của bạn.

+0

Làm việc như một cảm ơn. Tôi sẽ không lưu trữ dữ liệu, vì vậy đó không phải là một vấn đề. Cảm ơn !!! – Brett

+1

@Daniel, đây có phải là bản đồ google api miễn phí không? truy cập hạn chế? Xin hãy chỉ ra cụ thể. Tôi muốn sử dụng nó không vi phạm các điều khoản và điều kiện của bản đồ google api. – Mahe

1

API Google Maps vượt quá http, do đó, gửi yêu cầu nhận và sau đó phân tích cú pháp yêu cầu ... Có thể thực hiện bằng bất kỳ ngôn ngữ nào.

Ví dụ, trong 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; 

Cùng làm việc cho tất cả các API.

+0

Đây không phải là việc triển khai mã hóa địa lý đảo ngược. – igorw

+0

Tôi có nghĩa là ví dụ, làm thế nào toàn bộ điều làm việc ... Có lẽ tôi nên đã được chính xác hơn. Tôi nghĩ rằng chỉ cần thể hiện như thế nào nó thực sự hoạt động sẽ là đủ. – Smar

3

Điều bạn đang cố gắng thực hiện là mã hóa địa lý đảo ngược (Xem câu trả lời của Daniel).

Một ví dụ thực hiện trong 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

Đây là một C# thực hiện. Xin lưu ý rằng tôi không có lập trình viên C# - vì vậy mã có thể xấu. Nhưng nó đã có tác dụng. Nó cung cấp cho bạn nhiều hơn chỉ là địa chỉ. Đây là ứng dụng giao diện điều khiển, bạn có thể dễ dàng điều chỉnh ứng dụng này cho biểu mẫu web hoặc biểu mẫu winform.

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

Một cách dễ dàng để có được một địa chỉ là thông qua API của google.

Ví dụ:

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. hãy cẩn thận với các địa chỉ khác nhau với các thành phần khác nhau.

Các vấn đề liên quan