如何从C#代码调用Google地理编码服务

我在C#中有一个类库。 从那里我必须拨打Google服务并获取经纬度。

我知道如何在页面上使用AJAX,但是我想直接从我的C#类文件调用Google Geocoding服务。

有没有办法做到这一点,或有任何其他的服务,我可以用这个。

你可以做这样的事情:

 string address = "123 something st, somewhere"; string requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address)); WebRequest request = WebRequest.Create(requestUri); WebResponse response = request.GetResponse(); XDocument xdoc = XDocument.Load(response.GetResponseStream()); XElement result = xdoc.Element("GeocodeResponse").Element("result"); XElement locationElement = result.Element("geometry").Element("location"); XElement lat = locationElement.Element("lat"); XElement lng = locationElement.Element("lng"); 

您还需要validation响应状态并捕获任何WebException。 看看Google Geocoding API 。

我没有评论的声望,但只是想说,Chris Johnsons的代码就像一个魅力。 对于像我这样愚蠢的人来说,这些集会是:

 using System.Net; using System.Xml.Linq; 

您也可以使用经常与Asp.Net Web Api或Asp.Net 5.0一起使用的HttpClient类。

你也有一个免费的http状态码,asyn / await编程模型和HttpClientexception处理很容易。

 var address = "paris, france"; var requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address)); using (var client = new HttpClient()) { var request = await client.GetAsync(requestUri); var content = await request.Content.ReadAsStringAsync(); var xmlDocument = XDocument.Parse(content); } 

您可以调用Web服务并使用json / xml响应。

http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true

这返回一个你可以使用的json响应。

正如你可以阅读使用条款,你只能使用他们的networking服务,如果你显示谷歌地图。

在这里您可以find有关该服务的所有信息: https : //developers.google.com/maps/documentation/geocoding/

要了解如何处理json响应,请查看以下主题: Google Maps v3地理编码服务器端

编辑:我刚刚发现这篇文章: http : //www.codeproject.com/Tips/505361/Google-Map-Distance-Matrix-and-Geocoding-API-V3-we

我没有testing这个,但也许它适合你:)

编辑2:代码项目的例子似乎并没有工作:(在那里提到的url总是相同的,不pipe什么地址点是input…
不过,您应该尝试使用JSON或XML结果,因为这是我所说的最佳做法。

这个答案可能有点晚,但对于那些仍然在这里寻找使用Google Geocoding API的简单方法的人来说,我写了一个名为Guigle API的简单块 ,它可以这样使用:

 GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY"; AddressResponse result = await GoogleGeocodingAPI.SearchAddressAsync("100 Market St, Southbank"); 

要么

 var result = await GoogleGeocodingAPI.GetCityFromCoordinatesAsync(11.1111, 22.2222); var city = result.Item1; var country = result.Item3; 
  • 我喜欢的一件事是从API响应中获得完整的对象,因此您可以轻松访问所有内容,并且可以使用Linq和其他集合帮助器轻松地从中获取数据。 例如地址,你有这些types和更多:

     public class AddressResponse { public List<Address> Results { get; set; } public string Status { get; set; } } 
     public class Address { public List<AddressComponent> AddressComponents { get; set; } public string FormattedAddress { get; set; } public Geometry Geometry { get; set; } public string PlaceId { get; set; } public List<string> Types { get; set; } } 

所以你可以做这样的事情:

 (...) var state = addressComponentes.FirstOrDefault(r => r.Types.Contains(AddressType.administrative_area_level_1.ToString()))?.ShortName; 
  • 它也可以用于Google Places API查询。
  • 所有的方法都有一个重载的选项,如果你要打多个电话,你可以传递你自己的HttpClient,所以你可以自己打开/closures它。
  • 对不起,它尚未完全实施/testing,但对于这些基本的search,它是完全正常工作。

该方法易于使用,并有详细的说明摘要。

您可以使用nuget命令Install-Package Easyforce.GuigleAPI进行安装

如果你只是想要源代码的项目是可用的GitHub 。 随时为您的贡献做一个PR =)

这可能不是很多,但是我只是想在@Chris Johnson代码中做一个改进,如果你只想获得双重forms的lat和lng值,那么chris johnson的var lng具有这个格式<lat>的值。 ..数字… </ lat>

所以如果你传递的值是一个string来获得数值,你必须这样做

  double latitude = Double.Pars(lat.Value) double longitude = Double.Pars(lng.Value) 

这是一个古老的问题。 但我今天有同样的问题,并提出了这个解决scheme: https : //github.com/chadly/Geocoding.net

 IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "this-is-my-optional-google-api-key" }; IEnumerable<Address> addresses = await geocoder.GeocodeAsync("1600 pennsylvania ave washington dc"); Console.WriteLine("Formatted: " + addresses.First().FormattedAddress); //Formatted: 1600 Pennsylvania Ave SE, Washington, DC 20003, USA Console.WriteLine("Coordinates: " + addresses.First().Coordinates.Latitude + ", " + addresses.First().Coordinates.Longitude); //Coordinates: 38.8791981, -76.9818437 

这里是相应的nuget:

安装包地理编码.Google