在移动应用开发中,经常需要根据用户提供的经纬度信息来获取对应的地址。本文将介绍如何使用Google Geocoding API实现这一功能。
地理编码是指将地址转换为地理位置或坐标的过程。而逆地理编码则是其相反的操作,即当拥有地图上的位置信息时,想要获取该位置的地址信息。在智能手机内置GPS的帮助下,地理编码和逆地理编码变得非常常见。
Google Geocoding API提供了一个服务,允许发送HTTP请求到以下地址:
http://maps.googleapis.com/maps/api/geocode/
可以通过发送XML或JSON格式的请求,并附带一些参数来获取所需的信息。更多关于如何发送地理编码请求的信息,请参考。
下面是一个使用C#编写的控制台应用程序示例,演示了如何使用逆地理编码来查找地址:
class Program
{
static string baseUri = "http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false";
static void Main(string[] args)
{
RetrieveFormatedAddress("51.962146", "7.602304");
Console.ReadLine();
}
public static void RetrieveFormatedAddress(string lat, string lng)
{
string requestUri = string.Format(baseUri, lat, lng);
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
wc.DownloadStringAsync(new Uri(requestUri));
}
}
static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
var xmlElm = XElement.Parse(e.Result);
var status = (from elm in xmlElm.Descendants() where elm.Name == "status" select elm).FirstOrDefault();
if (status.Value.ToLower() == "ok")
{
var res = (from elm in xmlElm.Descendants() where elm.Name == "formatted_address" select elm).FirstOrDefault();
Console.WriteLine(res.Value);
}
else
{
Console.WriteLine("No Address Found");
}
}
}
在上述代码中,使用WebClient对象向Google Geocoding API发送请求,请求参数包括纬度和经度。返回的字符串是XML格式的(也可以是JSON格式),它可能看起来像这样:
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</formatted_address>
<address_component>
<long_name>1600</long_name>
<short_name>1600</short_name>
<type>street_number</type>
</address_component>
<address_component>
<long_name>Amphitheatre Pkwy</long_name>
<short_name>Amphitheatre Pkwy</short_name>
<type>route</type>
</address_component>
<address_component>
<long_name>Mountain View</long_name>
<short_name>Mountain View</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>San Jose</long_name>
<short_name>San Jose</short_name>
<type>administrative_area_level_3</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Santa Clara</long_name>
<short_name>Santa Clara</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>California</long_name>
<short_name>CA</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>94043</long_name>
<short_name>94043</short_name>
<type>postal_code</type>
</address_component>
<geometry>
<location>
<lat>37.4217550</lat>
<lng>-122.0846330</lng>
</location>
<location_type>ROOFTOP</location_type>
<viewport>
<southwest>
<lat>37.4188514</lat>
<lng>-122.0874526</lng>
</southwest>
<northeast>
<lat>37.4251466</lat>
<lng>-122.0811574</lng>
</northeast>
</viewport>
</geometry>
</result>
</GeocodeResponse>